Кросс-буквенные символы

17

Фон

Я видел эту очень интересную диаграмму Венна в Википедии: 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
simonalexander2005
источник
1
Добро пожаловать в PPCG! Это хороший первый вызов. :) Примечание к вашему примечанию UTF-8: это не UTF-8, который определяет несколько версий этих символов, а Unicode (а UTF-8 - это только один конкретный способ кодирования кодовых точек Unicode). Кроме того, так как эта часть довольно важна для правильных ответов, вы можете включить явный список всех символов Юникода, которые должны обрабатываться правильно.
Мартин Эндер
@ Да, спасибо.
simonalexander2005
@JonathanAllan, ngn: я согласен, я имел в виду только буквы, которые находятся на диаграмме Венна - но все представления этих букв действительны - как я пытаюсь сказать в этом вопросе, например, есть несколько представлений «А» в Юникоде
simonalexander2005
Кириллица «Эль» на самом деле греческая «лямбда». Кириллица "Пе" - это греческое "Пи".
simonalexander2005
@JonathanAllan В зависимости от шрифта, кириллица Л может выглядеть точно так же, как греческая Л. Π-подобная форма - это еще один стилистический вариант той же буквы.
августа

Ответы:

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в желе (видно слева от кода).

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

Когда мы делаем это, есть две вещи, достойные внимания: 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 в приведенном выше блоке кода), поскольку средняя строка имеет длину 25 -934ссылок (-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)Ʋ?
Эрик Outgolfer
Я имею в виду формирование отдельного набора ключей из некоторых математических манипуляций, чтобы можно было индексировать в список значений, да. Так, как ...ị“...или возможно ...ṃ“...(строго говоря, монадическая цепочка, которую я сформировал, является хэш-функцией )
Джонатан Аллан
@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]

Смещение было выбрано, чтобы избежать таких символов, \которые потребовали бы экранирования.

Arnauld
источник
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.

Нил
источник