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 FFLURS
alles nur lateinische Zeichen, so ist die Ausgabe FFLURS is 100% Latin, 0% Cyrillic and 0% Greek
.
Wird dagegen TOX BEAM PHP
komplett 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% Latin
als Antwort geben.
Eingabeformat
Jede Zeichenfolge enthält ausschließlich А-Я
, Α-Ω
, A-Z
und (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
quelle
Antworten:
Jelly , 56 Bytes
Ein Hash kann durchaus kürzer sein.
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
C
befindet1 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 nurS÷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
0
für das Leerzeichen und die lateinischen Zeichen (zählen als Englisch),1
für Hellenisch (zählen als Griechisch) und2
für Kyrillisch (zählen als Russisch). Dies ist nurO:⁹:2
in 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 werdenO:⁹: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):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:⁹:2
bedeutet 934 // 256 // 2 =) 1 Identifizierung als Teil des hellenischen Blocks. Das;O
verkettet die Ordnungszahl, die uns gibt,[1,934]
und dasN
negiert dann beide Werte, die uns geben[-1,-934]
. Da die Jelly-Indizierung sowohl 1-basiert als auch modular ist und drei Zeilen vorhanden sind,-1
bezieht sich die Referenz auf die zweite der drei Zeilen (Zeile 2 im obigen Codeblock), da die mittlere Zeile eine Länge von 25 hat,-934
bezieht sich die Referenz auf die (-934% 25 =) 16 - ten Eintrag in dieser Reihe, die ist2
. Der Code addiert dann vier (das höchstwertige Bit) und gibt uns,6
was 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
quelle
(keys)iị(values)Ʋ
?...ị“...
oder möglicherweise...ṃ“...
(genau genommen ist die Monadenkette, die ich gebildet habe, eine Hash-Funktion )JavaScript (ES6),
197179 BytesGibt ein Array mit 3 Verhältnissen in [0..1] zurück.
Probieren Sie es online!
Wie?
Wir verwenden die (ziemlich ineffiziente) Hash-Funktion,
% 202 % 116 % 89
um 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: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] (%
bisc
) mit 6 Bits Nutzdaten pro Zeichen.Dies führt zu folgender Zeichenfolge:
Der Versatz wurde gewählt, um Zeichen zu vermeiden
\
, für die ein Escape-Befehl erforderlich gewesen wäre.quelle
Ruby , 165 Bytes
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
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).quelle
Retina 0.8.2 , 230 Bytes
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.
quelle