Decoding sistem Kaadi


14

Anda telah menemukan sebuah naskah kuno India, yang menggambarkan gundukan harta terpendam. Naskah itu juga memberi tahu Anda lokasi harta karun itu, kecuali bahwa beberapa angka penting telah disandikan secara tidak langsung ke dalam teks. Anda mengetahui bahwa teks menggunakan sistem 'Kaadi', subset terbatas dari sistem 'Katapayadi' yang lebih umum.

(Sistem Katapayadi adalah sistem India kuno untuk menyandikan angka sebagai huruf, sering digunakan sebagai mnemonik untuk mengingat angka panjang.)

Tugas Anda di sini adalah mendekodekan teks yang disandikan dalam sistem Kaadi dan mencetak nilai numeriknya.

Detail

Masukkan karakter

Sistem Kaadi didasarkan pada aturan sistem Katapayadi , tetapi hanya menggunakan baris konsonan pertama. Teks Anda di sini telah ditransliterasi ke alfabet Latin, dan hanya diketahui mengandung:

  • vokal 'a', 'e', ​​'i', 'o', 'u'
  • konsonan 'g', 'k', 'c', 'j', dan bentuk modal mereka (untuk mewakili bentuk aspirasi dari konsonan tersebut), dan 'ṅ' dan 'ñ'.

(Anda dapat memilih untuk menerima dan menangani 'ṅ' sebagai 'ng' dan 'ñ' sebagai 'ny' jika itu lebih nyaman dalam bahasa Anda.)

Penugasan nilai

Dalam sistem ini,

  1. setiap konsonan ketika diikuti oleh vokal memiliki angka yang terkait dengannya. Ini adalah:

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

Namun perlu dicatat, bahwa nilai-nilai ini hanya berlaku ketika konsonan ini diikuti oleh vokal. kacCimemiliki nilai yang sama dengan kaCi( ka, Ci= (1,7)) karena c tengah tidak ditemani oleh vokal.

  1. Selain itu, sebuah vokal awal atau urutan dua vokal merupakan 0. aikaCiakan menjadi: ai, ka, Ci= (0,1,7)

  2. Vokal ekstra di mana pun di tengah teks tidak memiliki nilai: kauCiasama dengan kaCi, vokal tambahan dapat diabaikan.

Nilai numerik akhir

Setelah nilai-nilai digit dari huruf-huruf telah diketahui, nilai numerik akhir diperoleh sebagai urutan kebalikan dari angka-angka itu yaitu digit pertama dari teks adalah digit paling tidak signifikan dalam nilai akhir.

Misalnya.
GucCimemiliki Gudan Ci, jadi (4, 7), sehingga nilai akhirnya adalah 74.
kakakaGoadalah (1,1,1,4), jadi jawabannya adalah 4111.
guṅKoadalah (3,2), jadi mengkodekan 23. ( gungKojika menggunakan ASCII - Setara.)

Memasukkan

  • Sebuah string yang berisi teks yang dikodekan Kaadi
    • hanya akan berisi vokal dan konsonan di atas
    • vokal selalu dalam huruf kecil dan muncul dalam kelompok yang tidak lebih dari 2
    • Anda dapat memilih untuk menerima huruf untuk 5 dan 0 baik sebagai karakter Unicode mereka 'ṅ' dan 'ñ' atau sebagai padanan ASCII mereka 'ng' dan 'ny' (mereka dalam huruf kecil dalam bentuk apa pun)
    • Anda mungkin menganggap tidak ada spasi atau tanda baca

Keluaran

  • Nilai numerik teks, seperti yang diberikan oleh aturan di atas
    • untuk input kosong, output kosong atau output false-y dalam bahasa pilihan Anda dapat diterima, selain 0
    • untuk input yang tidak valid (input dengan selain vokal dan konsonan di atas), output tidak terdefinisi - apapun berjalan

Uji kasus

"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

(yang terakhir dapat:

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

jika Anda lebih suka.)

Aturan standar untuk I / O dan celah berlaku. Semoga pegolf terbaik menang!


1
Bisakah aiaKacidiinput? (3 vokal terkemuka)
Erik the Outgolfer

Juga tidak ada test case yang diakhiri dengan konsonan; dapatkah kita berasumsi bahwa input akan selalu diakhiri dengan vokal?
Erik the Outgolfer

Tidak untuk 3 vokal terkemuka. Bahkan, saya pikir tidak masuk akal untuk 3 vokal konsekuen terjadi di mana saja di input (2 vokal bahasa Inggris kadang-kadang diperlukan untuk mewakili satu suara vokal bahasa Sansekerta, tetapi tidak pernah 3). Bisakah saya menambahkan itu sebagai batasan input sekarang atau sudah terlambat?
sundar - Reinstate Monica

2
Belum terlambat untuk mengklarifikasi bahwa input tidak akan memiliki 3 vokal terkemuka. Itu tidak akan merusak kiriman apa pun, dan saya ragu ada orang yang menulis kode lebih lama untuk memperhitungkannya, dan jika ada, mereka bisa menghapusnya. Ngomong-ngomong, pertanyaan pertama yang bagus! :)
Stewie Griffin

2
Dalam kasus ini membantu dalam beberapa bahasa: ord(c)%47%10memberikan indeks unik [0..9]untuk setiap konsonan. (Dengan ord("ṅ")=7749dan ord("ñ")=241.)
Arnauld

Jawaban:


5

JavaScript (ES6), 83 byte

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

Cobalah online!

Bagaimana?

Kami menggunakan ekspresi reguler berikut untuk mencocokkan awal string atau salah satu konsonan Kaadi, diikuti oleh vokal:

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

Untuk setiap kecocokan dalam string input, kami menjalankan fungsi panggilan balik berikut yang mengambil konten c dari grup penangkap sebagai parameter:

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

Kami menemukan nilai konsonan dengan mencari posisinya dalam ekspresi reguler (dipaksa ke string dengan menambahkannya ke dirinya sendiri).

Konsonan disusun sedemikian rupa sehingga nilainya sama dengan posisi modulo 10 mereka :

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  -  ...

Ketika kita mencocokkan awal string dengan konsonan, c adalah string kosong yang posisinya dalam ekspresi reguler adalah 0 - yang, dengan mudah, adalah hasil yang diharapkan dalam kasus tersebut.

Akhirnya, kami memasukkan digit ini di awal string keluaran o .


4

Retina , 41 byte

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

V`

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

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

Menerjemahkan konsonan yang diikuti oleh vokal.

^[aeiou]
0

Tangani vokal terkemuka.

\D

Hapus yang lainnya.

V`

Balikkan hasilnya.


4

Python 2 , 93 byte

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

Fungsi yang tidak disebutkan namanya menerima string Unicode yang mengembalikan representasi string dari hasil sepuluh basis.

Cobalah online!


3

Java 8, 136 126 byte

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

Cobalah online.

Penjelasan:

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

Jelly , 27 byte

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

Cobalah online!

Jelly memiliki built-in untuk ... 1-byte .

Penjelasan


Żµ             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.

Saya tidak menemukan cara untuk menghemat byte dengan itu, tetapi O%47%10memberikan indeks unik [0...9]untuk setiap konsonan. (Yang berarti bahwa O%47dengan modulo implisit akan memungkinkan untuk mengambil nilai yang benar dalam array 10 entri.)
Arnauld

1
@Arnauld 6;µe€Øẹœpṫ€0O%47ị“ ʠḷ’Œ?’¤Ṛtetapi juga 27 kecuali bisa golf.
Jonathan Allan

3

Python 2 , 101 byte

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]

Cobalah online!

Python 3 , 104 102 byte

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]

Cobalah online!


Diselamatkan

  • -3 byte, terima kasih kepada Rod

Nah, Anda bisa jika Anda menambahkan header , tapi saya lupa awalan unicode di string, setelah semua, itu akan menghemat satu byte
Rod

@Rod, ah terima kasih, saya sudah lupa tentang awalan unicode :)
TFeld

1

JavaScript (Node.js) , 126 byte

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

Cobalah online!


1
Anda dapat menyimpan beberapa byte dengan mengubah x=[..."ñkKgGṅcCjJ"]hanya x="ñkKgGṅcCjJ"karena indexOfkarya-karya dengan Strings terlalu
WaffleCohn

1
Ini tampaknya tidak memperlakukan vokal awal sebagai 0, jadi gagal uji kasus 3 dan 6 (seperti dapat dilihat pada Output pada TIO).
sundar - Reinstate Monica

@sundar saya buruk, Tetap.
Luis felipe De jesus Munoz

1

Merah , 152 143 byte

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]

Cobalah online!

Dapat dibaca:

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 byte

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

Cobalah online!

('b' bukannya 'd' untuk menyimpan byte)
(-2 byte terima kasih kepada Luis Mendo)

MATLAB (dan karenanya MATL) memperlakukan string sebagai serangkaian byte bodoh membuat porting solusi Python @ TFeld lebih sulit daripada yang saya bayangkan (mungkin solusi loop lurus akan lebih mudah di sini?). Akhirnya menggunakan alternatif 'ng', 'ny'metode input, dan mengganti ngdenganb di awal untuk diproses lebih mudah.

Penjelasan:

        % 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

Terima kasih sudah selesai Apakah Anda tahu jika MATLAB / Octave memiliki sesuatu untuk diindeks ke / iterate melalui string di Unicode codepoints bukan byte? Tidak terlihat seperti itu, dukungan Unicode mereka tampak buruk secara umum, tetapi mungkin saya melewatkan sesuatu.
sundar - Reinstate Monica

1
Juga, manual MATL menyebutkan "jika input adalah string atau karakter array" di beberapa tempat - apakah kedua hal itu berbeda? Ada hubungannya dengan string baru yang dikutip ganda di MATLAB?
sundar - Reinstate Monica

1
Matlab punya unicode2native, tapi saya pikir itu yang Anda inginkan. Saya setuju, dukungan Unicode di MATLAB bukan yang terbaik. Dan jangan mulai saya dengan Octave :-D Adapun MATL, itu dirancang sebelum tipe data string yang baru ada di MATLAB (dan saya tidak terlalu menyukainya), jadi dalam MATL "string" adalah sama seperti dulu dalam versi MATLAB lama: vektor baris karakter. Saya telah membuat catatan untuk mengklarifikasi bahwa dalam dokumentasi, terima kasih telah memperhatikan!
Luis Mendo

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.