Alphabetische Zeichen

17

Hintergrund

Ich habe dieses sehr interessante Venn-Diagramm auf Wikipedia gesehen: https://simple.wikipedia.org/wiki/Alphabet#/media/File:Venn_diagram_gr_la_ru.svg

Es zeigt die Buchstaben (physische Formen) in verschiedenen Alphabeten, die in russischen, griechischen und lateinischen Alphabeten vorkommen.

Die Herausforderung

Geben Sie einen Prozentsatz der Zeichenfolge aus, die zu jeder Sprache passt, wenn Sie eine Zeichenfolge aus einem der drei angezeigten Skripte (dh griechische, kyrillische oder lateinische Großbuchstaben) eingeben. Wiederholte Buchstaben zählen jedes Mal.

Ist zum Beispiel FFLURSalles nur lateinische Zeichen, so ist die Ausgabe FFLURS is 100% Latin, 0% Cyrillic and 0% Greek.

Wird dagegen TOX BEAM PHPkomplett aus Zeichen gebildet, die in allen drei Sprachen vorkommen, so erfolgt die Ausgabe TOX BEAM PHP is 100% Cyrillic, 100% Greek and 100% Latin.

Nachschlagetabellen

Das Venn-Diagramm ist die Quelle der folgenden Buchstaben:

Nur lateinisch:

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

Latein und Kyrillisch:

C, С

Latein und Griechisch:

I,Ι, N,Ν, Z,Ζ

Griechisch und Kyrillisch

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

Alle drei:

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

Der Rest ... ist nur für Griechisch oder nur für Kyrillisch.

WICHTIGE NOTIZ

Unicode definiert (zum Beispiel) "A" auf (mindestens) drei verschiedene Arten - eine für jede Sprache. Unabhängig davon, was in der Eingabe verwendet wird (& # 0391, & # 0410 oder & # 0041), sollte das Programm verstehen, dass alle drei Sprachen übereinstimmen. Also, A(lateinisch), Α(griechisch Alpha) und А(kyrillisch) sollten alle 100% Cyrillic, 100% Greek and 100% Latinals Antwort geben.

Eingabeformat

Jede Zeichenfolge enthält ausschließlich А-Я, Α-Ω, A-Zund (Raum). Diese Zeichen können innerhalb der Zeichenfolge mehrmals wiederholt werden.

Ausgabeformat

Die Ausgabe kann in einem beliebigen Format erfolgen, sofern die Funktion konsistente Ergebnisse liefert. Ich würde gerne Ausgabe im Format sehen , die ich in meinen Beispielen zeigen ( FFLURS is 100% Latin, 0% Cyrillic and 0% Greek), aber um Ich bin die Herausforderung mehr offen für jeden glücklich zu machen Arrays / Strings Prozent / Verhältnisse zu akzeptieren:

[100,0,0],

100 0 0

[1.0 0.0 0.0]

solange immer klar ist, welche nummer welche sprache ist, sollte die ausgabe konsistent sein.

Noch ein paar Testfälle

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

Gewinnkriterien

Es gelten die üblichen Regeln und Ausschlüsse. kürzeste Antwort (Bytes) gewinnt.

(Sandbox-Link: https://codegolf.meta.stackexchange.com/a/14984/62289 )

Um Zweifel zu vermeiden, sind die einzigen in der Eingabe gültigen Unicode-Zeichen:

  • 0020, 0041-005A (lateinisches Alphabet)
  • 0020, 0391-03A9 (griechisches Alphabet)
  • 0020, 0401, 0410-042F (kyrillisches Alphabet)

Wie in den Nachschlagetabellen gezeigt, können die Zeichen jedoch auch kreuzalphabetisch sein.

Hinzufügen von Jonathan Allans Tabelle aus den Kommentaren:

                                                 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
simonalexander2005
quelle
1
Willkommen bei PPCG! Dies ist eine schöne erste Herausforderung. :) Ein Hinweis zu Ihrer UTF-8-Notiz: Es ist nicht UTF-8, das mehrere Versionen dieser Zeichen definiert, sondern Unicode (und UTF-8 ist nur eine spezielle Methode zum Codieren von Unicode-Codepunkten). Da dieser Teil für die Richtigkeit der Antworten sehr wichtig ist, möchten Sie möglicherweise die explizite Liste aller Unicode-Zeichen einfügen, die korrekt behandelt werden müssen.
Martin Ender
@ngn ja danke
Simonalexander2005
@JonathanAllan, ngn: Ich stimme zu, ich habe nur die Buchstaben im Venn-Diagramm vorgesehen - aber alle Darstellungen dieser Buchstaben sind gültig - wie ich in der Frage zu sagen versuche, gibt es zum Beispiel mehrere Unicode-Darstellungen von "A"
Simonalexander2005
Kyrillisch "El" ist eigentlich griechisch "Lambda". Kyrillisch "Pe" ist griechisch "Pi".
Simonalexander2005
@JonathanAllan Je nach Schriftart kann Kyrillisch Л genau wie Griechisch Λ aussehen. Die Π-ähnliche Form ist nur eine weitere stilistische Variante des gleichen Buchstabens.
ngn

Antworten:

4

Jelly , 56 Bytes

Ein Hash kann durchaus kürzer sein.

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

Ein monadischer Link, der eine Liste mit Verhältniswerten in der Reihenfolge Englisch, Griechisch, Russisch zurückgibt.

Probieren Sie es online!
... oder sehen Sie eine vollständig formatierte Ausgabe (einschließlich der implizierten Rundung auf eine Dezimalstelle)

Wie?

Wir wünschen uns einen Code, der jedes mögliche Zeichen in ein Dreifach von Einsen und Nullen umsetzt, um darzustellen, ob sie zu jedem der Alphabete gehören (ähnlich wie in der Tabelle in der Frage, wo es sich Cbefindet 1 0 1). Sobald dies erledigt ist, können wir über diese summieren und durch die Länge dividieren, um die Verhältnisse (zwischen null und eins einschließlich) zu erhalten - dies ist nur S÷L(rechts im Code zu sehen).

Für jedes gegebene Zeichen wissen wir, dass, wenn die Ordnungszahl kleiner als 256 ist, es als englisch zählt, wenn es größer als 1024 ist, es als russisch zählt, und dass, wenn es zwischen 256 und 1024 liegt, es als griechisch zählt. Nehmen wir also die Ordnungszahl und die Ganzzahl, dividieren wir sie durch 256 und dividieren wir das Ergebnis durch zwei Ausbeuten 0für das Leerzeichen und die lateinischen Zeichen (zählen als Englisch), 1für Hellenisch (zählen als Griechisch) und 2für Kyrillisch (zählen als Russisch). Dies ist nur O:⁹:2in Jelly (links vom Code zu sehen).

Wenn wir die Dreiergruppen von Bits so drehen, dass das natürliche Alphabetbit * die höchste Wertigkeit hat, können wir die unteren zwei Bits (als Werte zwischen null und einschließlich drei) in einer Nachschlagetabelle mit drei Zeilen codieren und dann rechts neben dem drehen Zahlen oben gefunden.

Wenn wir dies tun, gibt es zwei Dinge, die es wert sind, beachtet zu werden: 1. Jelly hat ein Atom, das sich nach links dreht, und kein Atom, das sich nach rechts dreht. 2. Die hellenische Zeile der Nachschlagetabelle würde mit einer Null beginnen (da Ξnur Griechisch ist), was eine einfache Base-4-Codierung vereitelt (da führende Nullen nicht codierbar sind). Um (1) zu verringern, können wir um den negierten Wert nach links drehen, und um (2) zu verringern, können wir unsere Zeilen in umgekehrter Reihenfolge codieren und sie mit dem negativen Betrag indizieren. Auf diese Weise können wir sowohl den Zeilen- als auch den Spaltenindex mit einem einzelnen Byte ( N) negieren, damit können unsere Zeilen- und Spaltenindizes berechnet werden O:⁹:2;ON.

Beachten Sie, dass Jelly jetzt ein mehrdimensionales Indexierungsatom hat œị.

Die Tabelle besteht aus drei großen Zahlen, die nach der Umwandlung in die Basis vier die unteren Bits ergeben, die für Kyrillisch, Griechisch und Lateinisch (+ Leerzeichen) erforderlich sind. Sie haben eine minimale Länge, sodass eine modulare Indizierung durch die negierten Ordnungswerte möglich ist - 47, 25 bzw. 30 (die .s sind bei nicht verwendeten Indizes):

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

Betrachten Sie als Beispiel das Zeichen Φ am Unicode-Punkt U + 03A6 (das ergeben sollte [0,1,1]) mit einem Ordnungswert von (3 × 16² + 10 × 16 + 6 =) 934. ( O:⁹:2bedeutet 934 // 256 // 2 =) 1 Identifizierung als Teil des hellenischen Blocks. Das ;Overkettet die Ordnungszahl, die uns gibt, [1,934]und das Nnegiert dann beide Werte, die uns geben [-1,-934]. Da die Jelly-Indizierung sowohl 1-basiert als auch modular ist und drei Zeilen vorhanden sind, -1bezieht sich die Referenz auf die zweite der drei Zeilen (Zeile 2 im obigen Codeblock), da die mittlere Zeile eine Länge von 25 hat, -934bezieht sich die Referenz auf die (-934% 25 =) 16 - ten Eintrag in dieser Reihe, die ist 2. Der Code addiert dann vier (das höchstwertige Bit) und gibt uns, 6was in binär umgewandelt wird[1,1,0]. Der Code dreht diesen dann jeweils nach links [-1,-934]und nimmt den Kopf (dh die Drehung nach links um -1, eine Drehung nach rechts um 1), was [0,1,1]nach Bedarf ergibt .

* Englisch für Leerzeichen, da es mit den lateinischen Zeichen gruppiert ist


Kommentierter Code

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
Jonathan Allan
quelle
Sieht so aus, als hätten Sie eine Terminologie ... Bedeutet "Hash" ein Konstrukt wie (keys)iị(values)Ʋ?
Erik der Outgolfer
Ich meine, aus einer mathematischen Manipulation einen eigenen Satz von Schlüsseln zu bilden, damit man in eine Liste von Werten indexieren kann, ja. So wie ...ị“...oder möglicherweise ...ṃ“...(genau genommen ist die Monadenkette, die ich gebildet habe, eine Hash-Funktion )
Jonathan Allan
@ngn M kebard ist Anning
Jonathan Allan
Oh, ich weiß, wie ich das beheben kann! Konfigurieren Sie Ihre Tastatur neu und geben Sie statt "y" und "o" kyrillisch "у" und "о" ein: D
ngn
Ich habe noch nie eine so lange Antwort von Jelly gesehen ... großartige Arbeit!
Simonalexander2005
5

JavaScript (ES6), 197 179 Bytes

Gibt ein Array mit 3 Verhältnissen in [0..1] zurück.

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]

Probieren Sie es online!

Wie?

Wir verwenden die (ziemlich ineffiziente) Hash-Funktion, % 202 % 116 % 89um jeden Zeichencode in einen Index in [0..88] umzuwandeln. Die entsprechende Nachschlagetabelle besteht aus 3-Bit-Einträgen, wobei Bit # 2 = Lateinisch, Bit # 1 = Griechisch und Bit # 0 = Kyrillisch ist. Unter Verwendung von Dezimalstellen ergibt dies:

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

Wir fügen ein Extra hinzu 1, um eine gerade Anzahl von Einträgen zu erhalten und codieren diesen Bitstrom mit druckbaren ASCII-Zeichen im Bereich [37..99] ( %bis c) mit 6 Bits Nutzdaten pro Zeichen.

Dies führt zu folgender Zeichenfolge:

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

Der Versatz wurde gewählt, um Zeichen zu vermeiden \, für die ein Escape-Befehl erforderlich gewesen wäre.

Arnauld
quelle
3

Ruby , 165 Bytes

->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}}

Probieren Sie es online!

Bearbeiten: Der Code wurde erheblich verbessert, und vor allem wurden 3 Übersetzungssequenzen in eine UTF-8-Zeichenfolge komprimiert. Der ursprüngliche längere Code wird unten zur besseren Lesbarkeit und Erläuterung der Logik aufbewahrt.

Ruby, 211 Bytes

->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}}

Probieren Sie es online!

Ist vielleicht nicht der effizienteste Ansatz, erledigt aber den Job. Verwendet eine Übersetzungstabelle für jedes Alphabet, wobei Zeichen in verschiedenen Skripten vorkommen, die durch die Bits der Zahl codiert sind (in der Reihenfolge Latein, Griechisch, Russisch). Die Ausgabe besteht aus einer Reihe von Prozentsätzen in derselben Reihenfolge.

Um den Ausreißer zu korrigieren, Ёhabe ich den Nur-Russisch-Block von 4-s von 10 Stellen am Ende des Alphabets auf 15 erweitert. Auf diese Weise Ёwird mit negativem Index richtig ausgewählt (und wir müssen keine Kleinbuchstaben behandeln, die dem entsprechen) diese zusätzlichen Indizes).

Kirill L.
quelle
1

Retina 0.8.2 , 230 Bytes

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

Probieren Sie es online!Link enthält Testfälle. Hinweis: Die Ausgabe wird in% auf eine Ganzzahl gekürzt, da das Skript durch Erhöhen der Genauigkeit zu langsam wurde und eine Zeitüberschreitung bei TIO auftrat.

Neil
quelle