Kaadi 시스템 디코딩


14

당신은 매장 된 보물의 고분을 묘사하는 오래된 인도의 원고를 발견했습니다. 또한 원고는 보물의 위치를 ​​알려줍니다. 단, 일부 중요한 숫자는 텍스트에 간접적으로 인코딩되어 있습니다. 텍스트가 더 일반적인 'Katapayadi'시스템의 제한된 하위 집합 인 'Kaadi'시스템을 사용한다는 것을 알았습니다.

합니다 ( 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

그러나이 값은 자음 뒤에 모음이있을 때만 적용됩니다. 중간 c는 모음에 의해 수반되지 않으므로 ( , = (1,7)) kacCi과 동일한 값을 갖습니다 . kaCikaCi

  1. 또한, 두 개의 모음의 초기 모음 또는 시퀀스가 0을 나타내는 aikaCi것 : ai, ka, Ci= (0,1,7)

  2. 텍스트 중간의 다른 곳에있는 추가 모음에는 값이 없습니다. kauCia와 동일하지만 kaCi추가 모음은 무시할 수 있습니다.

최종 숫자 값

문자의 숫자 값이 계산되면 최종 숫자 값은 해당 숫자의 역순으로 얻어집니다. 즉, 텍스트의 첫 번째 숫자는 최종 값에서 가장 작은 숫자입니다.

예 :
GucCi보유 Gu하고 Ci, 따라서 최종 값은 74이되도록 (4, 7),
kakakaGo상기 응답이 4111.가되도록, (1,1,1,4)은
guṅKo인 (3,2)이므로 (23 인코딩 gungKoASCII를 사용하는 경우 -동등한.)

입력

  • Kaadi로 인코딩 된 텍스트가 포함 된 문자열
    • 모음과 위의 자음 만 포함합니다
    • 모음은 항상 소문자이며 2 이하의 그룹으로 나타납니다.
    • 유니 코드 문자 'ṅ'및 'ñ'또는 ASCII 문자 'ng'및 'ny'로 5와 0의 문자를 허용하도록 선택할 수 있습니다 (둘 중 어느 형식이든 소문자로 표시됨)
    • 공백이나 문장 부호가 없다고 가정 할 수 있습니다.

산출

  • 위의 규칙에 따라 텍스트의 숫자 값
    • 빈 입력의 경우 0 외에 빈 출력 또는 선택한 언어로 된 false-y 출력이 허용됩니다.
    • 유효하지 않은 입력 (모음 및 위 자음 이외의 입력)의 경우 출력이 정의되지 않습니다.

테스트 사례

"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

자음으로 끝나는 테스트 케이스도 없습니다. 입력이 항상 모음으로 끝나는 것으로 가정 할 수 있습니까?
아웃 골퍼 에릭

3 개의 주요 모음에는 해당되지 않습니다. 실제로, 입력의 어느 곳에서나 3 개의 결과 모음이 발생하는 것은 의미가 없다고 생각합니다 (Sanskrit 모음 사운드를 나타내는 데 2 ​​개의 영어 모음이 필요하지만 결코 3 개는 아닙니다). 입력 제약 조건으로 추가하거나 너무 늦을 수 있습니까?
sundar-복원 모니카

2
입력에 3 개의 주요 모음이 없음을 명확히하기에는 아직 늦지 않았습니다. 그것은 제출을 중단시키지 않으며, 누군가가 그것을 고려하기 위해 더 긴 코드를 작성했는지 의심합니다. 그런데 좋은 첫 질문! :)
Stewie Griffin

2
일부 언어에서 도움이되는 경우 : 각 자음마다 ord(c)%47%10고유 한 색인을 제공합니다 [0..9]. (와 ord("ṅ")=7749ord("ñ")=241.)
Arnauld

답변:


5

자바 스크립트 (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 의 시작 부분에 삽입합니다 .


4

레티 나 , 41 바이트

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

V`

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 외식 :

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

모음 다음에 자음을 번역하십시오.

^[aeiou]
0

선행 모음을 처리하십시오.

\D

다른 모든 것을 삭제하십시오.

V`

결과를 반대로하십시오.



3

자바 8, 136126 바이트

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 바이트 .

설명


Żµ             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
골프를 타지 6;µe€Øẹœpṫ€0O%47ị“ ʠḷ’Œ?’¤Ṛ않는 한 @Arnauld 뿐만 아니라 27.
Jonathan Allan

3

파이썬 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]

온라인으로 사용해보십시오!

파이썬 3 , 104102 바이트

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]

온라인으로 사용해보십시오!


저장되었습니다

  • Rod 덕분에 -3 바이트

글쎄, 당신은 당신이 할 수있는 경우 헤더를 추가 ,하지만 난 문자열에서 유니 코드 접두사를 잊고, 결국, 단일 바이트를 절약 할 수
로드

@로드, 아, 고마워, 나는 유니 코드 접두사에 대해 잊어 버렸습니다 :)
TFeld

1

자바 스크립트 (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
Strings에서도 작동 하므로 다음 으로 변경 x=[..."ñkKgGṅcCjJ"]하여 몇 바이트를 절약 할 수 있습니다.x="ñkKgGṅcCjJ"indexOf
WaffleCohn

1
이것은 초기 모음을로 취급하지 않는 것으로 보이 0므로 테스트 사례 3 및 6에 실패합니다 (TIO의 출력에서 ​​볼 수 있음).
sundar-복원 모니카

@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

온라인으로 사용해보십시오!

(바이트를 저장하려면 'd'대신 'b')
(Luis Mendo 덕분에 2 바이트)

문자열을 멍청한 일련의 바이트로 취급하는 MATLAB (및 MATL)은 @TFeld의 Python 솔루션 포팅을 상상했던 것보다 어렵게 만들었습니다. 대체하여 결국 '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에 바이트 대신 유니 코드 코드 포인트를 통해 문자열을 색인화하거나 반복 할 항목이 있는지 알고 있습니까? 그렇지 않은 것처럼, 그들의 유니 코드 지원은 일반적으로 엄청나게 나쁜 것처럼 보이지만 어쩌면 나는 뭔가를 놓쳤습니다.
sundar-복원 모니카

1
또한 MATL 매뉴얼에는 "입력이 문자열 또는 문자 배열 인 경우"라는 두 곳이 언급되어 있습니다. 두 가지가 다른가요? MATLAB의 새롭고 큰 따옴표로 묶인 문자열 과 관련이 있습니까?
sundar-복원 모니카

1
Matlab은을 가지고 unicode2native있지만 지금은 당신이 원하는 것이라고 생각합니다. MATLAB의 유니 코드 지원이 최고가 아니라는 데 동의합니다. 그리고 Octave로 시작하지 마십시오 :-D MATL의 경우 MATLAB에 새로운 문자열 데이터 유형이 존재하기 전에 설계되었습니다 (그리고 나는 그것을별로 좋아하지 않습니다). 예전의 MATLAB 버전에서 사용 되었기 때문에 문자의 행 벡터입니다. 나는 문서에서 그것을 주목 해 주셔서 감사합니다!
Luis Mendo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.