発音番号


14

概念

数字を覚えるのは難しい場合があります。単語を覚える方が簡単かもしれません。大きな数字を記憶するために、私はそれらをリーツピークのような方法で発音する方法を作りました。

ルール

各数字は、最初に対応する文字に置き換えられます。

0 => O
1 => I
2 => R
3 => E
4 => A
5 => S
6 => G
7 => T
8 => B
9 => P

置換後、発音を改善するために2つの追加処理が行われます。

  • 2つの子音の間に、a Uが追加されます。

  • 2つの母音の間に、a Nが追加されます。

例/テストケース

512431 => SIRANENI
834677081 => BENAGUTUTOBI
3141592 => ENINANISUPUR
1234567890 => IRENASUGUTUBUPO
6164817 => GIGABIT

不可能なこと

  • 同じ単語に混在する文字と数字
  • 2つの連続した子音または2つの連続した母音
  • 上記のリストにない文字
  • その他のキャラクター

ルール

このの目標は、このコンセプトの双方向トランスレータを作成することです。

  • プログラムは、文字から数字への変換であるか、数字から文字への変換であるかを最初に理解する必要があります。
  • エントリが適切に形成されていることを確認する必要があります。
  • すべてが正しければ、翻訳を表示します。
  • それ以外の場合は、エラーメッセージを表示し、何も表示せず、偽の値を返すか、プログラムをクラッシュさせます。

詳細

  • 入力番号/文字列は、任意の形式(stdin、argument、...)で入力できます。
  • これはなので、最短の回答が勝ちます。
  • 標準的な抜け穴は禁止されています。

11
するべきではGIGATESTERないGIGATESUTER
kamoroso94

5
通常、エントリは「適切に形成された」ものである必要はありません。これは正当な理由がないための単なる追加コードであるためです(適切なチャレンジの推奨事項については、メタ質問を参照してください)。さらに、「適切に形成された」とはどういう意味ですか?
Okx

9
入力の検証が必要な場合は、無効な入力(特にほとんど有効な文字のみの入力)のテストケースのまともなバッチを含める必要があります。これが実際に多くの言語の課題の主要部分になると期待しています。
マーティンエンダー

2
@MartinEnderに同意しますAB23。無効なケースには、次のようないくつかのテストケースを追加する必要があります。AEI; BB; Z; ACE; giga; !@#$; -123; などまた、検証ルールに基づいて、我々は変換することができ6164735732 => GIGATESTERますが、GIGATESTERための、偽の値になりますST(二つの連続する子音のルール)。チャレンジの現在の設定方法では、チャレンジの主な部分は変換ではなく検証です。私はそれで問題ありませんが、その場合は検証をもう少し良く定義する必要があります。
ケビンCruijssen

2
プログラムは、文字から数字への変換または数字から文字への変換の場合、最初に単独でアンダーサンドする必要があります。それでは、翻訳は双方向でなければなりませんか?前述のテキストとテストケースは、文字に数字のみを示しています
ルイスメンドー

回答:


5

JavaScript(ES6)、130バイト

両方の翻訳方法で入力を文字列として受け取ります。翻訳を文字列として、またはfalse無効な入力の場合に返します。

f=(n,k)=>(t=n.replace(/./g,(c,i)=>1/n?(!i|p^(p=27>>c&1)?'':'UN'[p])+s[c]:~(x=s.search(c))?x:'',p=s='OIREASGTBP'),k)?t==k&&n:f(t,n)

デモ


完全に機能しない場合は、投稿しないでください。
Okx

期待どおりに動作することを願っています。
アーナルド

...または、入力に予約された正規表現文字がある場合にクラッシュします。それでも有効
-edc65

2

Japt61 59 92 85 84バイト

(長い)週末のほとんどはオフラインです。これでさらに問題が発見された場合は、修正できる時間まで修正を依頼してください。

両方の操作のための文字列として入力を受け取り、同様または両方のための文字列を返しfalse、無効なinput.Assumes番号の入力が常に交換1バイト追加し、複数の数字が含まれますためにはUn<space>それが有効ではない場合。falseテストケースに戻りますGIGATESTERが、ルールに従って無効な入力である必要があります。


V="OIREASGTBP"UÉ?¡VgXÃe"%v"²_i1'NÃe"%V"²_i1'UÃ:!Uè"%v%v|%V%V|[^{V}NU]" ©Ur"N|U" £VaX

試してみてください: 数字->文字または文字->数字


  • 2 4バイトはobarakonに感謝しました。obarakonは、それを以前に放棄した後、再び取り上げるように説得しました。彼がいなかったらいいのに!
  • 33 26 25(!)バイトは、入力の有効性をチェックするためのクイックフィックスの実装を犠牲にしました(つまり、まだ完全にゴルフされていません)。

説明

(まだ最新バージョンに更新されています)

                          :Implicit input of string U.
V="..."                   :Assign the string of letters to variable V, in order.
UÉ                        :Subtract 1 from U, which will give a number (truthy) if the input is a number or NaN (falsey) if the input is a string.
?                         :If it's a number then
¡                         :    Map over the input string, replacing each character (digit) with ...
VgX                       :      the character in string V at index X, the current digit.
à                        :    End mapping.
e                         :    Recursively replace ...
"%v"²                     :      every occurrence of 2 vowels (RegEx) ...
_i1'N                     :      with the current match with an "N" inserted at index 1.
à                        :    End replacement.
e                         :    Another recursive replacement of ...
"%V"²                     :      every occurrence of 2 non-vowel characters (i.e., consonants) ...
_i1'U                     :      with the current match with a "U" inserted at index 1.
à                        :    End replacement.
:                         :Else, if it's a string then
Uè"%v%v|%V%V|[^{V}NU]"    :    Count the number of matches of 2 successive vowels OR 2 successive non-vowels OR any character not in contained in string V plus N & U.
                          :    (The longest part of this code is the fecking input validation!)
?                         :    If that count is greater than 0 then
T                         :       Return 0.
:                              Else
Ur"N|U"                   :        Replace every occurrence of "N" OR "U" in string U with nothing.
£                         :        Map over the string, replacing each character (letter) with ...
VaX                       :         the index of the current character X in string V.
                          :Implicit output of resulting string

次のような無効な入力を処理していないようですAEI
-Emigna

@エミグナ:ああ、ゴッドダムニット!最初の「ルール」に最初に火傷を負った後、残りのルールを読むことを考えていたでしょう。:\これらのポイントのいずれも処理する必要がないことを意味するために、「不可能なこと」セクションを取り上げました。修正は近日中に行われます。
シャギー


1

Java(OpenJDK 8)416 410 399 382 376 370バイト

@Cyoceのおかげで-2バイト

@Cyoceのアイデアのおかげで-17バイト増加

@KevinCruijssenのおかげで-6バイト

s->{String c="[RSGTBP]",v="[OIEA]",o="([256789])",e="([0134])";boolean b=s.matches("(c$|v$|(c|vN)(?=v)|(cU|v)(?=c))+".replace("c",c).replace("v",v));int i=-1;for(s=b?s.replaceAll("[UN]",""):s.matches("[0-9]+")?s.replaceAll(e+"(?="+e+")","$1N").replaceAll(o+"(?="+o+")","$1U"):i/0+"";i<9;s=b?s.replace(v,c):s.replace(c,v)){c=++i+"";v="OIREASGTBP".charAt(i)+"";}return s;}

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

ああ、Javaの置換は非常に冗長です。

文字列を取り、数字->文字またはその逆から変換された文字列を返す関数。無効な入力でクラッシュする(最初の10個のテストケースの正しい値を出力し、デバッグビューに表示されるゼロ除算エラーでクラッシュするtioの例でこれを確認できます)

Ungolfed(forループの最初と最後の用語は読みやすくするために省略されています)

s-> {
    String c="[RSGTBP]", v="[OIEA]", o="([256789])", e="([0134])"; 
    boolean b=s.matches("(c$|v$|(c|vN)(?=v)|(cU|v)(?=c))+".replace("c",c).replace("v",v)); // lovely regex, explained below
    int i=-1;
    s= b? 
        s.replaceAll("[UN]",""); // remove N's and U's
        :s.matches("[0-9]+")?
        s.replaceAll(e+"(?="+e+")","$1N").replaceAll(o+"(?="+o+")","$1U"); // add N's and U's for separating vowels and consonants
        :i/0+""; // throw an error, looks like a sting for the ternary
    for(;i<9;) { 
        c=++i+"";
        v="OIREASGTBP".charAt(i)+"";
        s=b?s.replace(v,c):s.replace(c,v); // if it started with numbers, go to letters, or vice versa
    }
    return s;
}

数字を照合するための正規表現は簡単ですが、文字と数字を照合するための正規表現は次のとおりです

(c$|v$|(c|vN)(?=v)|(cU|v)(?=c))+
(                             )+   every part of the word is
 c$                                a consonant at the end of the word
   |v$                             or a vowel at the end of the word
      |(c|vN)(?=v)                 or a consonant or a vowel + N followed by a vowel
                  |(cU|v)(?=c)     or a consonant + U or a vowel followed by a consonant


with c = [RSGTBP] and v = [OIEA]

大量のバイトカウントが大幅に改善されるわけではありませんが、括弧を削除することができます(s)->
チョイス

@Cyoceすべてのバイトが役立ちます
-PunPun1000

ifステートメントのブランチはすべて代入(値を返す)であるため、if... else if... elseを条件演算子?:に置き換えObject _=て、有効なステートメントにするためにそれを前に付けてみてください。これが実際にバイトカウントに役立つかどうかはわかりませんが、そうなると思います。
チョイス

ゴルフできる2つの小さなこと。String tは一度しか使用しないため、削除できます。そのため(-4バイト)にt.charAt(i)+""なります。そして、for-loop宣言内の後にfor-loop内に最後の行を配置できます。したがって、(-1バイト)になります。ああ、そしてfor-loopのすぐ後に来るものを置くことができます:(-1バイト)。"OIREASGTBP".charAt(i)+""i<9;for(;i<9;s=b?s.replace(v,c):s.replace(c,v)){s=b?...int i=-1;for(s=b?...;i<9;...
ケビンCruijssen

1

PHP; 129の127 267 259 228バイト

$l=IOREASGTBP;$n=1023456789;ctype_digit($s=$argn)?:$s=preg_replace("#U|N#","",strtr($o=$s,$l,$n));for($r=$c=($t=strtr($s,$n,$l))[$i++];$d=$t[$i++];)$r.=((trim($c,AEIO)xor$x=trim($d,AEIO))?X:UN[!$x]).$c=$d;echo$o?$o==$r?$s:"":$r;

パイプとして実行する-nR、オンラインで試してください

壊す

$l=IOREASGTBP;$n=1023456789;
# if not digits, translate letters to digits and remember original
ctype_digit($s=$argn)?:$s=preg_replace("#U|N#","",strtr($o=$s,$l,$n));
# translate digits to letters:
for($r=$c=($t=strtr($s,$n,$l))                      # result = first letter
    [$i++];$d=$t[$i++];)                            # loop through letters
    $r.=((trim($c,AEIO)xor$x=trim($d,AEIO))?"":UN[!$x]) # append delimiter if needed
        .$c=$d;                                         # append next letter
# 
echo
    $o              # if original was remembered,
        ?$o==$r         # compare original to final result
            ?$s         # if equal, print digits
            :X          # else print X (as error message)
        :$r;        # else print letters

1

Java 8、312 308 304 301 294 290バイト

s->{String r="",x="([AEIOU])",y="([BGNPRST])",z="0O1I2R3E4A5S6G7T8B9P";for(int c:s.getBytes())r+=c!=78&c!=85?z.charAt((c=z.indexOf(c)+(c<58?1:-1))<0?0:c):"";return s.matches("(("+x+y+")*"+x+"?)|(("+y+x+")*"+y+"?)|\\d*")?r.replaceAll(x+"(?="+x+")","$1N").replaceAll(y+"(?="+y+")","$1U"):"";}

バグ修正のために-4バイト(308→304)(コードのバグを修正したときにバイトカウントが減少することはあまりありません。:D)

編集:@ PunPun1000のJavaの答えとは異なるアプローチを使用します最初に文字のforループでreturn-Stringを作成し、次により抽象的な正規表現を使用してreturn-ternaryで検証します(入力はすべて数字、または、与えられた母音と子音が交互になります(隣接する母音も子音もありません)。

説明:

ここで試してみてください。

s->{                                   // Method with String parameter and String return-type
  String r="",                         //  Result-String
    x="([AEIOU])",y="([BGNPRST])",     //  Two temp Strings for the validation-regex
    z="0O1I2R3E4A5S6G7T8B9P";          //  And a temp-String for the mapping
  for(int c:s.getBytes())              //  Loop over the characters of the input-String
    r+=                                //   Append to the result-String:
       c!=78&c!=85?                    //    If the character is not 'N' nor 'U':
        z.charAt(                      //     Get the character from the temp-String `z`
         (c=z.indexOf(c)+              //      by getting the character before or after the current character
            +(c<58?1:-1))              //      based on whether it's a digit or not
             <0?0:c)                   //      and a 0-check to prevent errors on incorrect input like '!@#'
       :                               //    Else:
        "";                            //     Append nothing
                                       //  End of loop (implicit / single-line body)
  return s.matches("(("+x+y+")*"+x+"?)|(("+y+x+")*"+y+"?)|\\d*")?
                                       //  If the input is valid
                                       //  (Only containing the vowels and consonants of `x` and `y`, without any adjacent ones. Or only containing digits)
    r                                  //   Return the result
     .replaceAll(x+"(?="+x+")","$1N")  //    after we've added 'N's if necessary
     .replaceAll(y+"(?="+y+")","$1U")  //    and 'U's if necessary
   :"";                                //  Or return an Empty String if invalid
}                                      // End of method

検証正規表現:

(([AEIOU][BGNPRST])*[AEIOU]?)|(([BGNPRST][AEIOU])*[BGNPRST]?)|\\d*


0

バッシュ241 238 235バイト

q=OIREASGTBP;[[ $1 == +([0-9]) ]]&&(x=`tr 0-9 $q<<<$1`;m={B,G,P,R,S,T};n={A,E,I,O};for i in `eval echo $m$m$n$n`;{ a=${i::1};b=${i:1:1};x=${x//$a$b/$a'U'$b};a=${i:2:1};b=${i:3:1};x=${x//$a$b/$a'N'$b};};echo $x)||tr $q 0-9<<<$1|tr -d UN

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

少ないゴルフ:

q=OIREASGTBP;                          save string in q
[[ $1 == +([0-9]) ]]&&(                if argument 1 is only digits
x=`tr 0-9 $q<<<$1`;                    save in x each digit translated to corresponding letter
m={B,G,P,R,S,T};
n={A,E,I,O};
for i in `eval echo $m$m$n$n`;{        generates all combinations of vowels and consonants
                                       BBAA BBAE ... TTOI TTOO
   a=${i::1};                          saves first consonant in a
   b=${i:1:1};                         saves second consonant in b
   x=${x//$a$b/$a'U'$b};               insets U between consonants
   a=${i:2:1};                         saves first vowel in a
   b=${i:3:1};                         saves second vowel in b
   x=${x//$a$b/$a'N'$b};               inserts N between vowels
};
echo $x                               echoes result
)||                                   if argument contains letters
  tr $q 0-9<<<$1|tr -d UN             translates letter to corresponding number and deletes U and N


0

Perl、127バイト

126バイト+ 1バイトのコマンドライン

$i="AEIOU]";$;=OIREASGTBP;1/!/[^$;NU\d]|[$i{2}|[^\d$i{2}/;eval"y/0-9$;NU/$;0-9/d";s/[$i\K(?=[$i)/N/g;s/[^N\d$i\K(?=[^\d$i)/U/g

使用法:

 echo -n "512431" | perl -p entry.pl

すべてのチャレンジルールに従う必要があります-文字または数字を受け入れることができ、検証が失敗した場合はエラー(ゼロ除算)になります


検証では、入力NOとで誤検出がありUSます。
バリューインク

0

ルビー、205 + 1 = 206バイト

-p+1バイトのフラグを使用します。徹底的な入力検証システムが導入されました。

d,w=%w"0-9 OIREASGTBP"
~/^\d+$/?($_.tr!d,w
gsub /([#{a='AEIO])(?=\g<1>)'}/,'\0N'
gsub /([^#{a}/,'\0U'):(+~/^(([AEIO])(N(?=[AEIO])|(?=\g<4>)|$)|([RSGTBP])(U(?=\g<4>)|(?=\g<2>|$)))+$/;$_.tr!("NU","").tr!w,d)

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


これは、文字を数字に変換したり、検証を行ったりしないようです!
Jarmex

@Jarmexおっと、検証が追加されました!それは巨大な検証チェックだが、私は問題に多くの選択肢を持っていない
バリューインク

0

Python 3、741バイト

from functools import reduce;c=0;e="";n="NU";v="AEIOU";l="OIREASGTBPNU";x=('0','O'),('1','I'),('2','R'),('3','E'),('4','A'),('5','S'),('6','G'),('7','T'),('8','B'),('9','P');s=input()
try:
    int(s);y=reduce(lambda a,kv:a.replace(*kv),x,s)
    for i in y:
        e+=i
        if i in v:
            z=True
            try:
                if y[c+1] in v:e+="N"
            except:
                pass
        else:
            z=False
            try: 
                if not y[c+1] in v:e+="U"
            except:
                pass
        c+=1
except:
    for i in s:
        if not i in l:
            p
    y=reduce(lambda a,kv:a.replace(*kv[::-1]),x,s)
    for i in y: 
        if not i in n:e+=i
print(e)

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

改善の余地はたくさんあります。


0

sed、123バイト

s/[0134]/_&_/g
s/[25-9]/=&=/g
ta
y/OIREASGTBPU/0123456789N/
s/N//g
q
:a
s/__/N/g
s/==/U/g
y/0123456789_/OIREASGTBP=/
s/=//g

説明

まず、数字を_(母音の場合)または=(子音の場合)で囲みます。

置換を行わなかった場合、文字を数字に変換しているので、単純な置換であり、delete Uおよびを削除しNます。その後、終了します。

それ以外の場合、label aに分岐し、連続する母音を処理してから、連続する子音を処理します。次に、数字を文字に変換し、最初のステップで導入したマーカー文字を削除します。


0

Python3、246バイト

v=lambda x:x in"AEIO"
V="OIREASGTBP"
i=input()
r=__import__("functools").reduce
print(r(lambda x,y:x+(("U",""),("","N"))[v(x[-1])][v(y)]+y,map(lambda x:V[x],map(int,i)))if i.isdigit()else r(lambda x,y:x*10+V.index(y),filter(lambda x:x in V,i),0))    

説明:

  • 入力をintのリストにマップします
  • intのリストをアルファベットの位置にマップします
  • アキュムレータを追加することで、リストを縮小、プラスの要素辞書タプルの要素、および現在の要素を
    • 辞書のタプルは2つの要素である母音か否かに基づいて真理値表であります

0

JavaScript(ES6)、120

入力を文字列として受け取る関数。入力が有効な場合は適切に翻訳された文字列を返し、そうでない場合はfalseまたは関数がクラッシュします。

n=>(t=n=>n.replace(/./g,d=>1/d?(v-(v=d<5&d!=2)?'':'UN'[v])+z[d]:~(a=z.search(d))?a:'',v=2,z='OIREASGTBP'))(q=t(n))==n&&q

少ないゴルフ

n => 
{
  var t = n => { // function to translate, no check for invalid input
    var v = 2; // 1 = digit map to vowel, 0 = digit map to consonant, start with 2
    var z = 'OIREASGTBP'; // digits mapping
    return n.replace(/./g,
      d => 1/d // digit / alpha check
        ? ( // if digit
            w = v, // save previous value of v
            v = d < 5 & d != 2, // check if current digit will map to wovel or consonant
            (w != v 
             ? '' // if different - wovel+consonant or consonant+wovel or start of input
             : 'UN'[v] // if equal, insert required separator
            ) + z[d] // add digit translation
          )
        : ( // if alpha
             a = z.search(d), // look for original digit. Could crash if d is a reserved regexp char (not valid input)
             a != -1 ? a : '' // if digit found add to output, else do nothing
          )
    )
  }

  var q = t(n); // translate input an put in q
  if (t(q) == n) // translate again, result must be == to original input
    return q; // if ok return result
  else
    return false; // else return false
}

テスト

var F=
n=>(t=n=>n.replace(/./g,d=>1/d?(v-(v=d<5&d!=2)?'':'UN'[v])+z[d]:~(a=z.search(d))?a:'',v=2,z='OIREASGTBP'))(q=t(n))==n&&q

;`512431 => SIRANENI
834677081 => BENAGUTUTOBI
3141592 => ENINANISUPUR
1234567890 => IRENASUGUTUBUPO
6164817 => GIGABIT`
.split('\n')
.forEach(x => {
  var [a,b] = x.match(/\w+/g)
  var ta = F(a)
  var tb = F(b)
  console.log(a==tb ? 'OK':'KO', a + ' => '+ ta)
  console.log(b==ta ? 'OK':'KO', b + ' => '+ tb)
})

function go() {
  O.textContent = F(I.value)
}

go()
<input id=I value='NUNS' oninput='go()'>
<pre id=O></pre>

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