Giải mã hệ thống Kaadi


14

Bạn đã bắt gặp một bản thảo cũ của Ấn Độ, một bản mô tả các ụ của kho báu bị chôn vùi. Bản thảo cũng cho bạn biết vị trí của kho báu, ngoại trừ một số con số quan trọng đã được mã hóa gián tiếp vào văn bản. Bạn nhận ra rằng văn bản sử dụng hệ thống 'Kaadi', một tập hợp con bị hạn chế của hệ thống 'Katapayadi' phổ biến hơn.

( Hệ thống Katapayadi là một hệ thống Ấn Độ cổ đại để mã hóa các chữ số dưới dạng chữ cái, thường được sử dụng làm ký hiệu để ghi nhớ các số dài.)

Nhiệm vụ của bạn ở đây là giải mã văn bản được mã hóa trong hệ thống Kaadi và in ra giá trị số.

Chi tiết

Nhập ký tự

Hệ thống Kaadi dựa trên các quy tắc của hệ thống Katapayadi , nhưng chỉ sử dụng hàng phụ âm đầu tiên. Văn bản của bạn ở đây đã được phiên âm sang bảng chữ cái Latinh và được biết là chỉ chứa:

  • nguyên âm 'a', 'e', ​​'i', 'o', 'u'
  • phụ âm 'g', 'k', 'c', 'j', và các hình thức vốn của họ (đại diện cho hút khí dạng những phụ âm), và 'N' và 'N'.

(Bạn có thể chọn nhận và xử lý '' là 'ng' và 'ñ' là 'ny' nếu điều đó thuận tiện hơn trong ngôn ngữ của bạn.)

Giao giá trị

Trong hệ thống này,

  1. mỗi phụ âm khi theo sau một nguyên âm có một chữ số liên quan đến nó. Đó là:

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

Tuy nhiên, lưu ý rằng các giá trị này chỉ áp dụng khi các phụ âm này được theo sau bởi một nguyên âm. kacCicó cùng giá trị với kaCi( ka, Ci= (1,7)) vì phần giữa c không được kèm theo nguyên âm.

  1. Ngoài ra, một nguyên âm ban đầu hoặc chuỗi của hai nguyên âm đại diện cho một 0. aikaCisẽ là: ai, ka, Ci= (0,1,7)

  2. Nguyên âm phụ ở bất cứ nơi nào khác ở giữa văn bản không có giá trị: kauCiacũng giống như kaCi, nguyên âm phụ có thể bị bỏ qua.

Giá trị số cuối cùng

Khi các giá trị chữ số của các chữ cái đã được tìm ra, giá trị số cuối cùng được lấy là thứ tự ngược của các chữ số đó, tức là chữ số đầu tiên từ văn bản là chữ số có nghĩa ít nhất trong giá trị cuối cùng.

Ví dụ.
GucCiGuCi, vì vậy (4, 7), vì vậy giá trị cuối cùng là 74.
kakakaGolà (1,1,1,4), vì vậy câu trả lời là 4111.
guṅKolà (3,2), vì vậy mã hóa 23. ( gungKonếu sử dụng ASCII -tương đương.)

Đầu vào

  • Một chuỗi chứa văn bản được mã hóa Kaadi
    • sẽ chỉ chứa các nguyên âm và các phụ âm trên
    • nguyên âm luôn ở dạng chữ thường và xuất hiện trong các nhóm không quá 2
    • bạn có thể chọn chấp nhận các chữ cái cho 5 và 0 dưới dạng ký tự Unicode 'ṅ' và 'ñ' hoặc dưới dạng tương đương ASCII của chúng 'ng' và 'ny' (chúng ở dạng chữ thường ở dạng chữ thường)
    • bạn có thể cho rằng không có dấu cách hoặc dấu chấm câu

Đầu ra

  • Giá trị bằng số của văn bản, được đưa ra bởi các quy tắc trên
    • đối với đầu vào trống, đầu ra trống hoặc bất kỳ đầu ra sai nào trong ngôn ngữ bạn chọn đều được chấp nhận, ngoài 0
    • đối với đầu vào không hợp lệ (đầu vào với bất kỳ thứ gì ngoài nguyên âm và các phụ âm ở trên), đầu ra không được xác định - mọi thứ đều ổn

Các trường hợp thử nghiệm

"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

(những cái cuối cùng có thể là:

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

nếu bạn thích điều đó.)

Quy tắc chuẩn cho I / Osơ hở được áp dụng. Chúc các golfer giành chiến thắng tốt nhất!


1
Có thể aiaKacilà đầu vào? (3 nguyên âm hàng đầu)
Erik the Outgolfer

Cũng không có trường hợp thử nghiệm kết thúc bằng một phụ âm; chúng ta có thể giả sử đầu vào sẽ luôn luôn kết thúc bằng một nguyên âm?
Erik the Outgolfer

Không cho 3 nguyên âm hàng đầu. Trên thực tế, tôi không nghĩ rằng 3 nguyên âm có nghĩa xảy ra ở bất cứ đâu trong đầu vào (đôi khi 2 nguyên âm tiếng Anh đôi khi cần để biểu thị một âm nguyên âm tiếng Phạn, nhưng không bao giờ là 3). Tôi có thể thêm nó vào như một ràng buộc đầu vào bây giờ không hay đã quá muộn?
- Phục hồi Monica

2
Không quá muộn để làm rõ rằng đầu vào sẽ không có 3 nguyên âm hàng đầu. Điều đó sẽ không phá vỡ bất kỳ bài nộp nào và tôi nghi ngờ bất kỳ ai đã viết mã dài hơn để đưa nó vào tài khoản, và nếu họ có thể chỉ cần xóa nó. Nhân tiện câu hỏi đầu tiên! :)
Stewie Griffin

2
Trong trường hợp nó giúp trong một số ngôn ngữ: ord(c)%47%10đưa ra một chỉ mục duy nhất [0..9]cho mỗi phụ âm. (Với ord("ṅ")=7749ord("ñ")=241.)
Arnauld

Câu trả lời:


5

JavaScript (ES6), 83 byte

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

Hãy thử trực tuyến!

Làm sao?

Chúng tôi sử dụng biểu thức chính quy sau đây để khớp với phần đầu của chuỗi hoặc một trong các phụ âm Kaadi, theo sau là một nguyên âm:

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

Đối với mỗi trận đấu trong chuỗi đầu vào, chúng tôi gọi hàm gọi lại sau đây lấy nội dung c của nhóm bắt giữ làm tham số:

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

Chúng tôi tìm thấy giá trị của phụ âm bằng cách tìm vị trí của nó trong biểu thức chính quy (được ép buộc thành một chuỗi bằng cách thêm nó vào chính nó).

Các phụ âm được sắp xếp theo cách sao cho giá trị của chúng bằng với vị trí 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  -  ...

Khi chúng ta khớp với phần đầu của chuỗi thay vì phụ âm, c là một chuỗi trống có vị trí trong biểu thức chính là 0 - một cách thuận tiện, là kết quả mong đợi trong trường hợp đó.

Cuối cùng, chúng tôi chèn chữ số này vào đầu chuỗi đầu ra o .


4

Võng mạc , 41 byte

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

V`

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải thích:

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

Dịch các phụ âm được theo sau bởi các nguyên âm.

^[aeiou]
0

Xử lý một nguyên âm hàng đầu.

\D

Xóa mọi thứ khác.

V`

Đảo ngược kết quả.


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]

Một hàm không tên chấp nhận một chuỗi Unicode trả về một chuỗi đại diện cho kết quả mười cơ sở.

Hãy thử trực tuyến!


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

Hãy thử trực tuyến.

Giải trình:

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

Thạch , 27 byte

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

Hãy thử trực tuyến!

Jelly đã tích hợp sẵn cho ... 1 byte .

Giải trình


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

Tôi đã không tìm ra cách lưu byte bằng điều đó, nhưng O%47%10đưa ra một chỉ mục duy nhất [0...9]cho mỗi phụ âm. (Điều đó có nghĩa là O%47với modulo ngầm định sẽ cho phép nhận giá trị chính xác trong một mảng gồm 10 mục.)
Arnauld

1
@Arnauld 6;µe€Øẹœpṫ€0O%47ị“ ʠḷ’Œ?’¤Ṛnhưng cũng 27 trừ khi có thể chơi gôn.
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]

Hãy thử trực tuyến!

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]

Hãy thử trực tuyến!


Đã lưu

  • -3 byte, nhờ có Rod

Chà, bạn có thể nếu bạn thêm tiêu đề , nhưng tôi đã quên tiền tố unicode trong chuỗi, sau tất cả, nó sẽ lưu một byte duy nhất
Rod

@Rod, ah cảm ơn, tôi đã quên về tiền tố 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

Hãy thử trực tuyến!


1
bạn có thể lưu một vài byte bằng cách thay đổi x=[..."ñkKgGṅcCjJ"]thành chỉ x="ñkKgGṅcCjJ"khi indexOfhoạt động với Chuỗi
WaffCohn

1
Điều này dường như không coi các nguyên âm ban đầu là 0, vì vậy không thành công trong các trường hợp thử nghiệm 3 và 6 (như có thể thấy trong Đầu ra trên TIO).
- Phục hồi Monica

@sundar Của tôi xấu, Đã sửa.
Luis felipe De jesus Munoz

1

Màu đỏ , 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]

Hãy thử trực tuyến!

Có thể đọc được

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

TOÁN , 48 47 45 byte

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

Hãy thử trực tuyến!

('b' thay vì 'd' để lưu một byte)
(-2 byte nhờ Luis Mendo)

MATLAB (và do đó MATL) xử lý các chuỗi như một chuỗi byte ngu ngốc khiến cho giải pháp Python @ TFeld trở nên khó khăn hơn tôi tưởng tượng (có lẽ một giải pháp vòng thẳng sẽ dễ dàng hơn ở đây?). Đã kết thúc bằng cách sử dụng thay thế 'ng', 'ny'phương thức nhập và thay thếng bằng blúc ban đầu để xử lý dễ dàng hơn.

Giải trình:

        % 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

Cảm ơn, xong rồi. Bạn có biết MATLAB / Octave có bất cứ điều gì để lập chỉ mục vào / lặp qua một chuỗi trên các bảng mã Unicode thay vì byte không? Nhìn không giống như vậy, nhìn chung sự hỗ trợ Unicode của họ có vẻ rất tệ, nhưng có lẽ tôi đã bỏ lỡ điều gì đó.
- Phục hồi Monica

1
Ngoài ra, hướng dẫn MATL đề cập "nếu đầu vào là một chuỗi hoặc chuỗi ký tự" ở một vài vị trí - đó có phải là hai điều khác nhau không? Bất cứ điều gì để làm với các chuỗi trích dẫn kép mới lạ mắt trong MATLAB?
- Phục hồi Monica

1
Matlab có unicode2native, nhưng tôi nghĩ đó là những gì bạn muốn. Tôi đồng ý, hỗ trợ Unicode trong MATLAB không phải là tốt nhất. Và đừng để tôi bắt đầu với Octave :-D Đối với MATL, nó được thiết kế trước khi kiểu dữ liệu chuỗi mới tồn tại trong MATLAB (và dù sao tôi cũng không thích nó lắm), vì vậy, trong MATL, một "chuỗi" cũng giống như vậy như trước đây trong các phiên bản MATLAB cũ: một vectơ hàng ký tự. Tôi đã ghi chú để làm rõ rằng trong tài liệu, cảm ơn vì đã chú ý!
Luis Mendo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.