Dekodowanie systemu Kaadi

14

Natknąłeś się na stary indyjski rękopis, który opisuje kopce zakopanego skarbu. Manuskrypt informuje również o lokalizacji skarbu, z tym że niektóre kluczowe liczby zostały zakodowane pośrednio w tekście. Dowiadujesz się, że tekst wykorzystuje system „Kaadi”, ograniczony podzbiór bardziej powszechnego systemu „Katapayadi”.

(System Katapayadi to starożytny indyjski system do kodowania cyfr jako liter, często używany jako mnemonika do zapamiętywania długich cyfr).

Twoim zadaniem tutaj jest odkodowanie tekstu zakodowanego w systemie Kaadi i wydrukowanie wartości liczbowej.

Detale

Wprowadź znaki

System Kaadi opiera się na zasadach systemu Katapayadi , ale wykorzystuje tylko pierwszy rząd spółgłosek. Twój tekst tutaj został przetłumaczony na alfabet łaciński i wiadomo, że zawiera tylko:

  • samogłoski „a”, „e”, „i”, „o”, „u”
  • spółgłosek „g”, „k”, „c”, „j” i ich formy kapitałowe (reprezentujące aspirowaną formę tych spółgłosek) oraz „ṅ” i „ñ”.

(Możesz wybrać opcję otrzymywania i obsługiwać „ṅ” jako „ng”, a „ñ” jako „ny”, jeśli jest to wygodniejsze w Twoim języku).

Przypisanie wartości

W tym systemie

  1. każda spółgłoska, po której następuje samogłoska, ma przypisaną cyfrę. To są:

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

Należy jednak pamiętać, że wartości te mają zastosowanie tylko wtedy, gdy po spółgłosek następuje samogłoska. kacCima taką samą wartość jak kaCi( ka, Ci= (1,7)), ponieważ środkowej c nie towarzyszy samogłoska.

  1. Ponadto, początkowa samogłoska lub sekwencja obu samogłosek oznacza 0 aikaCi, to: ai, ka, Ci= (0,1,7)

  2. Dodatkowe samogłoski gdziekolwiek indziej w środku tekstu nie mają żadnej wartości: kauCiajest taki sam, jak kaCidodatkowe samogłoski można zignorować.

Końcowa wartość liczbowa

Po ustaleniu wartości cyfr literowych, ostateczna wartość liczbowa jest uzyskiwana jako odwrotna kolejność tych cyfr, tj. Pierwsza cyfra z tekstu jest najmniej znaczącą cyfrą w wartości końcowej.

Na przykład.
GucCima Gui Ci, więc (4, 7), więc końcowa wartość to 74.
kakakaGoto (1,1,1,4), więc odpowiedź to 4111.
guṅKoto (3,2), więc koduje 23. ( gungKojeśli używasz ASCII -odpowiednik.)

Wejście

  • Ciąg zawierający tekst zakodowany w Kaadi
    • będzie zawierać tylko samogłoski i powyższe spółgłosek
    • samogłoski są zawsze pisane małymi literami i występują w grupach nie większych niż 2
    • możesz zaakceptować litery 5 i 0 jako ich znaki Unicode „ṅ” i „ñ” lub jako ich odpowiedniki ASCII „ng” i „ny” (są pisane małymi literami w dowolnej formie)
    • możesz założyć, że nie ma spacji ani interpunkcji

Wynik

  • Wartość liczbowa tekstu, zgodnie z powyższymi zasadami
    • w przypadku pustych danych wejściowych, oprócz 0, dopuszczalne są puste dane wyjściowe lub dowolne dane wyjściowe false-y w wybranym języku
    • dla niepoprawnego wprowadzania (wprowadzania z użyciem czegoś innego niż samogłoski i powyższe spółgłosek), wynik jest niezdefiniowany - wszystko idzie

Przypadki testowe

"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

(ostatnie mogą być:

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

jeśli wolisz.)

Obowiązują standardowe zasady we / wy i luki . Niech zwycięży najlepszy golfista!

sundar - Przywróć Monikę
źródło
1
Czy aiaKacimożna wprowadzić? (3 wiodące samogłoski)
Erik the Outgolfer
Nie ma też przypadku testowego, który kończy się spółgłoską; czy możemy założyć, że dane wejściowe zawsze kończą się samogłoską?
Erik the Outgolfer
Nie dla 3 wiodących samogłosek. W rzeczywistości nie sądzę, aby miało to sens, aby 3 konsekwentne samogłoski występowały gdziekolwiek na wejściu (2 samogłoski angielskie są czasami potrzebne do przedstawienia jednego dźwięku samogłoski sanskrytu, ale nigdy 3). Czy mogę to teraz dodać jako ograniczenie wejściowe, czy jest już za późno?
Sundar - Przywróć Monikę
2
Nie jest za późno na wyjaśnienie, że na wejściu nie będą 3 wiodących samogłosek. To nie złamie żadnych zgłoszeń i wątpię, aby ktokolwiek napisał dłuższy kod, aby wziąć to pod uwagę, a jeśli tak, to może go po prostu usunąć. Przy okazji fajne pierwsze pytanie! :)
Stewie Griffin
2
Jeśli pomaga w niektórych językach: ord(c)%47%10daje unikalny indeks [0..9]dla każdej spółgłoski. (Z ord("ṅ")=7749i ord("ñ")=241.)
Arnauld

Odpowiedzi:

5

JavaScript (ES6), 83 bajty

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

Wypróbuj online!

W jaki sposób?

Używamy następującego wyrażenia regularnego, aby dopasować początek łańcucha lub jedną ze spółgłosek Kaadi, a następnie samogłoskę:

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

Dla każdego dopasowania w ciągu wejściowym wywołujemy następującą funkcję zwrotną, która przyjmuje zawartość c grupy przechwytywania jako parametr:

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

Wartość spółgłoski znajdujemy, szukając jej pozycji w wyrażeniu regularnym (przymuszanym do łańcucha przez dodanie jej do siebie).

Spółgłoski są uporządkowane w taki sposób, że ich wartość jest równa ich pozycji modulo 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  -  ...

Kiedy dopasujemy początek łańcucha zamiast spółgłoski, c jest pustym łańcuchem, którego pozycja w wyrażeniu regularnym wynosi 0 - co, dogodnie, jest oczekiwanym wynikiem w tym przypadku.

Na koniec wstawiamy tę cyfrę na początku łańcucha wyjściowego o .

Arnauld
źródło
4

Siatkówka , 41 bajtów

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

V`

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

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

Przetłumacz spółgłoski, po których następują samogłoski.

^[aeiou]
0

Obsługuj wiodącą samogłoskę.

\D

Usuń wszystko inne.

V`

Odwróć wynik.

Neil
źródło
4

Python 2 , 93 bajty

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

Nienazwana funkcja akceptująca ciąg Unicode, który zwraca ciąg reprezentujący wynik dziesięciu baz.

Wypróbuj online!

Jonathan Allan
źródło
3

Java 8, 136 126 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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
Kevin Cruijssen
źródło
3

Galaretka , 27 bajtów

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

Wypróbuj online!

Galaretka ma wbudowane ... 1-bajtowe .

Wyjaśnienie


Żµ             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.
użytkownik202729
źródło
Nie znalazłem sposobu na zapisanie bajtów, ale O%47%10daje unikalny indeks [0...9]dla każdej spółgłoski. (Co oznacza, że O%47przy domniemanym modulo pozwoliłoby na wybranie poprawnej wartości w tablicy 10 wpisów.)
Arnauld
1
@Arnauld, 6;µe€Øẹœpṫ€0O%47ị“ ʠḷ’Œ?’¤Ṛale także 27, chyba że można grać w golfa.
Jonathan Allan,
3

Python 2 , 101 bajtów

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]

Wypróbuj online!

Python 3 , 104 102 bajtów

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]

Wypróbuj online!


Zapisano

  • -3 bajty, dzięki Rod
TFeld
źródło
Cóż, możesz, jeśli dodasz nagłówek , ale zapomniałem prefiksu Unicode w ciągach, w końcu zapisałby jeden bajt
Rod
@Rod, ah dzięki, zapomniałem o prefiksie Unicode :)
TFeld
1

JavaScript (Node.js) , 126 bajtów

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

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
1
możesz zaoszczędzić kilka bajtów, zmieniając x=[..."ñkKgGṅcCjJ"]na właśnie, x="ñkKgGṅcCjJ"ponieważ indexOfdziała również z
ciągami
1
Wydaje się, że nie traktuje to początkowych samogłosek jako 0, więc zawodzi przypadki testowe 3 i 6 (jak można zobaczyć w Output on TIO).
Sundar - Przywróć Monikę
@sundar Mój zły, naprawiony.
Luis felipe De Jesus Munoz
1

Czerwony , 152 143 bajty

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]

Wypróbuj online!

Czytelny:

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
]
Galen Iwanow
źródło
1

MATL , 48 47 45 bajtów

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

Wypróbuj online!

(„b” zamiast „d”, aby zapisać bajt)
(-2 bajty dzięki Luisowi Mendo)

MATLAB (a stąd i MATL) traktujący łańcuchy jako głupią serię bajtów sprawił, że przeniesienie rozwiązania Python @ TFeld było trudniejsze niż sobie wyobrażałem (może rozwiązanie z prostą pętlą byłoby tutaj łatwiejsze?). Skończyło się na alternatywnej 'ng', 'ny'wejściowej metodzie i zamianieng zb na początku w celu ułatwienia obróbki.

Wyjaśnienie:

        % 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 - Przywróć Monikę
źródło
Dzięki, gotowe. Czy wiesz, czy MATLAB / Octave ma coś do indeksowania w / iteracji po łańcuchu znaków w kodowanych punktach Unicode zamiast bajtów? Nie wygląda na to, ich obsługa Unicode wydaje się okropnie zła, ale może coś mi umknęło.
Sundar - Przywróć Monikę
1
Ponadto instrukcja MATL wspomina w kilku miejscach „jeśli dane wejściowe to tablica znaków lub znaków” - czy to dwie różne rzeczy? Masz coś wspólnego z nowymi, fantazyjnymi ciągami podwójnie cytowanymi w MATLAB?
Sundar - Przywróć Monikę
1
Matlab ma unicode2native, ale myślę, że teraz tego właśnie chcesz. Zgadzam się, obsługa Unicode w MATLAB nie jest najlepsza. I nie zaczynaj od Octave :-D Jeśli chodzi o MATL, został on zaprojektowany zanim istniał nowy typ danych string w MATLAB (i tak mi się to nie podoba), więc w MATL „string” jest taki sam jak to było w starych wersjach MATLAB: wektor wiersza znaków. Zrobiłem notatkę, aby wyjaśnić, że w dokumentacji, dzięki za zauważenie!
Luis Mendo,