Розшифровка системи Kaadi


14

Ви натрапили на старий індійський рукопис, який описує кургани закопаного скарбу. Рукопис також говорить вам про розташування скарбу, за винятком того, що деякі ключові цифри були зафіксовані опосередковано в тексті. Ви розумієте, що в тексті використовується система "Kaadi", обмежена підмножина більш поширеної системи "Katapayadi".

(Система Катапаяді - давньоіндійська система для кодування цифр як букв, часто використовується як мнемоніка для запам'ятовування довгих чисел.)

Ваше завдання тут - розшифрувати текст, закодований в системі Kaadi, і роздрукувати числове значення.

Деталі

Введіть символи

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

  • голосні 'a', 'e', ​​'i', 'o', 'u'
  • приголосні «G», «до», «з», «J», і їх форма (капіталу , щоб представити всмоктувану форму цих приголосних звуків), і «N» і «N».

(Ви можете вибрати, щоб отримувати та обробляти 'ṅ' як '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 -еквівалент.)

Вхідні дані

  • Рядок, що містить текст, закодований Кааді
    • міститиме лише голосні та вищезгадані приголосні
    • голосні завжди знаходяться з малих літер і зустрічаються групами не більше 2-х
    • ви можете прийняти літери для 5 і 0 або як символи Unicode 'ṅ' і 'ñ', або як їх еквіваленти ASCII 'ng' і 'ny' (вони знаходяться з малих літер у будь-якій формі)
    • ви можете припустити, що немає пробілів чи розділових знаків

Вихідні дані

  • Числове значення тексту, як задано вищезазначеними правилами
    • для порожнього введення пустий вихід або будь-який помилковий вихід у вибраній вами мові є прийнятним, крім 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

якщо ви віддаєте перевагу.)

Застосовуються стандартні правила вводу / виводу та лазівки . Нехай переможе найкращий гольфіст!


1
Можна aiaKaciввести? (3 провідні голосні)
Ерік Аутгольфер

Немає також тестового випадку, який закінчується на приголосний; чи можна припустити, що вхід завжди закінчуватиметься голосним?
Ерік Аутгольфер

Ні для 3 провідних голосних. Насправді, я не думаю, що має сенс 3 послідовні голосні слова виникати в будь-якому місці введення (2 англійських голосних іноді потрібні для відображення одного санскритського голосного звуку, але ніколи 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 .


4

Сітківка , 41 байт

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

V`

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

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

Перекладіть приголосні, за якими слідують голосні.

^[aeiou]
0

Обробіть провідну голосну.

\D

Видаліть все інше.

V`

Зворотний результат.



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Ḍ

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

Jelly має вбудований ... 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.

Я не знайшов способу збереження байтів за допомогою цього, але O%47%10дає унікальний індекс [0...9]для кожного приголосного. (Що означає, що O%47з неявним модулем дозволено підібрати правильне значення в масиві з 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]

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

Пітон 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 байти, завдяки Роду

Ну, ви можете, якщо ви додасте заголовок , але я забув префікс unicode в рядках, зрештою, це збереже один байт
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 (як це видно з Output on TIO).
sundar

@sundar Мій поганий, виправлено.
Luis felipe De jesus Munoz


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

Спасибі, зроблено. Чи знаєте ви, чи має MATLAB / Octave щось індексувати / повторювати через рядок через кодові точки Unicode замість байтів? Не схоже на це, їх підтримка Unicode взагалі здається погано поганою, але, можливо, я щось пропустив.
sundar

1
Також в посібнику MATL в декількох місцях згадується "якщо вхід є рядок або масив символів" - це дві різні речі? Що-небудь спільного з фантазійними новими рядками з подвійним цитуванням у MATLAB?
sundar

1
У Matlab є unicode2native, але я думаю, що це зараз те, що ти хочеш. Я згоден, підтримка Unicode в MATLAB - не найкраща. І не запускайте мене з Octave :-D Що стосується MATL, він був розроблений до існування нового типу рядкових даних у MATLAB (і мені це все одно не подобається), тому в MATL "рядок" такий же як це було у старих версіях MATLAB: вектор рядків з символів. Я зробив записку, щоб уточнити, що в документації, дякую за те, що помітили!
Луїс Мендо

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