Ucapkan angka

14

Konsep

Mengingat angka bisa sulit. Mengingat kata mungkin lebih mudah. Untuk menghafal angka besar, saya menciptakan cara untuk mengucapkannya dengan cara seperti leetspeak.

Aturan

Setiap digit pertama diganti dengan huruf yang sesuai:

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

Setelah penggantian, dua hal tambahan dilakukan untuk meningkatkan pengucapan:

  • Di antara dua konsonan, a Uditambahkan.

  • Di antara dua vokal, a Nditambahkan.

Contoh / uji kasus

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

Apa yang tidak mungkin

  • Huruf dan angka dicampur dalam kata yang sama
  • Dua konsonan berturut-turut atau dua vokal berturut-turut
  • Surat yang tidak ada dalam daftar di atas
  • Karakter lainnya

Aturan

Tujuan ini adalah untuk menciptakan penerjemah 2 arah untuk konsep ini.

  • Program Anda pertama-tama harus mengerti dengan sendirinya jika itu terjemahan dari huruf ke angka atau angka ke huruf.
  • Itu harus memeriksa entri yang akan dibentuk dengan benar.
  • Jika semuanya benar, tampilkan terjemahannya.
  • Lain, tampilkan pesan kesalahan, tidak ada, mengembalikan nilai falsey atau crash program

Detail

  • Nomor input / string dapat dimasukkan dalam format apa pun yang Anda inginkan (stdin, argumen, ...)
  • Ini , jadi jawaban tersingkat menang.
  • Celah standar dilarang.
SteeveDroz
sumber
11
Tidak GIGATESTERseharusnya GIGATESUTER?
kamoroso94
5
Biasanya, kami tidak meminta entri untuk 'dibentuk dengan benar', karena itu hanya kode tambahan tanpa alasan yang baik (lihat pertanyaan meta untuk rekomendasi tantangan yang baik). Selain itu, apa yang dimaksud dengan 'terbentuk dengan benar'?
Okx
9
Jika validasi input diperlukan, Anda harus memasukkan sejumlah besar kasus uji dari input yang tidak valid (terutama input hanya huruf yang hampir valid). Saya berharap ini akan menjadi bagian utama dari tantangan dalam banyak bahasa.
Martin Ender
2
Saya setuju dengan @MartinEnder bahwa Anda harus menambahkan beberapa kasus uji untuk kasus yang tidak valid, seperti AB23; AEI; BB; Z; ACE; giga; !@#$; -123; dll. Juga, berdasarkan aturan validasi, kita dapat mengkonversi 6164735732 => GIGATESTER, tetapi GIGATESTERakan menghasilkan nilai yang salah, karena ST(dua aturan konsonan berturut-turut). Cara tantangan Anda saat ini disiapkan, bagian utama dari tantangan adalah validasi, alih-alih konversi. Saya setuju dengan itu, tetapi validasi harus didefinisikan sedikit lebih baik dalam kasus itu.
Kevin Cruijssen
2
Program Anda pertama-tama harus undersand dengan sendirinya jika itu terjemahan dari huruf ke angka atau angka ke huruf. Jadi terjemahannya harus dua arah? Teks sebelumnya dan kasus-kasus uji menyarankan hanya nomor hingga huruf
Luis Mendo

Jawaban:

5

JavaScript (ES6), 130 byte

Mengambil input sebagai string dalam kedua cara terjemahan. Mengembalikan terjemahan sebagai string atau falsedalam kasus input yang tidak valid.

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)

Demo

Arnauld
sumber
Jika tidak berfungsi dengan baik, jangan mempostingnya.
Okx
Semoga sekarang berfungsi seperti yang diharapkan.
Arnauld
... atau macet ketika ada karakter regexp cadangan di input. Masih berlaku
edc65
2

Japt , 61 59 92 85 84 byte

Saya offline untuk sebagian besar akhir pekan (lama), jika ada masalah lagi yang ditemukan dengan ini, silakan minta mod untuk menghapusnya untuk saya sampai waktu yang saya bisa memperbaikinya.

Mengambil input sebagai string untuk kedua operasi dan mengembalikan string baik untuk maupun falseuntuk input yang tidak valid. Asumsikan jumlah input akan selalu mengandung banyak digit, tambahkan 1 byte menggantikan dengan Un<space>jika itu tidak valid. Pengembalian falseuntuk kasus uji GIGATESTERtetapi, menurut aturan, itu harus menjadi input yang tidak valid.


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

Cobalah: Bilangan -> Surat atau Surat -> Angka


  • 2 4 byte disimpan, terima kasih obarakon , yang juga meyakinkan saya untuk mengambil ini lagi setelah saya meninggalkannya sebelumnya. Saya berharap dia tidak melakukannya!
  • 33 26 25 (!) Byte dikorbankan menerapkan perbaikan cepat (yaitu, belum sepenuhnya golf) untuk memeriksa validitas input.

Penjelasan

(Belum diperbarui ke versi terbaru)

                          :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
Shaggy
sumber
Tampaknya tidak menangani input yang tidak valid sepertiAEI
Emigna
@Emigna: Ah, sial! Anda akan membayangkan, setelah terbakar oleh "Aturan" pertama pada awalnya, kami akan berpikir untuk membaca sisa peraturan! : \ Saya mengambil bagian "Apa yang tidak mungkin" untuk menyiratkan bahwa kita tidak perlu menangani salah satu dari poin-poin itu.
Shaggy
2

Python 3 , 147 byte

lambda c:c in"0134"
def f(n):
 o="";a=b=1-x(n[0])
 for i in n:
  a=x(i)
  if a==b:o+="UN"[a]
  o+="OIREASGTBP"["0123456789".index(i)];b=a
 print(o)

Cobalah online!

rusak
sumber
1

Java (OpenJDK 8) , 416 410 399 382 376 370 byte

-2 byte terima kasih kepada @Cyoce

-17 byte lebih banyak berkat sebuah ide oleh @Cyoce

-6 byte terima kasih kepada @KevinCruijssen

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

Cobalah online!

Ugh, penggantian java sangat verbose.

Fungsi yang mengambil string dan mengembalikan string yang diterjemahkan dari angka -> huruf atau sebaliknya. Gangguan pada input yang tidak valid (Anda dapat melihat ini dalam contoh tio di mana output nilai yang benar untuk 10 kasus uji pertama dan kemudian crash dengan kesalahan dibagi dengan nol yang ditampilkan dalam tampilan debug)

Tidak digabungkan (istilah pertama dan terakhir dari for loop ditarik agar mudah dibaca)

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

Regex untuk mencocokkan angka-angka itu sederhana, tetapi di sini adalah regex untuk mencocokkan huruf dengan angka case

(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]
PunPun1000
sumber
Bukan berarti secara signifikan meningkatkan jumlah byte besar Anda, tetapi Anda dapat menghapus tanda kurung sekitar(s)->
Cyoce
@Cyoce setiap byte membantu
PunPun1000
karena semua cabang dari ifpernyataan Anda adalah penugasan (yang mengembalikan nilai), coba ganti if... else if... elsedengan operator kondisional ?:, awali dengan Object _=membuatnya menjadi pernyataan yang valid. Tidak yakin apakah ini benar-benar akan membantu jumlah byte, tapi saya pikir itu akan membantu.
Cyoce
Dua hal kecil yang bisa Anda mainkan. Anda dapat menghapus String t, karena Anda hanya menggunakannya sekali. Jadi t.charAt(i)+""menjadi "OIREASGTBP".charAt(i)+""( -4 byte ). Dan Anda dapat menempatkan baris terakhir di dalam for-loop setelah di i<9;dalam deklarasi for-loop. Jadi itu menjadi for(;i<9;s=b?s.replace(v,c):s.replace(c,v)){( -1 byte ). Oh, dan Anda bisa meletakkan s=b?...yang datang tepat setelah bagian int i=-1;dalam for-loop juga: for(s=b?...;i<9;...( -1 byte ).
Kevin Cruijssen
1

PHP; 129 127 267 259 228 bytes

$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;

Jalankan sebagai pipa dengan -nRatau coba online .

kerusakan

$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
Titus
sumber
1

Java 8, 312 308 304 301 294 290 byte

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 byte (308 → 304) untuk perbaikan bug (tidak sering terjadi bahwa byte-count berkurang ketika saya memperbaiki bug dalam kode saya ..: D)

EDIT: Menggunakan pendekatan yang berbeda dari jawaban Java @ PunPun1000 dengan terlebih dahulu membuat String-kembali dalam for-loop di atas karakter, dan kemudian menggunakan regex yang lebih abstrak untuk memvalidasi di kembali-ternary (input adalah semua digit, atau apakah vokal dan konsonan yang diberikan berselang-seling (tanpa vokal atau konsonan yang berdekatan).

Penjelasan:

Coba di sini.

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

Regex validasi:

(([AEIOU][BGNPRST])*[AEIOU]?)|(([BGNPRST][AEIOU])*[BGNPRST]?)|\\d*
Kevin Cruijssen
sumber
0

05AB1E , 76 byte

.•.Ÿ^91Ý•Ul„nuSKDXSKg0QVvXyk}JYP©0Êi®}¤«SXuèŒ2ùv…U NSy0èìžMuyåOè})Jᨹd_iQ®P

Cobalah online!

Mengembalikan nilai falsy 0untuk input yang tidak valid.

Emigna
sumber
0

Pesta ,241 238 235 byte

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

Cobalah online!

Kurang golf:

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
marcosm
sumber
0

PHP, 268 Bytes

$v=OIEA;$l=RSGTBP;$d="0134256789";$c=ctype_digit;$p=preg_replace;echo!$c($a=$argn)?$c($e=strtr($p(["#\d|[$v]{2,}|[$l]{2,}#","#[$v]\KN(?=[$v])#","#[$l]\KU(?=[$l])#"],[_,"",""],$a),$v.$l,$d))?$e:_:$p(["#[$v](?=[$v])#","#[$l](?=[$l])#"],["$0N","$0U"],strtr($a,$d,$v.$l));

Cobalah online!

Jörg Hülsermann
sumber
0

Perl, 127 byte

126 byte + 1 byte baris perintah

$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

Pemakaian:

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

Harus mengikuti semua aturan tantangan - dapat menerima huruf atau angka dan akan kesalahan (pembagian dengan nol) jika validasi gagal

Jarmex
sumber
Validasi memiliki false positive pada input NOdan US.
Value Ink
0

Rubi , 205 + 1 = 206 byte

Menggunakan -pbendera untuk +1 byte. Sekarang dengan sistem validasi input lengkap.

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)

Cobalah online!

Nilai Tinta
sumber
Tampaknya ini tidak mengubah huruf menjadi angka, juga tidak melakukan validasi!
Jarmex
@Jarmex oops, tambahkan validasi! Ini adalah pemeriksaan validasi yang sangat besar tetapi saya tidak punya banyak pilihan dalam masalah ini
Value Ink
0

Python 3, 741 byte

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)

Cobalah online!

Ada banyak ruang untuk perbaikan, saya tahu.

Lirik
sumber
0

sed, 123 byte

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

Penjelasan

Pertama, kita mengelilingi angka dengan _(untuk vokal) atau =(untuk konsonan).

Jika kami tidak melakukan penggantian, kami mengonversi huruf menjadi angka, jadi itu adalah penggantian sederhana, dan hapus Udan N. Lalu berhenti.

Kalau tidak, kita bercabang untuk memberi label a, tempat kita berurusan dengan vokal berturut-turut dan kemudian konsonan berturut-turut. Kemudian, ubah digit menjadi huruf, dan hapus karakter marker yang kami perkenalkan pada langkah pertama.

Toby Speight
sumber
0

Python3, 246 byte

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

penjelasan:

  • input peta ke daftar int
  • daftar peta int ke posisi mereka di alfabet
  • kurangi daftar dengan menambahkan akumulator, plus elemen dict tuple, ditambah elemen saat ini
    • yang dict tuple adalah tabel kebenaran berdasarkan dua unsur, menjadi vokal atau tidak
Setop
sumber
0

JavaScript (ES6), 120

Fungsi mengambil input sebagai string. Ini mengembalikan string yang diterjemahkan dengan benar jika inputnya valid, kalau tidak palsu atau fungsi crash.

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

Kurang golf

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
}

Uji

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>

edc65
sumber