Kaadiシステムのデコード


14

埋もれた宝の山を描いた古いインドの写本に出会いました。原稿には宝物の場所も記載されていますが、一部の重要な数字は間接的にテキストにエンコードされています。テキストは、より一般的な「カタパヤディ」システムの制限されたサブセットである「カアディ」システムを使用していることがわかります。

カタパヤディシステムは、数字を文字としてエンコードする古代インドのシステムで、長い数字を覚えるためのニーモニックとしてよく使用されます。)

ここでのタスクは、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と同じ値を持ち、kaCikaCi中央のcには母音が伴わないため、は =(1,7))。

  1. さらに、2つの母音の最初の母音または配列は0を表し、aikaCi次のようになりますaikaCi=(0,1,7)

  2. テキストの真ん中の他の場所にある余分な母音にkauCiaは値がありません:kaCiはと同じで、余分な母音は無視できます。

最終的な数値

文字の数字が計算されると、それらの数字の逆順として最終的な数値が取得されます。つまり、テキストの最初の数字が最終値の最下位桁になります。

例えば。
GucCihas GuCi、(4、7)なので、最終値は74
kakakaGoです。(1,1,1,4)なので、答えは4111です。
guṅKoある(3,2)ので、(23をコードgungKoASCIIを使用する場合-同等。)

入力

  • Kaadiエンコードされたテキストを含む文字列
    • 母音と上記の子音のみが含まれます
    • 母音は常に小文字で、2個以下のグループで発生します
    • Unicode文字「ṅ」と「ñ」または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つの主要な母音)
エリックアウトゴルファー

子音で終わるテストケースもありません。入力が常に母音で終わると仮定できますか?
エリックアウトゴルファー

3つの主要な母音には使用できません。実際、入力のどこでも3つの結果母音が発生するのは理にかなわないと思います(1つのサンスクリット語母音を表すために2つの英語母音が必要になることもありますが、3つになることはありません)。今すぐ入力制約として追加できますか、それとも遅すぎますか?
スンダ

2
入力に3つの主要な母音がないことを明確にするのに遅すぎません。それは提出物を壊すことはありませんし、それを考慮に入れるより長いコードを書いた人はいないと思います。もし持っていれば簡単に削除できます。ちなみに最初の質問です。:)
スチューイーグリフィン

2
いくつかの言語で役立つ場合:子音ごとにord(c)%47%10一意のインデックスを[0..9]提供します。(ord("ṅ")=7749およびord("ñ")=241。)
アーナルド

回答:


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の先頭にこの数字を挿入します。


4

網膜、41のバイト

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

V`

オンラインでお試しください!リンクにはテストケースが含まれます。外植:

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Ḍ

オンラインでお試しください!

Jellyの組み込み機能... 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
@Arnauldです6;µe€Øẹœpṫ€0O%47ị“ ʠḷ’Œ?’¤Ṛが、ゴルフができない場合は27です。
ジョナサンアラン

3

Python 2 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の3104の 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バイト、ロッドのおかげ

さて、あなたはあなたができる場合は、ヘッダーを追加しますが、私は、文字列の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
Stringsでも動作するのでに変更x=[..."ñkKgGṅcCjJ"]することで数バイトを節約できますx="ñkKgGṅcCjJ"indexOf
-WaffleCohn

1
これは0、最初の母音をとして処理していないようです。そのため、テストケース3と6は失敗します(TIOの出力で確認できます)。
スンダ

@sundar私の悪い、修正済み。
ルイスフェリペデジェススムニョス

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

MATL48 47 45バイト

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

オンラインでお試しください!

(バイトを保存するには、「d」の代わりに「b」)
(ルイスバイトのおかげで2バイト)

MATLAB(したがってMATL)は、文字列を一連の無意味なバイトとして処理するため、@ TFeldのPythonソリューションの移植を想像以上に困難にしました(ここでは、ストレートループソリューションの方が簡単だったのでしょうか?)。代替'ng''ny'入力メソッドを使用して終了しngb容易に処理するために初めに。

説明:

        % 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に、バイトではなくUnicodeコードポイント全体の文字列をインデックス化/反復するものがあるかどうかを知っていますか?そのようには見えませんが、Unicodeサポートは一般的にひどく悪いように見えますが、私は何かを見逃したかもしれません。
スンダ

1
また、MATLマニュアルでは、「入力が文字列または文字配列である場合」について2、3の場所で言及していますが、これら2つの違いはありますか?MATLABの新しい二重引用符で囲まれた文字列と何か関係がありますか?
スンダ

1
Matlabにはがunicode2nativeありますが、私はそれが今あなたが望むものだと思います。私は同意します、MATLABでのUnicodeサポートは最適ではありません。Octaveを始めないでください:-D MATLに関しては、MATLABに新しい文字列データ型が存在する前に設計された(そして、とにかくあまり好きではありません)ので、MATLでも「文字列」は同じです以前のMATLABバージョンで使用されていたように、文字の行ベクトル。気づいてくれてありがとう、ドキュメントでそれを明確にするためにメモをしました!
ルイスメンドー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.