Znaki krzyżowe

17

tło

Widziałem ten bardzo interesujący diagram Venna na wikipedii: https://simple.wikipedia.org/wiki/Alphabet#/media/File:Venn_diagram_gr_la_ru.svg

Pokazuje litery (kształty fizyczne) w różnych alfabetach, które są wspólne dla alfabetu rosyjskiego, greckiego i łacińskiego.

Wyzwanie

Biorąc pod uwagę ciąg znaków z dowolnego z trzech pokazanych skryptów (tj. Wielkie litery greckie, cyrylicy lub łacińskie), wypisz procent pasującego łańcucha dla każdego języka. Powtarzające się litery liczą się za każdym razem.

Na przykład FFLURSwszystkie znaki tylko łacińskie, więc wynik jest następujący FFLURS is 100% Latin, 0% Cyrillic and 0% Greek.

Natomiast TOX BEAM PHPskłada się całkowicie ze znaków pojawiających się we wszystkich trzech językach, więc wynik jest TOX BEAM PHP is 100% Cyrillic, 100% Greek and 100% Latin.

Tabele wyszukiwania

Schemat Venna jest źródłem poniższych liter:

Tylko łaciński:

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

Łaciński i cyrylica:

C, С

Łaciński i grecki:

I,Ι, N,Ν, Z,Ζ

Grecki i cyrylica

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

Wszystkie trzy:

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

Reszta ... są tylko w języku greckim lub cyrylicy.

WAŻNA UWAGA

Unicode definiuje (na przykład) „A” na (co najmniej) trzy różne sposoby - po jednym dla każdego języka. Bez względu na to, co zostanie użyte w danych wejściowych (& # 0391, & # 0410 lub & # 0041), program powinien zrozumieć, że pasuje do wszystkich trzech języków. Tak więc, A(łacina), Α(grecka alfa) i А(cyrylica) powinny dać 100% Cyrillic, 100% Greek and 100% Latinodpowiedź.

Format wejściowy

Dowolny ciąg znaków zawierający wyłącznie А-Я, Α-Ω, A-Zoraz (spacja). Znaki te można powtarzać wiele razy w ciągu.

Format wyjściowy

Dane wyjściowe mogą być w dowolnym formacie, pod warunkiem, że funkcja daje spójne wyniki. Ja lubię widzieć wyjście w formacie mi pokazać w moich przykładach ( FFLURS is 100% Latin, 0% Cyrillic and 0% Greek), ale w celu uczynienia bardziej otwarte wyzwanie każdemu, jestem szczęśliwy, aby zaakceptować baterii / ciągi procentowe / wskaźników:

[100,0,0],

100 0 0

[1.0 0.0 0.0]

pod warunkiem, że zawsze jest jasne, który numer jest którym językiem - więc wynik powinien być spójny.

Więcej przypadków testowych

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

Zwycięskie kryteria

Obowiązują zwykłe zasady i wyłączenia; najkrótsza odpowiedź (bajty) wygrywa.

(link do piaskownicy: https://codegolf.meta.stackexchange.com/a/14984/62289 )

Aby uniknąć wątpliwości, jedynymi poprawnymi znakami wejściowymi Unicode są:

  • 0020, 0041-005A (alfabet łaciński)
  • 0020, 0391–03A9 (alfabet grecki)
  • 0020, 0401, 0410-042F (alfabet cyrylicy)

Ale jak pokazano w tablicach przeglądowych, znaki mogą być alfabetyczne.

Dodawanie tabeli Jonathana Allana z komentarzy:

                                                 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
źródło
1
Witamy w PPCG! To miłe pierwsze wyzwanie. :) Uwaga na twojej notatce UTF-8: to nie UTF-8 definiuje wiele wersji tych znaków, ale Unicode (a UTF-8 to tylko jeden konkretny sposób kodowania punktów kodowych Unicode). Ponadto, ponieważ ta część jest raczej ważna, aby odpowiedzi były prawidłowe, warto dołączyć jawną listę wszystkich znaków Unicode, które muszą być obsługiwane poprawnie.
Martin Ender
@ngn tak, dzięki.
simonalexander2005
@JonathanAllan, ngn: Zgadzam się, zamierzyłem tylko litery, które są na diagramie Venna - ale wszystkie reprezentacje tych liter są prawidłowe - jak próbuję powiedzieć w pytaniu, istnieje wiele reprezentacji „A” w Unicode
simonalexander2005
Cyrylica „El” to tak naprawdę grecka „Lambda”. Cyrylica „Pe” to greckie „Pi”.
simonalexander2005
@JonathanAllan W zależności od czcionki cyrylica Л może wyglądać dokładnie jak grecki Λ. Kształt „Π” to kolejna odmiana stylistyczna tej samej litery.
ngn

Odpowiedzi:

4

Galaretka , 56 bajtów

Hash może być krótszy.

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

Monadyczny link zwracający listę kwot proporcji w kolejności: angielski, grecki, rosyjski.

Wypróbuj online!
... lub zobacz w pełni sformatowany wynik (w tym dorozumiane zaokrąglenie do jednego miejsca po przecinku)

W jaki sposób?

Chcemy mieć kod, który tłumaczy każdy możliwy znak na trzy jedynki i zera wskazujące, czy należą one do każdego z alfabetów (podobnie jak tabela w pytaniu gdzie Cjest 1 0 1). Gdy to zrobimy, możemy zsumować je i podzielić przez długość, aby uzyskać stosunki (od zera do jednego włącznie) - to jest po prostu S÷L(widoczne po prawej stronie kodu).

W przypadku każdego znaku Wiemy, że jeśli liczba porządkowa jest mniejsza niż 256, liczy się jako angielski, jeśli jest większa niż 1024, liczy się jako rosyjski, a jeśli jest między 256 a 1024, liczy się jako grecki. Jako taki, przyjmując liczbę porządkową i liczbę całkowitą dzielącą przez 256, a następnie liczbę całkowitą dzielącą wynik przez dwa zbiory 0dla spacji i znaków łacińskich (liczonych jako angielski), 1dla języka greckiego (liczony jako grecki) i 2cyrylicy (liczony jako rosyjski). To jest po prostu O:⁹:2w galarecie (widoczne po lewej stronie kodu).

Jeśli obrócimy trójki bitów w taki sposób, że bit naturalnego alfabetu * jest najbardziej znaczący, możemy zakodować dwa niższe bity (jako wartości od zera do trzech włącznie) w tabeli przeglądowej z trzema rzędami, a następnie obrócić w prawo o liczby znalezione powyżej.

Kiedy to robimy, warto zwrócić uwagę na dwie rzeczy: 1. Galaretka ma atom obracający się w lewo, a nie jeden obracający się w prawo; 2. Grecki wiersz tabeli przeglądowej zaczynałby się od zera (ponieważ Ξjest to tylko język grecki), udaremniając proste kodowanie base-4 (ponieważ zer wiodących nie można zakodować). Aby złagodzić (1), możemy obrócić w lewo o wartość zanegowaną, a w celu złagodzenia (2) możemy zakodować nasze wiersze w odwrotnej kolejności i zindeksować je z wartością ujemną. W ten sposób możemy zanegować zarówno indeks wierszy, jak i kolumn za pomocą jednego bajtu ( N), ponieważ nasze indeksy wierszy i kolumn można obliczyć za pomocą O:⁹:2;ON.

Zauważ, że ma teraz Jelly wielowymiarową indeksowania atomu œị.

Tabela składa się z trzech dużych liczb, które po przekonwertowaniu na cztery podstawowe dają niższe bity wymagane odpowiednio dla cyrylicy, greki i łaciny (+ spacja). Mają minimalną długość, dzięki czemu możliwe jest indeksowanie modułowe przez zanegowane wartości porządkowe - odpowiednio 47, 25 i 30 ( .s są przy nieużywanych indeksach):

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

Jako przykład rozważ znak Φ w punkcie Unicode U + 03A6 (który powinien dać [0,1,1]), ma on liczbę porządkową (3 × 16² + 10 × 16 + 6 =) 934. ( O:⁹:2oznacza 934 // 256 // 2 =) 1 identyfikując go jako część greckiego bloku. W ;OŁączy porządkowa dając nam [1,934]i tymN następnie neguje zarówno wartości dając nam [-1,-934]. Ponieważ indeksowanie galaretki jest zarówno oparte na 1, jak i modułowe i istnieją trzy wiersze, -1odniesienia do drugiego z trzech wierszy (wiersz 2 w powyższym bloku kodu), ponieważ środkowy rząd ma długość 25 -934odniesień do (-934% = 25) 16 p pozycji w tym rzędzie, który jest 2. Następnie kod dodaje cztery (najbardziej znaczący bit), co daje nam 6konwersję na binarną[1,1,0]. Kod następnie obraca to w lewo o każdy z nich [-1,-934]i przejmuje głowę (tj. Obrót w lewo o -1, obrót w prawo o 1), dając [0,1,1]w razie potrzeby.

* Angielski dla spacji, ponieważ jest zgrupowany ze znakami łacińskimi


Skomentowany kod

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
źródło
Wygląda na to, że masz tam trochę terminologii ... czy „hash” oznacza konstrukcję podobną do (keys)iị(values)Ʋ?
Erik the Outgolfer
Mam na myśli utworzenie odrębnego zestawu kluczy z niektórych matematycznych manipulacji, aby można było indeksować listę wartości, tak. Tak jak ...ị“...lub prawdopodobnie ...ṃ“...(ściśle mówiąc, monadyczny łańcuch, który utworzyłem, jest funkcją skrótu )
Jonathan Allan,
@ngn M kebard is anning
Jonathan Allan
Och, wiem jak to naprawić! Ponownie skonfiguruj klawiaturę i wpisz cyrylicę „у” i „о” zamiast „y” i „o”: D
ngn
Nigdy nie widziałem tak długiej galaretowej odpowiedzi ... świetna robota!
simonalexander2005
5

JavaScript (ES6), 197 179 bajtów

Zwraca tablicę 3 współczynników w [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]

Wypróbuj online!

W jaki sposób?

Używamy (raczej nieefektywnej) funkcji skrótu, % 202 % 116 % 89aby przekształcić każdy kod znaku w indeks w [0..88]. Odpowiednia tabela odnośników składa się z 3-bitowych pozycji, w których bit 2 = łaciński, bit 1 = grecki, a bit 0 - cyrylica. Używając cyfr dziesiętnych, daje to:

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

Dołączamy dodatkową, 1aby uzyskać en parzystą liczbę pozycji i kodujemy ten strumień bitów drukowalnymi znakami ASCII w zakresie [37..99] ( %doc ), z 6 bitami danych ładunku na znak.

Prowadzi to do następującego ciągu:

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

Przesunięcie zostało wybrane, aby uniknąć takich znaków \, które wymagałyby ucieczki.

Arnauld
źródło
3

Rubinowy , 165 bajtów

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

Wypróbuj online!

Edycja: Znacząco poprawił kod, a co najważniejsze, wycisnął 3 sekwencje translacji w jeden ciąg UTF-8. Oryginalny dłuższy kod znajduje się poniżej dla lepszej czytelności i wyjaśnienia logiki.

Rubinowy, 211 bajtów

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

Wypróbuj online!

Może nie być najbardziej efektywnym podejściem, ale spełnia swoje zadanie. Wykorzystuje tabelę tłumaczeń dla każdego alfabetu z występowaniem znaków w różnych skryptach zakodowanych bitami liczby (w kolejności: łaciński, grecki, rosyjski). Dane wyjściowe to tablica procentów w tej samej kolejności.

Aby naprawić Ёprzypadek odstający , rozszerzyłem blok 4- sekundowy tylko w języku rosyjskim z 10 pozycji na końcu alfabetu do 15. W ten sposób Ёzostanie poprawnie wybrany z indeksem ujemnym (i nie musimy obsługiwać małych liter, niż odpowiadają te dodatkowe wskaźniki).

Kirill L.
źródło
1

Retina 0.8.2 , 230 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Uwaga: Dane wyjściowe są zmniejszane w% do liczby całkowitej, ponieważ zwiększenie precyzji spowodowało, że skrypt był zbyt wolny i upłynął limit czasu dla TIO.

Neil
źródło