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 FFLURS
wszystkie znaki tylko łacińskie, więc wynik jest następujący FFLURS is 100% Latin, 0% Cyrillic and 0% Greek
.
Natomiast TOX BEAM PHP
skł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% Latin
odpowiedź.
Format wejściowy
Dowolny ciąg znaków zawierający wyłącznie А-Я
, Α-Ω
, A-Z
oraz (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
źródło
Odpowiedzi:
Galaretka , 56 bajtów
Hash może być krótszy.
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
C
jest1 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 prostuS÷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
0
dla spacji i znaków łacińskich (liczonych jako angielski),1
dla języka greckiego (liczony jako grecki) i2
cyrylicy (liczony jako rosyjski). To jest po prostuO:⁹:2
w 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):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:⁹:2
oznacza 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,-1
odniesienia do drugiego z trzech wierszy (wiersz 2 w powyższym bloku kodu), ponieważ środkowy rząd ma długość 25-934
odniesień do (-934% = 25) 16 p pozycji w tym rzędzie, który jest2
. Następnie kod dodaje cztery (najbardziej znaczący bit), co daje nam6
konwersję 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
źródło
(keys)iị(values)Ʋ
?...ị“...
lub prawdopodobnie...ṃ“...
(ściśle mówiąc, monadyczny łańcuch, który utworzyłem, jest funkcją skrótu )JavaScript (ES6),
197179 bajtówZwraca tablicę 3 współczynników w [0..1].
Wypróbuj online!
W jaki sposób?
Używamy (raczej nieefektywnej) funkcji skrótu,
% 202 % 116 % 89
aby 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:Dołączamy dodatkową,
1
aby 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:
Przesunięcie zostało wybrane, aby uniknąć takich znaków
\
, które wymagałyby ucieczki.źródło
Rubinowy , 165 bajtów
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
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).źródło
Retina 0.8.2 , 230 bajtów
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.
źródło