Перехресні символи


17

Фон

Я побачив цю дуже цікаву Діаграму Венна у wikipedia: https://simple.wikipedia.org/wiki/Alphabet#/media/File:Venn_diagram_gr_la_ru.svg

Він показує літери (фізичні фігури) у різних алфавітах, які є загальними між російською, грецькою та латинською абетками.

Змагання

Враховуючи рядок введення символів із будь-якого із трьох показаних скриптів (тобто з великої літери грецькою, кириличною або латинською літерами), виведіть відсоток рядка, що відповідає кожній мові. Повторні букви рахуються щоразу.

Наприклад, FFLURSє всі символи, призначені лише для латинської мови, тому вихід є FFLURS is 100% Latin, 0% Cyrillic and 0% Greek.

Навпаки, TOX BEAM PHPскладається повністю з символів, які з'являються на всіх трьох мовах, тому вихід є TOX BEAM PHP is 100% Cyrillic, 100% Greek and 100% Latin.

Таблиці пошуку

Діаграма Венна є джерелом літер нижче:

Тільки латинська мова:

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

Латинська та кирилиця:

C, С

Латинська та грецька:

I,Ι, N,Ν, Z,Ζ

Грецька та кирилиця

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

Усі три:

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

Решта ... є лише грецькою чи кирилицею.

ВАЖЛИВА ПРИМІТКА

Unicode визначає (наприклад) "A" (принаймні) трьома окремими способами - один для кожної мови. Незалежно від введення даних (& # 0391, & # 0410 або & # 0041), програма повинна розуміти це як відповідність усіх трьох мов. Отже, A(латинська), Α(грецька альфа) таА (кирилиця) усі повинні дати 100% Cyrillic, 100% Greek and 100% Latinвідповідь.

Формат введення

Будь-яка рядок , що містить виключно А-Я, Α-Ω, A-Zі (пропуск). Ці символи можуть повторюватися кілька разів у рядку.

Формат виводу

Вихід може бути в будь-якому форматі, за умови, що функція дає стійкі результати. Я хотів би бачити вихід у форматі, який я показую у своїх прикладах ( FFLURS is 100% Latin, 0% Cyrillic and 0% Greek), але для того, щоб зробити виклик більш відкритим для будь-кого, я радий прийняти масиви / рядки відсотків / коефіцієнтів:

[100,0,0],

100 0 0

[1.0 0.0 0.0]

до тих пір, поки завжди зрозуміло, яке число є якою мовою - тому вихід повинен бути послідовним.

Ще кілька тестових випадків

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

Критерії виграшу

Звичайні правила та виключення; виграє найкоротша відповідь (байти).

(посилання на пісочницю: https://codegolf.meta.stackexchange.com/a/14984/62289 )

Щоб уникнути сумнівів, єдиними символами Unicode, дійсними для введення, є:

  • 0020, 0041-005A (латинський алфавіт)
  • 0020, 0391-03A9 (грецький алфавіт)
  • 0020, 0401, 0410-042F (кирилиця)

Але як показано в таблицях пошуку, символи можуть бути алфавітними.

Додавання таблиці коментарів Джонатана Аллана:

                                                 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
Ласкаво просимо до PPCG! Це хороший перший виклик. :) Примітка до вашої примітки UTF-8: не UTF-8 визначає кілька версій цих символів, а Unicode (а UTF-8 - лише один певний спосіб кодування точок коду Unicode). Крім того, оскільки ця частина є досить важливою, щоб відповіді були правильними, ви можете включити чіткий список усіх символів Unicode, з якими потрібно правильно поводитися.
Мартін Ендер

@ngn так, дякую.
simonalexander2005

@JonathanAllan, ngn: Я згоден, я мав на увазі лише букви, які є у діаграмі Венна, - але всі представлення цих букв є дійсними - як я намагаюся сказати у питанні, є декілька представлень унікоду "A", наприклад
simonalexander2005

Кирилиця "Ель" - це насправді грецька "лямбда". Кирилиця "Пе" - грецька "Пі".
simonalexander2005

@JonathanAllan Залежно від шрифту, кирилиця Л може виглядати так само, як грецька Λ. Π -подібна форма - це ще одна стилістична варіація тієї самої літери.
ngn

Відповіді:


4

Желе , 56 байт

Хеш може цілком коротше.

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

Монадичне посилання, що повертає список сум співвідношення у порядку англійська, грецька, російська.

Спробуйте в Інтернеті!
... або переглянути повністю відформатований вихід (включаючи мається на увазі округлення до одного десяткового знака)

Як?

Ми хотіли б мати код, який переводить кожного можливого символу в трійку одиниць і нулів, що представляють, чи належать вони до кожного з алфавітів (подібно до таблиці в питанні, де Cзнаходиться 1 0 1). Як тільки це буде зроблено, ми можемо підсумовувати їх та розділити на довжину, щоб отримати співвідношення (між нулем і одним включно) - це просто S÷L(видно справа від коду).

Для будь-якого даного символу Ми знаємо, що якщо порядковий номер менше 256, він вважається англійським, якщо він більший за 1024, він вважається російським, а якщо він знаходиться між 256 і 1024, він вважається грецьким. Таким чином, беруть порядкове і ціле ділення на 256, а потім ціле число ділить результат на два 0введення для пробілів та латинських символів (рахують як англійські), 1для еллінічного (рахують як грецьке) та 2для кирилиці (рахують як російське). Це просто O:⁹:2в Jelly (видно зліва від коду).

Якщо ми обертаємо трійку бітів таким чином, що біт натурального алфавіту * є найбільш значущим, тоді ми можемо кодувати нижні два біти (як значення між нулем і трьома включно) в оглядовій таблиці з трьома рядками, а потім повернути праворуч на числа, знайдені вище.

Коли ми це робимо, варто звернути увагу на дві речі: 1. У желе є атом обертання-вліво, а не в обертання-вправо; 2. Еллінський рядок Ξоглядової таблиці починався з нуля (оскільки є лише грецьким), перешкоджаючи простому кодуванню base-4 (оскільки провідні нулі не підлягають кодуванню). Щоб полегшити (1), ми можемо повернути ліворуч на заперечене значення, а для полегшення (2) ми можемо кодувати наші рядки у зворотному напрямку та індексувати їх у від'ємну суму. Таким чином, ми можемо заперечити як індекс рядків, так і стовпців одним байтом ( N), оскільки такі індекси рядків і стовпців можуть бути обчислені O:⁹:2;ON.

Зверніть увагу , що Jelly тепер має багатовимірну атом індексування œị.

Таблиця складається з трьох великих чисел, які, перетворені в основу чотири, дають нижчі біти, необхідні для кирилиці, грецької та латинської (+ пробіл) відповідно. Вони мають мінімальну довжину, так що можливе модульне індексування за заперечуючими порядковими значеннями - 47, 25 та 30 відповідно ( .s - у невикористаних індексах):

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

В якості прикладу розглянемо символ Φ у точці Unicode U + 03A6 (який повинен дати вихід [0,1,1]), він має порядкове значення (3 × 16² + 10 × 16 + 6 =) 934. ( O:⁹:2означає 934 // 256 // 2 =) 1 ідентифікуючи її як частину еллінського блоку. ;OЗв'язує порядковий дає нам [1,934]і Nто зводить на немає обидва значення дає нам [-1,-934]. Оскільки індексація Jelly є як 1-базисною, так і модульною і є три рядки -1посилань, другий з трьох рядків (рядок 2 у наведеному вище -934кодовому блоці), оскільки середній рядок має довжину 25 посилань (-934% 25 =) 16- й запис у тому рядку, який є 2. Потім код додає чотири (найзначніший біт), що дає нам 6перехід на двійковий код[1,1,0]. Код потім обертає цю ліву частину кожного з них [-1,-934]і забирає голову (тобто обертання ліворуч на -1, праворуч обертання на 1), отримуючи, [0,1,1]як потрібно.

* Англійська мова для простору, оскільки вона згрупована з латинськими символами


Коментований код

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

Схоже, у вас там є якась термінологія ... чи означає "хеш" така конструкція (keys)iị(values)Ʋ?
Ерік Аутгольфер

Я маю на увазі формування окремого набору ключів від якоїсь математичної маніпуляції, щоб можна було індексувати до списку значень, так. Так, як ...ị“...і можливо ...ṃ“...(строго кажучи, монадичний ланцюг, який я сформував, - це хеш-функція )
Джонатан Аллан

@ngn M kebard anning
Джонатан Аллан

О, я знаю, як це виправити! Переконфігуруйте клавіатуру та введіть кирилицю "у" та "о" замість "у" та "о": D
ngn

Я ніколи не бачив такої довгої відповіді «Желе» ... чудова робота!
simonalexander2005

5

JavaScript (ES6), 197 179 байт

Повертає масив з 3 співвідношень у [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]

Спробуйте в Інтернеті!

Як?

Ми використовуємо (досить неефективну) хеш-функцію % 202 % 116 % 89для перетворення кожного коду символів в індекс у [0..88]. Відповідна таблиця пошуку складається з 3-розрядних записів, де біт # 2 = латинський, біт # 1 = грецький і біт № 0 = кириличний. Використовуючи десяткові цифри, це дає:

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

Ми додаємо додаткову кількість, 1щоб отримати цілу кількість записів і кодуємо цей потік бітів за допомогою друкованих символів ASCII в діапазоні [37..99] ( %до c), з 6 бітами даних корисного навантаження на символ.

Це призводить до наступного рядка:

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

Зсув був обраний таким чином, щоб уникнути таких символів, \які потребували б втечі.


3

Рубі , 165 байт

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

Спробуйте в Інтернеті!

Редагувати: Значно переграв код і, головне, видавив 3 послідовності перекладу в один рядок UTF-8. Оригінальний довший код зберігається нижче для кращої читабельності та пояснення логіки.

Рубін, 211 байт

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

Спробуйте в Інтернеті!

Можливо, це не найефективніший підхід, але це робить роботу. Використовує таблицю перекладу для кожного алфавіту з появою символів у різних сценаріях, закодованих бітами числа (у порядку: латинська, грецька, російська). Вихід - це масив відсотків у тому ж порядку.

Щоб виправити інший Ёвипадок, я розширив лише російський блок 4-х з 10 позицій в кінці алфавіту до 15. Таким чином, Ёвибирається правильно з негативним індексом (і нам не потрібно обробляти малі літери, ніж відповідати ці додаткові індекси).


1

Сітківка 0,8,2 , 230 байт

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Примітка. Вихід у% скорочений до цілого числа, оскільки підвищення точності зробив сценарій занадто повільним, і він вичерпався на TIO.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.