Kaadi sisteminin kodunun çözülmesi


14

Eski bir Hint el yazmasıyla karşılaştınız, gömülü hazinenin höyüklerini tanımlayan. Makale ayrıca, bazı önemli sayıların metne dolaylı olarak kodlanması dışında, hazinenin yerini de anlatır. Metnin daha yaygın 'Katapayadi' sisteminin sınırlı bir alt kümesi olan bir 'Kaadi' sistemi kullandığını anlıyorsunuz.

( Katapayadi sistemi, sayıları harf olarak kodlayan, genellikle uzun sayıları hatırlamak için anımsatıcılar olarak kullanılan eski bir Hint sistemidir.)

Buradaki göreviniz Kaadi sisteminde kodlanan metnin kodunu çözmek ve sayısal değeri yazdırmaktır.

ayrıntılar

Giriş karakterleri

Kaadi sistemi Katapayadi sisteminin kurallarına dayanır , ancak sadece ünsüzlerin ilk sırasını kullanır. Buradaki metniniz Latin alfabesine çevrildi ve yalnızca içerdiği biliniyor:

  • sesli harfleri 'a', 'e', ​​'i', 'o', 'u'
  • ünsüzler 'g', 'k', 'c', 'j' ve bunların sermaye formları ( bu ünsüzlerin emişli biçimini temsil etmek için ) ve 'ṅ' ve 'ñ'.

(Eğer dilinizde daha uygunsa 'ṅ' ve 'ng' ve 'ñ' almayı 'ny' olarak almayı seçebilirsiniz.)

Değer atama

Bu sistemde,

  1. her ünsüzün ardından bir sesli harf onunla ilişkili bir rakam içerir. Bunlar:

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

Ancak, bu değerlerin yalnızca bu ünsüzleri bir sesli harf izlediğinde geçerli olduğunu unutmayın. orta c'nin bir sesli harfle eşlik etmediği için ( , = (1,7)) ile kacCiaynı değere sahiptir . kaCikaCi

  1. Buna ek olarak, iki sesli bir ilk sesli harf veya bir dizi 0 temsil aikaCiolacaktır: ai, ka, Ci= (0,1,7)

  2. Metnin ortasında bir yerde Ekstra ünlüler değeri yoktur: kauCiaaynıdır kaCi, ekstra ünlüler göz ardı edilebilir.

Nihai sayısal değer

Harflerin basamak değerleri çözüldükten sonra, son sayısal değer, bu basamakların ters sırası olarak elde edilir, yani metindeki ilk basamak, son değerdeki en küçük basamaktır.

Örneğin.
GucCiyer alır Guve Cibu yüzden son değeri 74 olacak şekilde (4, 7),
kakakaGobir cevap 4111. yani, (1,1,1,4) olan
guṅKobir (3,2), yani (23. kodlayan gungKoASCII kullanılıyorsa -eşdeğer.)

Giriş

  • Kaadi kodlu bir metin içeren bir dize
    • yalnızca sesli harfleri ve yukarıdaki ünsüzleri içerecektir
    • ünlüler her zaman küçük harflidir ve 2'den fazla olmayan gruplar halinde oluşur
    • 5 ve 0 harflerini Unicode karakterleri 'ṅ' ve 'ñ' veya ASCII eşdeğerleri 'ng' ve 'ny' olarak kabul etmeyi seçebilirsiniz (her iki biçimde de küçük harflerle yazılır)
    • boşluk veya noktalama işareti olmadığını varsayabilirsiniz.

Çıktı

  • Yukarıdaki kurallarda verildiği gibi metnin sayısal değeri
    • boş girdi için boş bir çıktı veya seçtiğiniz dilde herhangi bir yanlış y çıktısı 0'a ek olarak kabul edilebilir
    • geçersiz giriş için (sesli harfler ve yukarıdaki ünsüzler dışında herhangi bir şeyle giriş), çıktı tanımsız - her şey gidiyor

Test senaryoları

"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

(sonuncusu şunlar olabilir:

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

bunu tercih ederseniz.)

G / Ç ve boşluklar için standart kurallar geçerlidir. En iyi golfçü kazanabilir!


1
Girilebilir aiaKacimi? (3 önde gelen ünlü)
Outgolfer Erik

Ünsüzle biten bir test durumu da yoktur; girişin her zaman bir sesli harfle biteceğini varsayabilir miyiz?
Outgolfer Erik

3 önde gelen sesli harf için hayır. Aslında, girişte herhangi bir yerde 3 sesli harfin ortaya çıkmasının mantıklı olduğunu düşünmüyorum (bazen bir Sanskritçe sesli harf sesini temsil etmek için 2 İngilizce sesli harf gerekir, ancak asla 3). Bunu şimdi bir giriş kısıtı olarak ekleyebilir miyim yoksa çok geç mi?
sundar - Monica'yı yeniden

2
Girişin 3 önde gelen sesli harfine sahip olmayacağını açıklığa kavuşturmak için çok geç değil. Bu herhangi bir başvuru kırmayacak ve kimse bunu dikkate almak için daha uzun kod yazdım şüpheliyim ve eğer varsa, sadece kaldırabilirsiniz. Bu arada güzel bir ilk soru! :)
Stewie Griffin

2
Bazı dillerde yardımcı olması durumunda: her ünsüz için ord(c)%47%10benzersiz bir dizin verir [0..9]. (İle ord("ṅ")=7749ve ord("ñ")=241.)
Arnauld

Yanıtlar:


5

JavaScript (ES6), 83 bayt

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

Çevrimiçi deneyin!

Nasıl?

Dizenin başlangıcını veya Kaadi ünsüzlerinden birini ve ardından bir sesli harfle eşleşen aşağıdaki normal ifadeyi kullanırız:

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

Giriş dizesindeki her eşleşme için , yakalama grubunun c içeriğini parametre olarak alan aşağıdaki geri arama işlevini çağırırız:

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

Ünsüzün değerini, normal ifadedeki konumunu arayarak buluruz (bir dizeye kendisine ekleyerek zorlanır).

Ünsüzler, değerleri modulo 10 konumlarına eşit olacak şekilde sıralanır :

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

Bir ünsüz yerine dizenin başlangıcıyla eşleştiğimizde, c , normal ifadedeki konumu 0 olan boş bir dizedir - bu, uygun bir şekilde, bu durumda beklenen sonuçtur.

Son olarak, bu rakamı o çıktı dizesinin başına ekleriz .


4

Retina , 41 bayt

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

V`

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. explantion:

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

Ünlüleri takip eden ünsüzleri çevirin.

^[aeiou]
0

Önde gelen bir sesli harf kullanın.

\D

Diğer her şeyi silin.

V`

Sonucu tersine çevirin.


4

Python 2 , 93 bayt

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

Temel on sonucunun dize olarak temsil edilen bir Unicode dizesini kabul eden adsız bir işlev.

Çevrimiçi deneyin!


3

Java 8, 136126 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

Jöle , 27 bayt

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

Çevrimiçi deneyin!

Jelly yerleşik ... 1 bayt .

açıklama


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

Bununla bayt kaydetmenin bir yolunu bulamadım, ancak her ünsüz için O%47%10benzersiz bir dizin veriyor [0...9]. (Bu O%47, örtülü modulo'unun 10 girişlik bir dizide doğru değeri almasına izin vereceği anlamına gelir .)
Arnauld

1
@ Golf olabilir 6;µe€Øẹœpṫ€0O%47ị“ ʠḷ’Œ?’¤Ṛama aynı zamanda 27 golf olabilir.
Jonathan Allan

3

Python 2 , 101 bayt

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]

Çevrimiçi deneyin!

Python 3 , 104102 bayt

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]

Çevrimiçi deneyin!


Kayıtlı

  • Rod sayesinde -3 bayt

Eh, sen eğer başlık eklemek , ama dizeleri unicode öneki unuttum, herşeye rağmen, tek bayt kurtaracak
Çubuk

@Rod, ah teşekkürler, unicode önekini unutmuştum :)
TFeld

1

JavaScript (Node.js) , 126 bayt

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

Çevrimiçi deneyin!


1
Eğer değiştirerek birkaç byte kaydedebilirsiniz x=[..."ñkKgGṅcCjJ"]lazım x="ñkKgGṅcCjJ"çünkü indexOfStrings'in eserleri de
WaffleCohn

1
Bu ilk ünlüleri tedavi etmiyor gibi görünmektedir 0, bu nedenle test vakaları 3 ve 6'yı başarısız kılar (TIO'daki Çıktı'da görülebileceği gibi).
sundar - Monica'yı yeniden

@ sundar Benim hatam, Sabit.
Luis felipe De jesus Munoz

1

Kırmızı , 152 143 bayt

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]

Çevrimiçi deneyin!

Okunabilir:

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 bayt

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

Çevrimiçi deneyin!

(bayt kaydetmek için 'd' yerine 'b')
(Luis Mendo sayesinde -2 bayt)

MATLAB (ve dolayısıyla MATL) dizeleri aptal bir dizi bayt olarak ele almak, TFeld'in Python çözümünü hayal ettiğimden daha zor hale getirdi (belki de düz bir döngü çözümü burada daha kolay olurdu?). Daha kolay işleme için alternatif 'ng', 'ny'giriş yöntemini kullanarak ve yerine başlangıç ngile değiştirildi b.

Açıklama:

        % 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

Teşekkürler, bitti. MATLAB / Octave, bir bayt yerine Unicode kod noktaları üzerinden bir dizeye dizin / yineleme yapmak için bir şey olup olmadığını biliyor musunuz? Öyle görünmüyor, Unicode desteği genel olarak acımasızca kötü görünüyor, ama belki bir şey kaçırdım.
sundar - Monica'yı yeniden

1
Ayrıca, MATL elkitabı birkaç girişte "girdi bir dize veya karakter dizisi ise" den bahsediyor - bu iki farklı şey mi? MATLAB'daki yeni çift ​​tırnaklı dizelerle ilgili bir şey var mı?
sundar - Monica'yı yeniden eski haline

1
Matlab var unicode2native, ama bence şimdi istediğiniz bu. Kabul ediyorum, MATLAB'daki Unicode desteği en iyisi değil. Ve beni Octave ile başlatmayın :-D MATL'ye gelince, MATLAB'de yeni dize veri türü bulunmadan önce tasarlandı (ve yine de çok sevmiyorum), bu yüzden MATL'de bir "dize" aynı eski MATLAB versiyonlarında olduğu gibi: karakterlerin bir satır vektörü. Belgelerde bunu açıklığa kavuşturmak için not aldım, fark ettiğiniz için teşekkürler!
Luis Mendo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.