Расшифровка системы Каади

14

Вы натолкнулись на старую индийскую рукопись, которая описывает кучу захороненных сокровищ. Рукопись также сообщает вам местонахождение сокровища, за исключением того, что некоторые важные цифры были косвенно закодированы в текст. Вы выясните, что в тексте используется система «Каади», ограниченное подмножество более распространенной системы «Катапаяди».

(Система Katapayadi - это древняя индийская система кодирования цифр в виде букв, часто используемая как мнемоника для запоминания длинных чисел.)

Ваша задача здесь состоит в том, чтобы декодировать текст, закодированный в системе Kaadi, и распечатать числовое значение.

Детали

Введите символы

Система Kaadi основана на правилах системы Katapayadi , но использует только первый ряд согласных. Ваш текст здесь транслитерирован на латинский алфавит и, как известно, содержит только:

  • гласные 'a', 'e', ​​'i', 'o', 'u'
  • согласные «g», «k», «c», «j» и их заглавные буквы (для представления аспирированной формы этих согласных), а также «ṅ» и «ñ».

(Вы можете получать и обрабатывать 'ṅ' как 'ng', а 'ñ' как 'ny', если это более удобно на вашем языке.)

Присвоение значения

В этой системе

  1. с каждой согласной, сопровождаемой гласным, связана цифра. Эти:

    'k'=>1, 'K'=>2,
    'g'=>3, 'G'=>4,
    'ṅ'=>5,
    'c'=>6, 'C'=>7,
    'j'=>8, 'J'=>9,
    'ñ'=>0

Однако обратите внимание, что эти значения применяются только тогда, когда за этими согласными следует гласный. kacCiимеет то же значение, что и kaCi( ka, Ci= (1,7)), так как середина c не сопровождается гласной.

  1. Кроме того, начальный гласный или последовательность из двух гласных представляет собой 0. aikaCiбудет: ai, ka, Ci= (0,1,7)

  2. Дополнительные гласные где-либо еще в середине текста не имеют значения: kauCiaто же самое kaCi, что дополнительные гласные можно игнорировать.

Конечное числовое значение

После того, как значения цифр букв были вычислены, окончательное числовое значение получается как обратный порядок этих цифр, т.е. первая цифра в тексте является наименее значимой цифрой в конечном значении.

Например.
GucCiимеет Guи Ci, таким образом (4, 7), поэтому конечное значение 74.
kakakaGoявляется (1,1,1,4), поэтому ответ 4111.
guṅKoявляется (3,2), поэтому кодируется 23. ( gungKoесли используется ASCII -эквивалентны.)

вход

  • Строка, содержащая текст в кодировке Kaadi
    • будет содержать только гласные и вышеуказанные согласные
    • гласные всегда в нижнем регистре и встречаются в группах не более 2
    • Вы можете принять буквы 5 и 0 либо как их символы Unicode 'ṅ' и 'ñ', либо как их эквиваленты ASCII 'ng' и 'ny' (они в нижнем регистре в любой форме)
    • Вы можете предположить, что нет пробелов или знаков препинания

Выход

  • Числовое значение текста, как указано выше правил
    • для пустого ввода допустим пустой вывод или любой вывод false-y на выбранном вами языке, в дополнение к 0
    • для неверного ввода (ввод с чем-либо, кроме гласных и вышеуказанных согласных), вывод не определен - все идет

Контрольные примеры

"GucCi"
=> 74
"kakakaGo"
=> 4111
"aiKaCiigukoJe"
=> 913720
""
=> 0 //OR empty/falsey output
"a"
=> 0
"ukkiKagijeCaGaacoJiiKka"
=> 1964783210
"kegJugjugKeg"
=> 2891
"guṅKo"
=> 23
"Guñaaka"
=> 104
"juñiKoṅe"
=>5208

(последние могут быть:

"gungKo"
=> 23
"Gunyaaka"
=> 104
"junyiKonge"
=>5208

если ты предпочитаешь это.)

Применяются стандартные правила для ввода / вывода и лазеек . Пусть победит лучший гольфист!

sundar - Восстановить Монику
источник
1
Можно aiaKaciвводить? (3 ведущих гласных)
Эрик Аутгольфер
Также нет тестового случая, который заканчивается согласной; Можем ли мы предположить, что ввод всегда будет гласным?
Эрик Outgolfer
Нет для 3 ведущих гласных. На самом деле, я не думаю, что имеет смысл, чтобы 3 последовательные гласные встречались где-либо на входе (иногда необходимы две английские гласные, чтобы представить один санскритский гласный звук, но никогда не 3). Могу ли я добавить это в качестве ограничения ввода сейчас или уже слишком поздно?
sundar - Восстановить Монику
2
Еще не поздно уточнить, что на входе не будет 3 ведущих гласных. Это не нарушит никаких представлений, и я сомневаюсь, что кто-то написал более длинный код, чтобы учесть это, и если они есть, они могут просто удалить его. Хороший первый вопрос, кстати! :)
Стьюи Гриффин
2
В случае, если это помогает в некоторых языках: ord(c)%47%10дает уникальный индекс [0..9]для каждого согласного. (С ord("ṅ")=7749и ord("ñ")=241.)
Арно

Ответы:

5

JavaScript (ES6), 83 байта

s=>s.replace(s=/(^|[ṅcCjJñkKgG])[aeiou]/g,(_,c)=>o=(s+s).search(c)%10+o,o='')&&o

Попробуйте онлайн!

Как?

Мы используем следующее регулярное выражение, чтобы соответствовать либо началу строки, либо одному из согласных Каади, за которым следует гласная:

/(^|[ṅcCjJñkKgG])[aeiou]/g

Для каждого совпадения во входной строке мы вызываем следующую функцию обратного вызова, которая принимает содержимое c группы захвата в качестве параметра:

(_, c) => o = (s + s).search(c) % 10 + o

Мы находим значение согласного, ища его положение в регулярном выражении (приводится к строке, добавляя ее к себе).

Согласные упорядочены таким образом, что их значение равно их положению по модулю 10 :

string   : /  (  ^  |  [  ṅ  c  C  j  J  ñ  k  K  g  G  ]  )  [  a  e  i  o  u  ]  /  g
position : 0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 ...
modulo 10: -  -  -  -  -  5  6  7  8  9  0  1  2  3  4  -  ...

Когда мы сопоставляем начало строки вместо согласного, c - пустая строка, позиция которой в регулярном выражении равна 0, что, как правило, является ожидаемым результатом в этом случае.

Наконец, мы вставляем эту цифру в начало строки вывода o .

Arnauld
источник
4

Сетчатка , 41 байт

T`ñkKgGṅcCjJ`d`.[aeiou]
^[aeiou]
0
\D

V`

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Explantion:

T`ñkKgGṅcCjJ`d`.[aeiou]

Переведите согласные, за которыми следуют гласные.

^[aeiou]
0

Ручка ведущий гласный.

\D

Удалить все остальное.

V`

Обратный результат.

Нил
источник
4

Python 2 , 93 байта

lambda s,h=u'ñkKgGṅcCjJ'.find:''.join(`h(c)`*(0>h(v)<h(c))for c,v in zip(u'ñ'+s,s))[::-1]

Неименованная функция, принимающая строку Unicode, которая возвращает строковое представление результата из десяти основных.

Попробуйте онлайн!

Джонатан Аллан
источник
3

Java 8, 136 126 байт

s->{for(int i=s.length,t;i-->0;)if("aeiou".contains(s[i]))System.out.print(i<1?0:(t="ñkKgGṅcCjJ".indexOf(s[i-1]))<0?"":t);}

Попробуйте онлайн.

Объяснение:

s->{                           // Method with String-array parameter and String return-type
  for(int i=s.length,t;i-->0;) //  Loop backwards over the input-characters
    if("aeiou".contains(s[i])) //   If the current character is a vowel:
      System.out.print(        //    Print:
         i<1?                  //     If we're at the first character:
          0                    //      Print a 0
         :                     //     Else:
          (t="ñkKgGṅcCjJ".indexOf(s[i-1]))<0?
                               //      If the character before the vowel is also a vowel:
           ""                  //       Print nothing
          :                    //      Else:
           t);}                //       Print the correct digit of the consonant
Кевин Круйссен
источник
3

Желе , 27 байт

Żµe€Øẹœpṫ€0F“kKgGṅcCjJ”iⱮUḌ

Попробуйте онлайн!

Желе имеет встроенный для ... 1 байт .

объяснение


Żµ             Prepend 0 to the string.
  e€  œp       Split at...
    Øẹ           the vowels. (0 is not a vowel)

ṫ€0            For each sublist `l` takes `l[-1:]`.
                 If the initial list is empty the result is empty,
                 otherwise the result is a list contain the last element.
   F           Flatten. (concatenate the results)

“kKgGṅcCjJ”iⱮ  Find the index of each character in the list.
                 Get 0 if not found (i.e., for `0` or `ñ`)
UḌ             Upend (reverse) and then convert from decimal.
user202729
источник
Я не нашел способа сохранить байты с этим, но O%47%10дает уникальный индекс [0...9]для каждого согласного. (Это означает, что O%47с неявным модулем of позволит подобрать правильное значение в массиве из 10 записей.)
Арнаулд
1
@Arnauld 6;µe€Øẹœpṫ€0O%47ị“ ʠḷ’Œ?’¤Ṛно также 27, если это не может быть в гольф.
Джонатан Аллан
3

Python 2 , 101 байт

lambda s,S=u'ñkKgGṅcCjJ':''.join(`S.find(c)`for c,n in zip(u'ñ'+s,s)if c in(n in'aeiou')*S)[::-1]

Попробуйте онлайн!

Python 3 , 104 102 байта

lambda s,S='ñkKgGṅcCjJ':''.join(str(S.find(c))for c,n in zip('ñ'+s,s)if c in(n in'aeiou')*S)[::-1]

Попробуйте онлайн!


Сохраненный

  • -3 байта, спасибо Роду
TFeld
источник
Ну, вы можете, если вы добавите заголовок , но я забыл префикс юникода в строках, в конце концов, он сохранил бы один байт
Rod
@Rod, ах, спасибо, я забыл о префиксе Unicode :)
TFeld
1

JavaScript (Node.js) , 126 байт

_=>(l=_.match(/[kgñṅcj][aeiou]/gi))?l.map(a=>"ñkKgGṅcCjJ".indexOf(a[0])).reverse``.join``+(/[ aiueo]/.test(_[0])?0:''):0

Попробуйте онлайн!

Луис Фелипе Де Иисус Муньос
источник
1
Вы можете сэкономить несколько байт, изменив x=[..."ñkKgGṅcCjJ"]только x="ñkKgGṅcCjJ"так indexOfработы со строками тоже
WaffleCohn
1
Похоже, что это не относится к начальным гласным, как 0, поэтому не проходит тестовые случаи 3 и 6 (как можно увидеть в Выходных данных на TIO).
sundar - Восстановить Монику
@sundar Мой плохой, Исправлено.
Луис Фелипе Де Иисус Муньос
1

Красный , 152 143 байта

func[s][t:"ñkKgGṅcCjJ"c: charset t
d: copy{}parse s[opt[1 2 not c(alter d 0)]any[copy n c not c(insert
d(index? find/case t n)- 1)| skip]]d]

Попробуйте онлайн!

Удобочитаемый:

f: func[s] [
    t: "ñkKgGṅcCjJ"
    c: charset t
    d: copy {}
    parse s [
        opt [ 1 2 not c (alter d 0) ]
        any [ 
              copy n c not c (insert d (index? find/case t n) - 1)
            | skip 
        ]
    ]
    d
]
Гален Иванов
источник
1

MATL , 48 47 45 байт

'ng'98Ztt'y'whw11Y2m)'ykKgGbcCjJ'tfqXEt10<)oP

Попробуйте онлайн!

(«b» вместо «d» для сохранения байта)
(-2 байта благодаря Луису Мендо)

MATLAB (и, следовательно, MATL), обрабатывающий строки как немую серию байтов, усложнил перенос решения Python @ TFeld, чем я себе представлял (может быть, решение с прямым циклом было бы проще здесь?). Законченное использование альтернативного 'ng', 'ny'метод ввода и замена ngс bв начале для более легкой обработки.

Объяснение:

        % Implicit input (assume 'junyiKonge')
 'ng'   % string literal
 98     % 'b'
 Zt     % replace substring with another (stack: 'junyiKobe')
 t      % duplicate that (stack: 'junyiKobe' 'junyiKobe')
 'y'    % string literal
 w      % swap elements in stack so 'y' goes before input (stack: 'junyiKobe' 'y' 'junyiKobe')
 h      % horizontal concatenation (prepend 'y' to input string) (stack: 'junyiKobe' 'yjunyiKobe')
 w      % swap stack (stack: 'yjunyiKobe' 'junyiKobe')
 11Y2   % place 'aeiou' in stack (stack: 'yjunyiKobe' 'junyiKobe' 'aeiou')
 m      % set places with a vowel to True i.e. 1 (stack: 'yjunyiKobe' 0 1 0 1 0 1 0 0 1)
 )      % index into those places (stack: 'jyKd')
 'ykKgGdcCjJ' % string literal
 tfq    % generate numbers 0 to 9 (stack: 'jyKd' 'ykKgGdcCjJ' 0 1 2 3 4 5 6 7 8 9)
 XE     % replace elements in first array which are found in second,
        %  with corresponding elements from third
 t10<)  % keep only elements that are less than 10 (removes extraneous vowels)
 o      % convert from string to double (numeric) array (stack: 8 0 2 5)
 P      % flip the order of elements (stack: 5 2 0 8)
        % (implicit) convert to string and display
sundar - Восстановить Монику
источник
Спасибо, готово. Знаете ли вы, есть ли в MATLAB / Octave что-нибудь для индексации / перебора строки в кодовых точках Unicode вместо байтов? Похоже, поддержка Unicode кажется ужасно плохой, но, может быть, я что-то упустил.
sundar - Восстановить Монику
1
Кроме того, в руководстве MATL упоминается «если ввод - строка или массив символов» в нескольких местах - это две разные вещи? Какое-то отношение к причудливым новым двойным кавычкам в MATLAB?
sundar - Восстановить Монику
1
Матлаб есть unicode2native, но я думаю, что теперь ты этого хочешь. Я согласен, поддержка Unicode в MATLAB не самая лучшая. И не начинайте меня с Octave :-D Что касается MATL, он был разработан до того, как новый тип строковых данных существовал в MATLAB (и мне он все равно не очень нравится), поэтому в MATL "строка" такая же как это было в старых версиях MATLAB: вектор строки символов. Я сделал примечание, чтобы уточнить, что в документации, спасибо за замечание!
Луис Мендо