Telaffuz numaraları


14

kavram

Sayıları hatırlamak zor olabilir. Bir kelimeyi hatırlamak daha kolay olabilir. Büyük sayıları ezberlemek için, bunları leetspeak benzeri bir şekilde telaffuz etmenin bir yolunu yarattım.

kurallar

Her basamak ilk olarak karşılık gelen harfiyle değiştirilir:

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

Değiştirmeden sonra, telaffuzu geliştirmek için iki ek şey yapılır:

  • İki ünsüz arasına a Ueklenir.

  • İki sesli harf arasına a Neklenir.

Örnekler / test senaryoları

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

İmkansız ne

  • Harfler ve sayılar aynı kelimede karışık
  • İki ardışık ünsüz veya iki ardışık sesli harf
  • Yukarıdaki listede olmayan harfler
  • Diğer karakterler

kurallar

Bu amacı, bu konsept için 2 yönlü bir çevirmen yaratmaktır.

  • Programınız önce harf-sayı veya sayı-harf çeviri olup olmadığını kendi başına anlamalıdır.
  • Girişin düzgün bir şekilde oluşturulup oluşturulmadığını kontrol etmelidir.
  • Her şey doğruysa çeviriyi görüntüleyin.
  • Başka, bir hata mesajı görüntülemek, hiçbir şey, bir falsey değeri döndürmek veya programı çökmesine.

ayrıntılar

  • Giriş numarası / dize istediğiniz formatta girilebilir (stdin, argüman, ...)
  • Bu , bu yüzden en kısa cevap kazanır.
  • Standart boşluklar yasaktır.

11
Gerekmiyor GIGATESTERolmak GIGATESUTER?
kamoroso94

5
Genellikle, girişin 'düzgün bir şekilde oluşturulmasını' istemeyiz, çünkü iyi bir sebep olmaksızın ekstra koddur (iyi meydan okuma önerileri için meta soruya bakın). Ayrıca, 'uygun şekilde biçimlendirilmiş' ne demektir?
Okx

9
Giriş doğrulaması gerekiyorsa, geçersiz girişlerin (özellikle neredeyse geçerli olan yalnızca harf girişleri) makul sayıda test senaryosu eklemeniz gerekir . Bunun aslında birçok dilde mücadelenin ana parçası olacağını umuyorum.
Martin Ender

2
@MartinEnder ile geçersiz durumlar için bazı test senaryoları eklemeniz gerektiği konusunda hemfikirim AB23; AEI; BB; Z; ACE; giga; !@#$; -123; Ayrıca, doğrulama kurallarına dayanarak, dönüştürebiliriz 6164735732 => GIGATESTER, ancak (birbirini takip eden iki ünsüz kural) GIGATESTERnedeniyle yanlış bir değerle sonuçlanır ST. Meydan okumanızın şu anda oluşturulma şekli, meydan okumanın ana kısmı dönüşüm yerine doğrulamadır. Bununla iyiyim, ancak bu durumda doğrulama biraz daha iyi tanımlanmalıdır.
Kevin Cruijssen

2
Program, harf-sayı veya sayıdan harfe çeviri ise önce kendi başına anlaşılmalıdır. Öyleyse çeviri iki yönlü olmalı? Önceki metin ve test senaryoları yalnızca harf
yazmayı

Yanıtlar:


5

JavaScript (ES6), 130 bayt

Girdiyi her iki çeviri biçiminde dize olarak alır. Çeviriyi dize olarak veya falsegeçersiz bir girdi olması durumunda döndürür .

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)

gösteri


Mükemmel çalışmıyorsa, yayınlamayın.
Okx

Umarım şimdi beklendiği gibi çalışır.
Arnauld

... veya girişte regexp karakterleri rezerve edildiğinde çökebilir. Yine de geçerli
edc65

2

Japt , 61 59 92 85 84 bayt

(Uzun) hafta sonlarının çoğu için çevrimdışıyım, bununla ilgili başka bir sorun tespit edilirse, lütfen bir modun, düzeltebileceğim bir zamana kadar benim için silmesini isteyin.

Her iki işlem için bir dizge olarak girdi alır ve sıra veya her ikisi için bir dize döndürür falsedeğiştirilmesi 1 byte ekleyin sayı girişleri her zaman birden basamak içerecek geçersiz input.Assumes için birlikte Un<space>o geçerli değilse. falseTest durumu için döndürür , GIGATESTERancak kurallara göre geçersiz giriş olmalıdır .


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

Deneyin: Sayılar -> Harfler veya Harfler -> Sayılar


  • 2 4 bayt beni daha önce terk ettikten sonra tekrar almam için ikna eden obarakon'a teşekkür etti . Keşke olmasaydı!
  • 33 26 25 (!) Bayt, giriş geçerliliğini kontrol etmek için hızlı bir düzeltme (yani, tam olarak golf oynamak için) uygulamaktan kurban edilmiştir.

açıklama

(Henüz en son sürüme güncellenmemiş)

                          :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

Gibi geçersiz giriş işlemek için görünmüyorAEI
Emigna

@Emigna: Ah, lanet olası! Başlangıçta ilk "Kural" tarafından yakıldıktan sonra, kuralların geri kalanını okumayı düşünürdük! : \ Bu noktaların hiçbirini ele almak zorunda kalmayacağımızı ima etmek için "İmkansız nedir" bölümünü aldım.
Shaggy


1

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

@Cyoce sayesinde -2 bayt

@Cyoce tarafından geliştirilen bir fikir sayesinde -17 daha fazla bayt

@KevinCruijssen sayesinde -6 bayt

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

Çevrimiçi deneyin!

Ugh, java değişimi çok ayrıntılı.

Bir dize alan ve sayıdan çevrilen dizeyi döndüren işlev -> harf veya tam tersi. Geçersiz girişteki çökmeler (bunu ilk 10 test vakası için doğru değerleri çıkardığı ve hata ayıklama görünümünde gösterilen sıfıra bölme hatasıyla çöktüğü tio örneğinde görebilirsiniz)

Ungolfed (for döngüsünün ilk ve son terimi okunabilirlik için çıkarılır)

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

Sayıları eşleştirmek için normal ifade basit, ancak burada harfleri sayılarla eşleştirmek için normal ifade

(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]

Büyük bayt sayınızı önemli ölçüde iyileştirdiğinden değil, ancak parantezleri kaldırabilirsiniz(s)->
Cyoce

@Cyoce her bayt yardımcı olur
PunPun1000

İfadenin tüm şubeleri if(bir değer döndüren) atamalar olduğundan, if... else if... ifadesini elsekoşullu ?:işleçle değiştirmeyi deneyin ve Object _=bunu geçerli bir ifade haline getirmek için kullanın. Bunun bayt sayımına gerçekten yardımcı olup olmayacağından emin değilim, ama olacağını düşünüyorum.
Cyoce

Golf yapabileceğiniz iki küçük şey. Dizeyi tyalnızca bir kez kullandığınız için kaldırabilirsiniz . Yani t.charAt(i)+""olur "OIREASGTBP".charAt(i)+""( -4 byte ). Ve son satırı, ilmek i<9;döngüsü bildiriminin iç kısmından sonra for döngüsü içine yerleştirebilirsiniz. Böylece for(;i<9;s=b?s.replace(v,c):s.replace(c,v)){( -1 bayt ) olur. Oh, ve bunu for-loop'un s=b?...hemen arkasından da koyabilirsiniz int i=-1;: for(s=b?...;i<9;...( -1 byte ).
Kevin Cruijssen

1

PHP; 127 267 259 129 228 bayt

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

Pipo ile çalıştırın -nRveya çevrimiçi deneyin .

Yıkmak

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

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

Hata düzeltmesi için -4 bayt (308 → 304) (kodumdaki bir hatayı düzelttiğimde bayt sayısının azaldığı sıklıkla olmaz ..: D)

DÜZENLEME: Karakterler üzerinde bir for- loop'ta return-String'i oluşturarak @ PunPun1000'in Java yanıtından farklı bir yaklaşım kullanır ve ardından dönüş üçgeninde doğrulamak için daha soyut bir normal ifade kullanır (giriş ya tüm basamaklar, veya verilen ünlüler ve ünsüzler dönüşümlüdür (bu nedenle bitişik sesli harfler veya ünsüzler olmadan).

Açıklama:

Burada deneyin.

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

Doğrulama normal ifadesi:

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

0

05AB1E , 76 bayt

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

Çevrimiçi deneyin!

0Geçersiz giriş için yanlış değerini döndürür .


0

Bash ,241 238 235 bayt

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

Çevrimiçi deneyin!

Daha az 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

0

PHP, 268 Bayt

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

Çevrimiçi deneyin!


0

Perl, 127 bayt

126 bayt + 1 bayt komut satırı

$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

Kullanımı:

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

Tüm meydan okuma kurallarına uymalı - harfleri veya sayıları kabul edebilir ve doğrulama başarısız olursa hata verir (sıfıra bölme)


Doğrulamanın giriş NOve üzerinde yanlış pozitifleri var US.
Değer Mürekkep

0

Yakut , 205 + 1 = 206 bayt

-p+1 baytlık bayrağını kullanır . Şimdi kapsamlı bir giriş doğrulama sistemi ile.

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)

Çevrimiçi deneyin!


Bu, harfleri sayılara dönüştürmüyor veya herhangi bir doğrulama yapmıyor!
Jarmex

@Jarmex ayy, doğrulama eklendi! Bu çok büyük bir doğrulama kontrolü ama çok fazla seçeneğim yok
Value Ink

0

Python 3, 741 bayt

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)

Çevrimiçi deneyin!

İyileştirmek için çok yer var, biliyorum.


0

sed, 123 bayt

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

açıklama

İlk olarak, rakamları _(ünlüler için) veya =(ünsüzler için ) ile çevreliyoruz .

Eğer herhangi bir değişiklik yapmadıysak, harfleri rakamlara dönüştürüyoruz, bu yüzden basit bir değişiklik ve sil Uve sil N. Sonra çıkın.

Aksi takdirde, aardışık ünlüler ve ardından ardışık ünsüzlerle uğraştığımız etikete yöneliriz. Ardından rakamları harflere dönüştürün ve ilk adımda tanıttığımız işaretçi karakterlerini silin.


0

Python3, 246 bayt

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

açıklama:

  • girdiyi int listesine eşle
  • int listesini alfabedeki konumlarına göre göster
  • akümülatör ekleyerek bir dikte demetinin bir öğesini ve geçerli öğeyi ekleyerek listeyi azalt
    • dict tanımlama grubu iki unsur olmanın sesli harfle veya dayalı doğru bir tablodur

0

JavaScript (ES6), 120

Dizeyi girdi olarak alan bir işlev. Giriş geçerliyse, yanlışsa veya işlev çökerse, uygun şekilde çevrilmiş dizeyi döndürür.

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

Daha az 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
}

Ölçek

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.