การถอดรหัสระบบ Kaadi


14

คุณได้พบกับต้นฉบับอินเดียโบราณเล่มหนึ่งที่อธิบายถึงสมบัติที่ฝังอยู่ ต้นฉบับยังบอกตำแหน่งของสมบัติให้คุณยกเว้นว่ามีการเข้ารหัสตัวเลขสำคัญบางอย่างในทางอ้อม คุณเข้าใจว่าข้อความใช้ระบบ 'Kaadi' ซึ่งเป็นชุดย่อยที่ จำกัด ของระบบ 'Katapayadi' ที่ใช้กันทั่วไปมากกว่า

( ระบบ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

หากคุณต้องการมัน)

กฎระเบียบมาตรฐานสำหรับI / Oและช่องโหว่ใช้ ขอให้นักกอล์ฟที่ดีที่สุดชนะ!


1
สามารถaiaKaciป้อนข้อมูลได้หรือไม่ (3 เสียงสระชั้นนำ)
Erik the Outgolfer

ไม่มีกรณีทดสอบที่ลงท้ายด้วยตัวอักษร; เราสามารถสมมติว่าอินพุตจะลงท้ายด้วยสระได้หรือไม่
Erik the Outgolfer

ไม่มี 3 สระชั้นนำ ในความเป็นจริงฉันไม่คิดว่ามันจะสมเหตุสมผลสำหรับเสียงสระที่เกิดขึ้น 3 ครั้งที่ใดก็ได้ในอินพุต (บางครั้งจำเป็นต้องใช้สระภาษาอังกฤษ 2 สระเพื่อแสดงเสียงสระภาษาสันสกฤตหนึ่งเสียง แต่ไม่เคย 3) ฉันสามารถเพิ่มเข้าไปในข้อ จำกัด การป้อนข้อมูลในขณะนี้หรือมันสายเกินไป?
sundar - Reinstate Monica

2
มันไม่สายเกินไปที่จะชี้แจงว่าการป้อนข้อมูลจะไม่มีเสียงสระนำ 3 ตัว นั่นจะไม่ทำลายการส่งใด ๆ และฉันสงสัยว่ามีใครเขียนโค้ดอีกต่อไปเพื่อพิจารณาเรื่องนั้นและหากพวกเขามีก็สามารถลบออกได้ คำถามแรกที่ดีโดยวิธี! :)
Stewie Griffin

2
ในกรณีที่ช่วยในบางภาษา: ord(c)%47%10ให้ดัชนีที่ไม่ซ้ำกัน[0..9]สำหรับแต่ละพยัญชนะ (ด้วยord("ṅ")=7749และord("ñ")=241.)
Arnauld

คำตอบ:


5

JavaScript (ES6), 83 ไบต์

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

ลองออนไลน์!

อย่างไร?

เราใช้การแสดงออกปกติต่อไปนี้เพื่อจับคู่ทั้งจุดเริ่มต้นของสตริงหรือหนึ่งในพยัญชนะ Kaadi ตามด้วยสระ:

/(^|[ṅ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 o


4

เรติน่า 41 ไบต์

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

V`

ลองออนไลน์! ลิงก์มีกรณีทดสอบ explantion:

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Ḍ

ลองออนไลน์!

เยลลี่มีในตัวสำหรับ ... 1 ไบต์ 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 รายการ.)
Arnauld

1
@Annauld 6;µe€Øẹœpṫ€0O%47ị“ ʠḷ’Œ?’¤Ṛแต่ยัง 27 เว้นแต่ว่ามันจะสามารถgolfed
Jonathan Allan

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 ไบต์ขอบคุณ Rod

ดีคุณถ้าคุณสามารถเพิ่มส่วนหัวแต่ฉันลืมคำนำหน้า Unicode ในสตริงหลังจากทั้งหมดมันจะประหยัด byte เดียว
ร็อด

@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ทำงานกับ Strings ด้วย
WaffleCohn

1
ดูเหมือนว่านี่จะไม่ใช้เสียงสระเริ่มต้น0ดังนั้นจึงล้มเหลวในกรณีทดสอบ 3 และ 6 (ดังที่เห็นได้ในเอาท์พุท TIO)
sundar - Reinstate Monica

@sundar ฉันไม่ดีคงที่
Luis felipe De jesus Munoz

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 ไบต์ขอบคุณ Luis Mendo)

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 มีสิ่งใดที่ทำดัชนีลงใน / iterate ผ่านสตริงข้าม Unicode codepoints แทนที่จะเป็นไบต์? ดูเหมือนว่าจะไม่สนับสนุน Unicode ของพวกเขาดูเหมือนเลวร้ายโดยทั่วไป แต่ฉันอาจจะพลาดบางสิ่งบางอย่าง
sundar - Reinstate Monica

1
นอกจากนี้คู่มือ MATL ยังกล่าวถึง "ถ้าอินพุตเป็นสตริงหรืออาร์เรย์อักขระ" ในสองแห่ง - สองสิ่งนั้นต่างกันหรือไม่? จะทำอย่างไรกับสตริงที่ยกมาเป็นคู่ใหม่ที่หรูหราใน MATLAB?
sundar - Reinstate Monica

1
Matlab มีunicode2nativeแต่ฉันคิดว่านั่นคือสิ่งที่คุณต้องการ ฉันเห็นด้วยว่าการสนับสนุน Unicode ใน MATLAB นั้นไม่ใช่สิ่งที่ดีที่สุด และอย่าให้ฉันเริ่มต้นด้วย Octave: - D สำหรับ MATL มันถูกออกแบบมาก่อนชนิดข้อมูลสตริงใหม่ที่มีอยู่ใน MATLAB (และฉันไม่ชอบมันมากเลย) ดังนั้นใน MATL a "string" เหมือนกัน เหมือนที่เคยเป็นในรุ่น MATLAB แบบเก่า: เวกเตอร์แถวของตัวอักษร ฉันได้ทำบันทึกเพื่อชี้แจงว่าในเอกสารขอขอบคุณสำหรับการสังเกต!
Luis Mendo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.