跨字母字符


17

背景

我在维基百科上看到了这个非常有趣的维恩图:https ://simple.wikipedia.org/wiki/Alphabet#/media/File: Venn_diagram_gr_la_ru.svg

它显示了俄语,希腊语和拉丁语字母之间常见的不同字母的字母(物理形状)。

挑战

给定显示的三个脚本中任何一个的输入字符串(即大写的希腊字母,西里尔字母或拉丁字母),请输出与每种语言匹配的字符串百分比。重复的字母每次都会计数。

例如,FFLURS所有字符都是拉丁字符,因此输出为FFLURS is 100% Latin, 0% Cyrillic and 0% Greek

相反,TOX BEAM PHP完全由所有三种语言中出现的字符组成,因此输出为TOX BEAM PHP is 100% Cyrillic, 100% Greek and 100% Latin

查找表

维恩图是以下字母的来源:

仅限拉丁文:

J,G,S,D,Q,U,V,W,F,L,R

拉丁文和西里尔文:

C, С

拉丁文和希腊文:

I,Ι, N,Ν, Z,Ζ

希腊文和西里尔文

Φ,Ф, Π,П, Γ,Г, Λ,Л

三个都:

A,B,E,O,M,K,T,X,Y,H,P (and equivalents in greek and cyrillic), (space)

其余的 ...仅希腊语或西里尔字母。

重要的提示

Unicode(至少)以三种不同的方式定义(例如)“ A”-一种针对每种语言。无论在输入中使用哪个(&#0391,&#0410或&#0041),程序都应将其理解为与所有三种语言都匹配。 因此,A(拉丁语),Α(希腊语Alpha)和А(西里尔字母)都应该给出100% Cyrillic, 100% Greek and 100% Latin答案。

输入格式

任何只含有串А-ЯΑ-ΩA-Z(空间)。这些字符可以在字符串中重复多次。

输出格式

如果函数产生一致的结果,则输出可以是任何格式。我喜欢看到我表现出我的例子(格式输出FFLURS is 100% Latin, 0% Cyrillic and 0% Greek),但为了让更多的挑战对任何人开放,我很高兴接受的百分比/比率的数组/字符串:

[100,0,0]

100 0 0

[1.0 0.0 0.0]

只要始终清楚哪个数字是哪种语言-因此输出应保持一致。

一些测试用例

CINEMATICS -> CINEMATICS is 100% Latin, 70% Greek and 60% Cyrillic

ЩJЩFЩLΞRΞVΞW -> ЩJЩFЩLΞRΞVΞW is 50% Latin, 25% Cyrillic and 25% Greek

-> is 100% Cyrillic, 100% Greek and 100% Latin

ΨΩTESTINGЯЮ -> ΨΩTESTINGЯЮ is 63.6% Greek, 63.6% Latin and 45.5% Cyrillic

获奖标准

通常的规则和排除适用;最短答案(字节)获胜。

(沙盒链接:https : //codegolf.meta.stackexchange.com/a/14984/62289

为避免疑问,输入中唯一有效的Unicode字符是:

  • 0020,0041-005A(拉丁字母)
  • 0020、0391-03A9(希腊字母)
  • 0020、0401、0410-042F(西里尔字母)

但是,如查询表所示,字符可能是跨字母的。

从评论中添加乔纳森·艾伦的表:

                                                 Latin  Greek  Cyrillic
U+0020     Space                                 1      1      1
U+0041  A  Latin capital letter A                1      1      1
U+0042  B  Latin capital letter B                1      1      1
U+0043  C  Latin capital letter C                1      0      1
U+0044  D  Latin capital letter D                1      0      0
U+0045  E  Latin capital letter E                1      1      1
U+0046  F  Latin capital letter F                1      0      0
U+0047  G  Latin capital letter G                1      0      0
U+0048  H  Latin capital letter H                1      1      1
U+0049  I  Latin capital letter I                1      1      0
U+004A  J  Latin capital letter J                1      0      0
U+004B  K  Latin capital letter K                1      1      1
U+004C  L  Latin capital letter L                1      0      0
U+004D  M  Latin capital letter M                1      1      1
U+004E  N  Latin capital letter N                1      1      0
U+004F  O  Latin capital letter O                1      1      1
U+0050  P  Latin capital letter P                1      1      1
U+0051  Q  Latin capital letter Q                1      0      0
U+0052  R  Latin capital letter R                1      0      0
U+0053  S  Latin capital letter S                1      0      0
U+0054  T  Latin capital letter T                1      1      1
U+0055  U  Latin capital letter U                1      0      0
U+0056  V  Latin capital letter V                1      0      0
U+0057  W  Latin capital letter W                1      0      0
U+0058  X  Latin capital letter X                1      1      1
U+0059  Y  Latin capital letter Y                1      1      1
U+005A  Z  Latin capital letter Z                1      1      0

U+0391  Α  Greek capital letter Alpha            1      1      1
U+0392  Β  Greek capital letter Beta             1      1      1
U+0393  Γ  Greek capital letter Gamma            0      1      1
U+0394  Δ  Greek capital letter Delta            0      1      0
U+0395  Ε  Greek capital letter Epsilon          1      1      1
U+0396  Ζ  Greek capital letter Zeta             1      1      0
U+0397  Η  Greek capital letter Eta              1      1      1
U+0398  Θ  Greek capital letter Theta            0      1      0
U+0399  Ι  Greek capital letter Iota             1      1      0
U+039A  Κ  Greek capital letter Kappa            1      1      1
U+039B  Λ  Greek capital letter Lambda           0      1      1
U+039C  Μ  Greek capital letter Mu               1      1      1
U+039D  Ν  Greek capital letter Nu               1      1      0
U+039E  Ξ  Greek capital letter Xi               0      1      0
U+039F  Ο  Greek capital letter Omicron          1      1      1
U+03A0  Π  Greek capital letter Pi               0      1      1
U+03A1  Ρ  Greek capital letter Rho              1      1      1

U+03A3  Σ  Greek capital letter Sigma            0      1      0
U+03A4  Τ  Greek capital letter Tau              1      1      1
U+03A5  Υ  Greek capital letter Upsilon          1      1      1
U+03A6  Φ  Greek capital letter Phi              0      1      1
U+03A7  Χ  Greek capital letter Chi              1      1      1
U+03A8  Ψ  Greek capital letter Psi              0      1      0
U+03A9  Ω  Greek capital letter Omega            0      1      0

U+0401  Ё  Cyrillic capital letter Io            0      0      1

U+0410  А  Cyrillic capital letter A             1      1      1
U+0411  Б  Cyrillic capital letter Be            0      0      1
U+0412  В  Cyrillic capital letter Ve            1      1      1
U+0413  Г  Cyrillic capital letter Ghe           0      1      1
U+0414  Д  Cyrillic capital letter De            0      0      1
U+0415  Е  Cyrillic capital letter Ie            1      1      1
U+0416  Ж  Cyrillic capital letter Zhe           0      0      1
U+0417  З  Cyrillic capital letter Ze            0      0      1
U+0418  И  Cyrillic capital letter I             0      0      1
U+0419  Й  Cyrillic capital letter Short I       0      0      1
U+041A  К  Cyrillic capital letter Ka            1      1      1
U+041B  Л  Cyrillic capital letter El            0      1      1
U+041C  М  Cyrillic capital letter Em            1      1      1
U+041D  Н  Cyrillic capital letter En            1      1      1
U+041E  О  Cyrillic capital letter O             1      1      1
U+041F  П  Cyrillic capital letter Pe            0      1      1
U+0420  Р  Cyrillic capital letter Er            1      1      1
U+0421  С  Cyrillic capital letter Es            1      0      1
U+0422  Т  Cyrillic capital letter Te            1      1      1
U+0423  У  Cyrillic capital letter U             1      1      1
U+0424  Ф  Cyrillic capital letter Ef            0      1      1
U+0425  Х  Cyrillic capital letter Ha            1      1      1
U+0426  Ц  Cyrillic capital letter Tse           0      0      1
U+0427  Ч  Cyrillic capital letter Che           0      0      1
U+0428  Ш  Cyrillic capital letter Sha           0      0      1
U+0429  Щ  Cyrillic capital letter Shcha         0      0      1
U+042A  Ъ  Cyrillic capital letter hard sign     0      0      1
U+042B  Ы  Cyrillic capital letter Yeru          0      0      1
U+042C  Ь  Cyrillic capital letter soft sign     0      0      1
U+042D  Э  Cyrillic capital letter E             0      0      1
U+042E  Ю  Cyrillic capital letter Yu            0      0      1
U+042F  Я  Cyrillic capital letter Ya            0      0      1

1
欢迎来到PPCG!这是一个不错的第一个挑战。:)关于UTF-8注释的注释:不是UTF-8定义了这些字符的多个版本,而是Unicode(而UTF-8只是编码Unicode代码点的一种特定方式)。另外,由于这部分对于正确答案很重要,因此您可能需要包括所有需要正确处理的Unicode字符的显式列表。
马丁·恩德

@ngn是的,谢谢。
simonalexander2005 '18

@ JonathanAllan,ngn:我同意,我只打算使用维恩图中的字母-但这些字母的所有表示形式都是有效的-就像我在问题中试图说的那样,例如,有多个Unicode表示形式的“ A”
simonalexander2005 '18

西里尔字母“ El”实际上是希腊语“ Lambda”。西里尔字母“ Pe”是希腊语“ Pi”。
simonalexander2005 '18

@JonathanAllan取决于字体,西里尔字母Л看起来可能与希腊语Λ完全一样。类似shape的形状只是同一字母的另一种风格变化。
ngn

Answers:


4

果冻,56 字节

散列可能会更短。

O:⁹:2;ON©œị“ŒḂI4ƥƒⱮıtɱN¦“¤COṙṚ¹`“ÑṂḄẈɼ]ġÐ’b4¤+4Bṙ®Ḣµ€S÷L

单子链接按英语,希腊语,俄语的顺序返回比例金额列表。

在线尝试!
...或看到完全格式化的输出(包括隐式舍入到小数点后一位)

怎么样?

我们希望有代码转换每个可能的字符三一和表示它们是否属于每个字母(很像在这个问题表的零点C1 0 1)。完成后,我们可以将它们相加并除以长度以得出比率(介于零与一之间)S÷L(正好在代码的右侧)。

对于任何给定字符,我们都知道,如果序数小于256,则视为英语;如果序数大于1024,则视为俄语;如果介于256和1024之间,则视为希腊语。因此,将序数和整数除以256,然后将结果除以整数两次,分别得到0空格和拉丁字符(算作英语),1希腊语(算作希腊语)和2西里尔字母(算作俄语)的两个结果。这只是O:⁹:2在Jelly中(在代码左侧看到)。

如果我们旋转三元组以使自然字母bit *最高,那么我们可以在具有三行的查找表中对较低的两位进行编码(即介于零和三之间的值),然后向右旋转上面找到的数字。

当我们执行此操作时,有两点值得注意:1.果冻具有一个向左旋转的原子而不是一个向右旋转的原子;2.查找表的希腊行将从零开始(因为Ξ仅是希腊文),从而阻止了简单的base-4编码(因为前导零不可编码)。要缓解(1),我们可以向左旋转负值,而缓解(2),我们可以对行进行反向编码,并以负数索引到它们中。这样,我们可以用一个字节(N)否定行索引和列索引,因为行索引和列索引可以用来计算O:⁹:2;ON

请注意,Jelly现在具有一个多维索引原子œị

该表由三个大数字组成,一旦转换为基数为4,将分别给出西里尔字母,希腊字母和拉丁(+ Space)所需的低位。它们的长度最小,因此可以通过负序值进行模块化索引-分别.为47、25 和30(s为未使用的索引):

1: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 3 3 2 3 1 3 3 3 1 3 0 0 0 0 3 0 1 3 0 3 0 0 0 0 0 0
   . . . . . . . . . Я Ю Э Ь Ы Ъ Щ Ш Ч Ц Х Ф У Т С Р П О Н М Л К Й И З Ж Е Д Г В Б А Ё . . . . .

2: 3 2 3 1 0 3 1 3 0 2 3 3 0 0 3 2 3 3 0 0 3 2 3 0 1
   Μ Λ Κ Ι Θ Η Ζ Ε Δ Γ Β Α Ω Ψ Χ Φ Υ Τ Σ . Ρ Π Ο Ξ Ν

3: 3 3 0 0 0 3 0 0 0 3 3 2 3 0 3 0 2 3 0 0 3 0 1 3 3 0 0 3 0 2
   Y X W V U T S R Q P O N M L K J I H G F E D C B A . .   . Z

例如,考虑在Unicode点U + 03A6(应产生[0,1,1])处的字符Φ,其序数值为(3×16²+ 10×16 + 6 =)934。(O:⁹:2意味着934 // 256 // 2 =)1将其标识为希腊语块的一部分。将;O序数赋予我们[1,934]N然后否定两种赋予我们的价值[-1,-934]。由于Jelly索引既是基于1的又是模块化的,并且有三行-1引用了三行中的第二行(上述代码块中的行2),因为中间行的长度为25,因此-934引用为(-934% 25 =)该行的 16 条目,即2。然后,代码添加了四个(最高有效位)给我们6转换为二进制的[1,1,0]。然后,代码将此代码向左旋转每个,[-1,-934]并根据需要让头(即,向左旋转-1,向右旋转1)屈服[0,1,1]

*空间英文,因为它与拉丁字符分组


注释代码

O:⁹:2;ON©œị“...“...“...’b4¤+4Bṙ®Ḣµ€S÷L - Link: list of characters        e.g.: "СЯ"
                                 µ€    - for €ach character:                С       Я
O                                      -   cast to ordinal               1057    1071
  ⁹                                    -   literal 256
 :                                     -   integer division                 4       4
   :2                                  -   integer divide by 2              2       2
      O                                -   cast to ordinal               1057    1071
     ;                                 -   concatenate                  [2,1057] [2,1071]
       N                               -   negate                     [-2,-1057] [-2,-1071]
        ©                              -   copy to register for later
                          ¤            -   nilad followed by link(s) as a nilad:
           “...“...“...’               -     list of integers encoded in base 250 = [4951760157204492290900832256, 1043285073970097, 1081712651052809266]
                        b4             -     convert to base 4                    = [[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,3,3,2,3,1,3,3,3,1,3,0,0,0,0,3,0,1,3,0,3,0,0,0,0,0,0],[3,2,3,1,0,3,1,3,0,2,3,3,0,0,3,2,3,3,0,0,3,2,3,0,1],[3,3,0,0,0,3,0,0,0,3,3,2,3,0,3,0,2,3,0,0,3,0,1,3,3,0,0,3,0,2]]
         œị                            -   index into                       2       0                   ^--[-2,-1071]   [-2,-1057]--^
                           +4          -   add four                         6       4
                             B         -   convert to binary             [1,1,0] [1,0,0]
                               ®       -   recall from register       [-2,-1057] [-2,-1071]
                              ṙ        -   rotate left         [[1,0,1],[0,1,1]] [[0,0,1],[1,0,0]]
                                Ḣ      -   head                          [1,0,1] [0,0,1]
                                   S   - sum                                 [1,0,2]
                                     L - length                                 2
                                    ÷  - divide                            [0.5,0,1]
                                       -   i.e.: 50.0% Latin, 0% Greek, 100% Russian

看起来您那里有一些术语...“哈希”是否表示类似的构造(keys)iị(values)Ʋ
暴民埃里克(Erik the Outgolfer)

我的意思是通过某种数学操作形成一组独特的键,以便可以索引到值列表中,是的。因此,就像...ị“...或者可能...ṃ“...(严格地说,我形成的单子链是一个哈希函数
Jonathan Allan

@ngn M kebard正在安宁
乔纳森·艾伦

哦,我知道该如何解决!重新配置键盘,然后输入西里尔字母“у”和“о”而不是“ y”和“ o”:D
ngn

我从来没有见过这么长的果冻答案……干得好!
simonalexander2005 '18

5

的JavaScript(ES6),197个 179字节

返回[0..1]中3个比率的数组。

s=>[...s].map(_=>(x='b;C6cC6%c>b^[<$]_3--_c_acC-----$+aKHbKK[`H`H]'[(p=s[a='charCodeAt'](l++)%202%116%89)>>1][a]()-36,x/=p&1||8,L+=x/4&1,G+=x/2&1,C+=x&1),l=L=G=C=0)&&[L/l,G/l,C/l]

在线尝试!

怎么样?

我们使用(效率较低)哈希函数% 202 % 116 % 89将每个字符代码转换为[0..88]中的索引。相应的查找表由3位条目组成,其中位#2 =拉丁语,位#1 =希腊语,位#0 =西里尔字母。使用十进制数字,可以得出:

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

我们附加了一个附加项1以获取偶数个条目,并使用[37..99](%to c)范围内的可打印ASCII字符对此位流进行编码,每个字符6位有效载荷数据。

这将导致以下字符串:

b;C6cC6%c>b^[<$]_3--_c_acC-----$+aKHbKK[`H`H]

选择偏移量是为了避免\出现需要转义的字符。


3

红宝石,165字节

->s{(0..2).map{|x|s.chars.map{|c|o=c.ord;(o<33?7:"ĝ]ē¯]÷W59WUė½ñĝĕ×ßoĝėÏė55#{?!*15}"[o-[913,1040,65][y=o>>7<=>7]].ord+226>>3*-~y)[x]*1.0}.sum/s.size}}

在线尝试!

编辑:显着打好代码,最重要的是,将3个翻译序列压缩为一个UTF-8字符串。原始的较长代码保留在下面,以提高可读性和逻辑解释。

Ruby,211字节

->s{(0..2).map{|x|s.chars.map{|x|o=x.ord;o<33?7:o<91?"77517117317173771117111773"[o-65]:o<938?"7762737237673276702776722"[o-913]:"74764744444767776757767#{?4*15}"[o-1040]}.inject(0.0){|y,z|y+=z.to_i[x]}/s.size}}

在线尝试!

可能不是最有效的方法,但可以做到。对每个字母使用一个转换表,该字母在不同的脚本中以数字的位(按顺序:拉丁,希腊,俄语)编码,出现字符。输出是百分比顺序相同的数组。

为了解决异常Ё情况,我将仅俄语的4 s块从字母表末尾的10个位置扩展到了15个。这样,Ё可以正确地使用负索引进行拾取(并且我们不需要处理小写字母,而不是对应于这些额外的索引)。


1

视网膜0.8.2,230字节

.+
$&¶$&¶$&¶$&
T`ΓΔΘΛΞΠΣΦΨΩЁБГДЖ-ЙЛПФЦ-Я`_`.+(?=¶.+¶.+$)
T`CDFGJ\LQRSUVWЁБДЖ-ЙС-Я`_`.+(?=¶.+$)
T`DFGIJ\LNQRSUVWZΔΖΘΙΝΞΣΨΩ`_`.+$
¶(.*)
¶$.1$*
1
100$*
.
1
(1+)¶(\1)*1*¶(\1)*1*¶(\1)*1*
$#2 $#3 $#4

在线尝试!链接包括测试用例。注意:输出以%的形式被截断为整数,因为提高精度会使脚本变得太慢,并且在TIO上超时。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.