Personaggi alfabetici


17

sfondo

Ho visto questo diagramma di Venn molto interessante su wikipedia: https://simple.wikipedia.org/wiki/Alphabet#/media/File:Venn_diagram_gr_la_ru.svg

Mostra le lettere (forme fisiche) in diversi alfabeti comuni tra alfabeti russi, greci e latini.

La sfida

Data una stringa di input di caratteri da uno dei tre script mostrati (ovvero lettere maiuscole in greco, cirillico o latino), genera una percentuale della stringa che corrisponde a ciascuna lingua. Le lettere ripetute contano ogni volta.

Ad esempio, FFLURSsono tutti caratteri solo latini, quindi l'output èFFLURS is 100% Latin, 0% Cyrillic and 0% Greek .

Al contrario, TOX BEAM PHPè formato completamente da caratteri che appaiono in tutte e tre le lingue, quindi l'output èTOX BEAM PHP is 100% Cyrillic, 100% Greek and 100% Latin .

Tabelle di ricerca

Il diagramma di Venn è la fonte delle lettere seguenti:

Solo latino:

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

Latino e cirillico:

C, С

Latino e greco:

I,Ι, N,Ν, Z,Ζ

Greco e cirillico

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

Tutti e tre:

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

Il resto ... è solo greco o solo cirillico.

NOTA IMPORTANTE

Unicode definisce (ad esempio) "A" in (almeno) tre modi separati - uno per ogni lingua. Qualunque sia usato nell'input (& # 0391, & # 0410 o & # 0041), il programma dovrebbe capirlo come corrispondente a tutte e tre le lingue. Quindi, A(latino), Α(alfa greca) e А(cirillico) dovrebbero dare 100% Cyrillic, 100% Greek and 100% Latincome risposta.

Formato di input

Qualsiasi stringa contenente esclusivamente А-Я, Α-Ω, A-Ze (spazio). Questi caratteri possono essere ripetuti più volte all'interno della stringa.

Formato di output

L'output può essere in qualsiasi formato, a condizione che la funzione produca risultati coerenti. Mi piacerebbe vedere l'uscita del mostro formato miei esempi (FFLURS is 100% Latin, 0% Cyrillic and 0% Greek ), ma al fine di rendere la sfida più aperta a tutti coloro che sono felice di accettare array / stringhe di percentuali / rapporti:

[100,0,0],

100 0 0

[1.0 0.0 0.0]

purché sia ​​sempre chiaro quale numero è la lingua, quindi l'output dovrebbe essere coerente.

Alcuni altri casi di test

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

Criteri vincenti

Si applicano le normali regole ed esclusioni; vince la risposta più breve (byte).

(collegamento sandbox: https://codegolf.meta.stackexchange.com/a/14984/62289 )

A scanso di equivoci, gli unici caratteri Unicode validi nell'input sono:

  • 0020, 0041-005A (alfabeto latino)
  • 0020, 0391-03A9 (alfabeto greco)
  • 0020, 0401, 0410-042F (alfabeto cirillico)

Ma come mostrato nelle tabelle di ricerca, i caratteri possono essere alfabetici incrociati.

Aggiungendo la tabella di Jonathan Allan dai commenti:

                                                 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
Benvenuti in PPCG! Questa è una bella prima sfida. :) Una nota sulla tua nota UTF-8: non è UTF-8 che definisce più versioni di questi caratteri ma Unicode (e UTF-8 è solo un modo specifico per codificare punti di codice Unicode). Inoltre, poiché questa parte è piuttosto importante per ottenere le risposte giuste, potresti voler includere l'elenco esplicito di tutti i caratteri Unicode che devono essere gestiti correttamente.
Martin Ender,

@ngn si, grazie.
simonalexander2005

@JonathanAllan, ngn: sono d'accordo, intendevo solo le lettere che sono nel diagramma di Venn - ma tutte le rappresentazioni di quelle lettere sono valide - come provo a dire nella domanda, ci sono più rappresentazioni unicode di "A", per esempio
simonalexander2005,

Il cirillico "El" è in realtà "Lambda" greco. Il cirillico "Pe" è il greco "Pi".
simonalexander2005,

@JonathanAllan A seconda del carattere, il cirillico Л può apparire esattamente come il greco Λ. La forma simile a Π è solo un'altra variante stilistica della stessa lettera.
ngn,

Risposte:


4

Gelatina , 56 byte

Un hash potrebbe essere più breve.

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

Un collegamento monadico che restituisce un elenco di importi del rapporto nell'ordine inglese, greco, russo.

Provalo online!
... o visualizza un output completamente formattato (incluso l'arrotondamento implicito al primo decimale)

Come?

Desideriamo avere un codice che traduca ogni possibile carattere in un triplo di uno e zeri che rappresentano se appartengono a ciascuno degli alfabeti (proprio come la tabella nella domanda dove si Ctrova 1 0 1). Una volta fatto ciò, possiamo sommarli e dividerli per la lunghezza per produrre i rapporti (tra zero e uno compreso) - questo è giusto S÷L(visto a destra del codice).

Per ogni dato personaggio Sappiamo che se l'ordinale è inferiore a 256, conta come inglese, se è maggiore di 1024, conta come russo, e se è compreso tra 256 e 1024, conta come greco. Come tale prendendo l'ordinale e l'intero dividendo per 256 e poi intero dividendo il risultato per due rese 0per lo spazio e i caratteri latini (conta come inglese), 1per ellenico (conta come greco) e 2per cirillico (conta come russo). Questo è solo O:⁹:2in Jelly (visto a sinistra del codice).

Se ruotiamo le triple di bit in modo tale che il bit dell'alfabeto naturale * sia il più significativo, allora possiamo codificare i due bit inferiori (come valori compresi tra zero e tre inclusi) in una tabella di ricerca con tre righe e quindi ruotare a destra numeri trovati sopra.

Quando lo facciamo, ci sono due cose degne di nota: 1. La gelatina ha un atomo di rotazione-a sinistra non uno di rotazione a destra; 2. la riga ellenica della tabella di consultazione inizierebbe con uno zero (poiché Ξè solo greco), contrastando una semplice codifica base-4 (poiché gli zeri iniziali non sono codificabili). Per alleviare (1) possiamo ruotare a sinistra del valore negato e per alleviare (2) possiamo codificare le nostre righe al contrario e indicizzarle con un valore negativo. In questo modo possiamo negare sia l'indice di riga che di colonna con un singolo byte ( N) in modo tale che i nostri indici di riga e colonna possano essere calcolati con O:⁹:2;ON.

Si noti che gelatina ha ora un atomo indicizzazione multidimensionale œị.

La tabella è formata da tre grandi numeri che, una volta convertiti in base quattro, forniscono rispettivamente i bit inferiori richiesti per cirillico, greco e latino (+ spazio). Hanno una lunghezza minima tale che è possibile l'indicizzazione modulare in base ai valori ordinali negati - rispettivamente 47, 25 e 30 (le .s sono su indici inutilizzati):

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

Ad esempio, considera il carattere Φ nel punto Unicode U + 03A6 (che dovrebbe produrre [0,1,1]) ha un valore ordinale di (3 × 16² + 10 × 16 + 6 =) 934. ( O:⁹:2significa 934 // 256 // 2 =) 1 identificandolo come parte del blocco ellenico. Il ;Oconcatena l'ordinale dandoci [1,934]e Npoi nega entrambi i valori dandoci [-1,-934]. Poiché l'indicizzazione Jelly è sia a base 1 che modulare e ci sono tre righe i -1riferimenti la seconda delle tre righe (riga 2 nel blocco di codice sopra), poiché la riga centrale ha una lunghezza di 25 i -934riferimenti il ​​(-934% 25 =) 16a voce in quella riga, ovvero 2. Il codice quindi aggiunge quattro (il bit più significativo) dandoci 6quale è convertito in binario[1,1,0]. Il codice quindi ruota questo a sinistra di ciascuno di [-1,-934]e prende la testa (cioè la rotazione a sinistra di -1, una rotazione a destra di 1) cedendo [0,1,1]come richiesto.

* Inglese per lo spazio poiché è raggruppato con i caratteri latini


Codice commentato

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

Sembra che tu abbia un po 'di terminologia lì ... "hash" significa un costrutto simile (keys)iị(values)Ʋ?
Erik the Outgolfer

Intendo formare un insieme distinto di chiavi da qualche manipolazione matematica in modo da poter indicizzare in un elenco di valori, sì. Così ...ị“...o forse ...ṃ“...(a rigor di termini la catena monadica che ho formato è una funzione hash )
Jonathan Allan

@ngn M kebard sta annando
Jonathan Allan il

Oh, so come risolverlo! Riconfigura la tastiera e digita in cirillico "у" e "о" invece di "y" e "o": D
ngn

Non ho mai visto una risposta Jelly così lunga ... ottimo lavoro!
simonalexander2005

5

JavaScript (ES6), 197 179 byte

Restituisce un array di 3 rapporti in [0..1].

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]

Provalo online!

Come?

Usiamo la funzione hash (piuttosto inefficiente) % 202 % 116 % 89per trasformare ogni codice carattere in un indice in [0..88]. La tabella di ricerca corrispondente è composta da voci a 3 bit in cui bit # 2 = latino, bit # 1 = greco e bit # 0 = cirillico. Usando le cifre decimali, questo dà:

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

Aggiungiamo un extra 1per ottenere un numero pari di voci e codificare questo flusso di bit con caratteri ASCII stampabili nell'intervallo [37..99] ( %a c), con 6 bit di dati di payload per carattere.

Questo porta alla seguente stringa:

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

L'offset è stato scelto per evitare caratteri come quelli \che avrebbero richiesto la fuga.


3

Rubino , 165 byte

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

Provalo online!

Modifica: golfato in modo significativo il codice e, soprattutto, compresso 3 sequenze di traduzione in una stringa UTF-8. Il codice originale più lungo viene conservato di seguito per una migliore leggibilità e spiegazione della logica.

Rubino, 211 byte

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

Provalo online!

Potrebbe non essere l'approccio più efficiente, ma fa il lavoro. Utilizza una tabella di traduzione per ogni alfabeto con occorrenza dei caratteri in diversi script codificati dai bit del numero (nell'ordine: latino, greco, russo). L'output è una matrice di percentuali nello stesso ordine.

Per correggere il Ёcaso anomalo ho esteso il blocco di soli 4 secondi in russo da 10 posizioni alla fine dell'alfabeto a 15. In questo modo, Ёviene selezionato correttamente con indice negativo (e non siamo tenuti a gestire lettere minuscole che corrispondono a questi indici extra).


1

Retina 0.8.2 , 230 byte

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

Provalo online! Il link include casi di test. Nota: l'output è in% troncato fino a un numero intero, poiché l'aumento della precisione ha reso lo script troppo lento e si è verificato un timeout su TIO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.