クロスアルファベット文字


17

バックグラウンド

ウィキペディアでこの非常に興味深いベン図を見ました:https ://simple.wikipedia.org/wiki/Alphabet#/media/File: Venn_diagram_gr_la_ru.svg

ロシア語、ギリシャ語、ラテン語のアルファベットに共通するさまざまなアルファベットの文字(物理的形状)を示しています。

チャレンジ

表示されている3つのスクリプトのいずれかからの入力文字列(大文字のギリシャ文字、キリル文字、またはラテン文字)を指定すると、各言語に一致する文字列の割合を出力します。繰り返される文字は毎回カウントされます。

たとえば、FFLURSはすべてラテン語のみの文字であるため、出力はFFLURS is 100% Latin, 0% Cyrillic and 0% Greekです。

対照的に、TOX BEAM PHPは3つの言語すべてに現れる文字で完全に形成されるため、出力は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,Ζ

ギリシャ語とキリル文字

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

3つすべて:

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

残り はギリシャ語のみまたはキリル文字のみです。

重要な注意点

Unicodeは、(少なくとも)3つの別々の方法(各言語に1つ)で「A」を定義します。入力で使用されるもの(&#0391、&#0410または&#0041)は、プログラムは3つの言語すべてに一致するものとして理解する必要があります。 したがって、A(ラテン語)、Α(ギリシャ語アルファ)、およびА(キリル文字)がすべて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コードポイントをエンコードする特定の方法の1つにすぎません)。また、この部分は回答を正しくするためにかなり重要なので、正しく処理する必要があるすべてのUnicode文字の明示的なリストを含めることもできます。
マーティンエンダー

@ngnはい、ありがとう。
-simonalexander2005

@ JonathanAllan、ngn:私は同意します、ベン図にある文字だけを意図していました-しかし、それらの文字のすべての表現は有効です-私が質問で言うように、「A」の複数のユニコード表現があります
-simonalexander2005

キリル文字「El」は、実際にはギリシャ語の「ラムダ」です。キリル文字「Pe」はギリシャ語の「Pi」です。
simonalexander2005

@JonathanAllanフォントによっては、キリル文字Лはギリシャ語のΛのように見えます。Πのような形は、同じ文字の別の文体的なバリエーションです。
ngn

回答:


4

ゼリー、56 バイト

ハッシュはもっと短いかもしれません。

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

比率のリストを英語、ギリシャ語、ロシア語の順に返す単項リンク。

オンラインでお試しください!
...または完全にフォーマットされた出力を参照してください(小数点以下1桁への暗黙の丸めを含む)

どうやって?

我々は、彼らが(多くの問題のテーブルのようなアルファベットのそれぞれに属しているかどうかを表すものと0のトリプルにそれぞれの可能な文字変換コードをご希望Cですが1 0 1)。それが完了したら、これらを合計し、長さで除算して比率(0と1を含む)を得ることができます-これはただですS÷L(コードの右側に表示されます)。

任意の文字について、序数が256未満の場合は英語としてカウントされ、1024を超える場合はロシア語としてカウントされ、256から1024の間の場合はギリシャ語としてカウントされることがわかっています。したがって、256で除算された整数と整数を取得し、次に0スペースとラテン文字(英語としてカウント)、1ヘレニック(ギリシャ語としてカウント)、および2キリル文字(ロシア語としてカウント)の結果を2つの整数で除算した整数を取得します。これはO:⁹:2Jellyにあります(コードの左側にあります)。

自然なアルファベットビット*が最も重要になるようにビットのトリプルを回転させると、3行のルックアップテーブルで下位2ビット(0から3までの値として)をエンコードし、上記の数字。

これを行う場合、注目に値する2つのことがあります。1。Jellyには、rotate-left-byアトムがあり、rotate-right-byアトムはありません。2.ルックアップテーブルのギリシャ行はゼロで始まり(Ξギリシャ語のみであるため)、単純なベース4エンコードを妨げます(先行ゼロはエンコードできないため)。(1)を軽減するために、負の値で左回転し、(2)を軽減するために、行を逆方向にエンコードし、負の量でそれらにインデックスを付けることができます。このように我々は、単一のバイト(と行と列のインデックスの両方を否定することができN、このような我々の行と列のインデックスを用いて計算することができるように)O:⁹:2;ON

Jellyには多次元のインデックスアトムがありœịます。

テーブルは3つの大きな数値で構成され、いったん4を基数に変換すると、それぞれキリル文字、ギリシャ文字、およびラテン文字(+スペース)に必要な下位ビットが得られます。これらは最小の長さであるため、負の順序値によるモジュラーインデックス付けが可能です-それぞれ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ベースでモジュール式であり、3行あります。3行の-12番目(上記のコードブロックの2行目)を-934参照します。中央の行の長さが25であるため(-934% 25 =)その行の16 番目のエントリ2。次に、コードは4(最上位ビット)を追加して、6どのバイナリに変換されるかを示します[1,1,0]。次に、コードはそれぞれを[-1,-934]左に回転し[0,1,1]、必要に応じてヘッドを取得します(つまり、左に-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)Ʋますか?
エリックアウトゴルファー

はい、値のリストにインデックスを付けることができるように、いくつかの数学的な操作から別個のキーのセットを形成することを意味します。そう、...ị“...またはおそらく...ṃ“...(厳密に言えば、私が形成したモナド連鎖はハッシュ関数です
ジョナサンアラン

@ngn M kebardはアニング
ジョナサンアラン

ああ、私はそれを修正する方法を知っています!D:キリル「у」、代わりに「Y」と「O」の「о」を再構成して、キーボードと入力
NGN

こんなに長いゼリーの答えを見たことがありません...素晴らしい仕事です!
-simonalexander2005

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]のインデックスに変換します。対応するルックアップテーブルは、ビット#2 =ラテン語、ビット#1 =ギリシャ語、ビット#0 =キリル文字の3ビットエントリで構成されます。10進数を使用すると、次のようになります。

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

1偶数のエントリを取得するためのエクストラを追加し、このビットストリームを[37..99](%to c)の範囲の印刷可能なASCII文字でエンコードし、1文字あたり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つの翻訳シーケンスを1つのUTF-8文字列に圧縮したことです。元の長いコードは、読みやすく、ロジックを説明するために以下に保持されます。

ルビー、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のブロックをアルファベットの最後の10 Ё桁から15 桁に拡張しました。これにより、負のインデックスで正しく選択されます(そして、これらの追加のインデックス)。


1

Retina 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でタイムアウトになるため、出力は整数に切り捨てられます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.