Фон
Я видел эту очень интересную диаграмму Венна в Википедии: 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 )
Во избежание сомнений, единственные символы Юникода, допустимые во входных данных:
- 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
источник
Ответы:
Желе , 56 байт
Хеш может быть короче.
Монадическая ссылка, возвращающая список сумм коэффициентов в порядке английский, греческий, русский.
Попробуйте онлайн!
... или увидеть полностью форматированный вывод (включая подразумеваемое округление до одного десятичного знака)
Как?
Мы хотим иметь код, который переводит каждый возможный символ в тройку единиц и нулей, представляющих, принадлежат ли они каждому из алфавитов (так же, как таблица в вопросе, где
C
находится1 0 1
). Как только это будет сделано, мы можем суммировать их и разделить на длину, чтобы получить отношения (от нуля до одного включительно) - это простоS÷L
(видно справа от кода).Для любого данного символа мы знаем, что если порядковый номер меньше 256, он считается английским, если он больше 1024, он считается русским, и что если он находится между 256 и 1024, он считается греческим. Таким образом, берется порядковое и целочисленное деление на 256, а затем целочисленное деление результата на два результата
0
для пробелов и латинских символов (считается как английский),1
для эллинского (считается как греческий) и2
для кириллицы (считается как русский). Это толькоO:⁹:2
в желе (видно слева от кода).Если мы вращаем тройки битов так, что бит натурального алфавита * является наиболее значимым, то мы можем закодировать младшие два бита (в виде значений от нуля до трех включительно) в справочной таблице с тремя строками, а затем повернуть вправо на числа найдены выше.
Когда мы делаем это, есть две вещи, достойные внимания: 1. У желе есть атом вращаться влево, а не вращаться вправо; 2. Греческая строка
Ξ
справочной таблицы должна начинаться с нуля (поскольку это только греческий язык), что мешает простой кодировке base-4 (поскольку начальные нули не кодируются). Чтобы смягчить (1), мы можем повернуть влево на отрицательное значение, а для облегчения (2) мы можем закодировать наши строки в обратном порядке и проиндексировать их с отрицательным значением. Таким образом, мы можем свести на нет как индекс строки, так и индекса столбца одним байтом (N
), так как наши индексы строк и столбцов могут быть рассчитаны с помощьюO:⁹:2;ON
.Обратите внимание, что Jelly теперь имеет многомерный индексирующий атом
œị
.Таблица состоит из трех больших чисел, которые после преобразования в основание четыре дают младшие биты, необходимые для кириллицы, греческого и латиницы (+ пробел) соответственно. Они имеют минимальную длину, так что возможна модульная индексация по отрицательным порядковым значениям - 47, 25 и 30 соответственно (
.
s имеют неиспользуемые индексы):В качестве примера рассмотрим символ Φ в точке 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 в приведенном выше блоке кода), поскольку средняя строка имеет длину 25-934
ссылок (-934%). 25 =) 16- я запись в той строке, которая есть2
. Затем код добавляет четыре (самый значимый бит), давая нам6
преобразование в двоичный файл:[1,1,0]
, Затем код поворачивает это влево каждым из них[-1,-934]
и берет голову (то есть вращение влево на -1, вращение вправо на 1), уступая по[0,1,1]
мере необходимости.* Английский для пробела, так как он сгруппирован с латинскими символами
Код комментария
источник
(keys)iị(values)Ʋ
?...ị“...
или возможно...ṃ“...
(строго говоря, монадическая цепочка, которую я сформировал, является хэш-функцией )JavaScript (ES6),
197179 байтВозвращает массив из 3 отношений в [0..1].
Попробуйте онлайн!
Как?
Мы используем (довольно неэффективную) хеш-функцию
% 202 % 116 % 89
для преобразования каждого символьного кода в индекс в [0..88]. Соответствующая таблица поиска состоит из 3-битных записей, где бит № 2 = латиница, бит № 1 = греческий язык и бит № 0 = кириллица. Используя десятичные цифры, это дает:Мы добавляем дополнительно,
1
чтобы получить четное число записей и кодируем этот поток битов с помощью печатаемых символов ASCII в диапазоне [37..99] (%
доc
), с 6 битами данных полезной нагрузки на символ.Это приводит к следующей строке:
Смещение было выбрано, чтобы избежать таких символов,
\
которые потребовали бы экранирования.источник
Рубин , 165 байт
Попробуйте онлайн!
Изменить: Значительно ударил код и, что самое важное, сжал 3 последовательности перевода в одну строку UTF-8. Оригинальный более длинный код хранится ниже для лучшей читаемости и объяснения логики.
Рубин, 211 байт
Попробуйте онлайн!
Возможно, не самый эффективный подход, но делает работу. Использует таблицу перевода для каждого алфавита с вхождением символов в разных сценариях, закодированных битами числа (в порядке: латинский, греческий, русский). Вывод представляет собой массив процентов в том же порядке.
Чтобы исправить
Ё
случай выброса, я расширил блок только для русского языка из 4-х с 10 позиций в конце алфавита до 15. Таким образом,Ё
его правильно выбирают с отрицательным индексом (и нам не нужно обрабатывать строчные буквы, которые соответствуют эти дополнительные показатели).источник
Сетчатка 0.8.2 , 230 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Примечание. Выходные данные в% усечены до целого числа, поскольку повышение точности делало скрипт слишком медленным и время его ожидания истекло в TIO.
источник