Zahlen aussprechen

14

Konzept

Sich an Zahlen zu erinnern kann schwierig sein. Das Erinnern an ein Wort kann einfacher sein. Um große Zahlen auswendig zu lernen, habe ich eine Art und Weise entwickelt, wie man sie leetsprachig ausspricht.

Regeln

Jede Ziffer wird zuerst durch den entsprechenden Buchstaben ersetzt:

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

Nach dem Ersetzen werden zwei zusätzliche Schritte ausgeführt, um die Aussprache zu verbessern:

  • Zwischen zwei Konsonanten wird a Uhinzugefügt.

  • Zwischen zwei Vokalen wird a Nhinzugefügt.

Beispiele / Testfälle

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

Was ist unmöglich

  • Buchstaben und Zahlen in einem Wort gemischt
  • Zwei aufeinanderfolgende Konsonanten oder zwei aufeinanderfolgende Vokale
  • Buchstaben, die nicht in der obigen Liste enthalten sind
  • Andere Charaktere

Regeln

Das Ziel dieses ist es, einen Zwei-Wege-Übersetzer für dieses Konzept zu erstellen.

  • Ihr Programm muss zunächst von selbst verstehen, ob es sich um eine Buchstaben-zu-Zahlen- oder eine Zahlen-zu-Buchstaben-Übersetzung handelt.
  • Es muss überprüft werden, ob der Eintrag ordnungsgemäß erstellt wurde.
  • Wenn alles korrekt ist, zeigen Sie die Übersetzung an.
  • Anderenfalls wird eine Fehlermeldung angezeigt, nichts, ein falscher Wert wird zurückgegeben oder das Programm stürzt ab.

Einzelheiten

  • Die eingegebene Nummer / Zeichenkette kann in einem beliebigen Format eingegeben werden (stdin, argument, ...)
  • Das ist , also gewinnt die kürzeste Antwort.
  • Standardlücken sind verboten.
SteeveDroz
quelle
11
Sollte nicht GIGATESTERsein GIGATESUTER?
Kamoroso94
5
Normalerweise bitten wir nicht darum, dass der Eintrag "richtig geformt" ist, da es sich nur um zusätzlichen Code ohne guten Grund handelt (Empfehlungen für gute Herausforderungen finden Sie in der Meta-Frage). Was bedeutet "richtig geformt"?
Okx
9
Wenn eine Eingabevalidierung erforderlich ist, sollten Sie einen anständigen Stapel von Testfällen ungültiger Eingaben (insbesondere fast gültiger Nur-Buchstaben-Eingaben ) hinzufügen. Ich gehe davon aus, dass dies in vielen Sprachen der Hauptteil der Herausforderung sein wird.
Martin Ender
2
Ich stimme @MartinEnder zu, dass Sie einige Testfälle für ungültige Fälle hinzufügen sollten, wie z AB23. AEI; BB; Z; ACE; giga; !@#$; -123; usw. Basierend auf den Validierungsregeln können wir auch konvertieren 6164735732 => GIGATESTER, führen aber GIGATESTERaufgrund von ST(Regel mit zwei aufeinanderfolgenden Konsonanten) zu einem falschen Wert . Die Art und Weise, wie Ihre Herausforderung derzeit eingerichtet ist, ist der Hauptteil der Herausforderung die Validierung anstelle der Konvertierung. Ich bin damit einverstanden, aber die Validierung sollte in diesem Fall etwas besser definiert werden.
Kevin Cruijssen
2
Ihr Programm muss zunächst von selbst verstehen, ob es sich um eine Buchstaben-zu-Zahlen- oder eine Zahlen-zu-Buchstaben-Übersetzung handelt. Die Übersetzung muss also in beide Richtungen erfolgen? Der vorhergehende Text und die Testfälle deuten nur auf eine Zahl für einen Buchstaben hin
Luis Mendo

Antworten:

5

JavaScript (ES6), 130 Byte

Übernimmt die Eingabe in beiden Übersetzungsarten als Zeichenfolge. Gibt entweder die Übersetzung als String oder falseim Falle einer ungültigen Eingabe zurück.

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
quelle
Wenn es nicht perfekt funktioniert, posten Sie es nicht.
Okx
Hoffentlich funktioniert das jetzt wie erwartet.
Arnauld
... oder abstürzen, wenn die Eingabe reservierte reguläre Zeichen enthält. Trotzdem gültig
edc65
2

Japt , 61 59 92 85 84 Bytes

Ich bin die meiste Zeit des (langen) Wochenendes offline. Wenn weitere Probleme damit auftreten, bitte einen Mod darum, sie für mich zu löschen, bis ich sie beheben kann.

Übernimmt die Eingabe als Zeichenfolge für beide Operationen und gibt eine Zeichenfolge für beide Operationen oder falsefür ungültige Eingaben zurück. Angenommen, die Zahleneingaben enthalten immer mehrere Ziffern. Fügen Sie 1 Byte hinzu und ersetzen Sie diese durch, Un<space>wenn dies nicht gültig ist. Gibt falsefür den Testfall zurück, GIGATESTERaber gemäß den Regeln sollte dies eine ungültige Eingabe sein.


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

Probieren Sie es aus: Zahlen -> Buchstaben oder Buchstaben -> Zahlen


  • 2 4 Bytes gespart dank obarakon , der mich auch überzeugt hat, dies wieder aufzunehmen, nachdem ich es früher aufgegeben habe. Ich wünschte, er hätte nicht!
  • 33 26 25 (!) Bytes wurden geopfert, um eine schnelle Lösung zu implementieren (dh noch nicht vollständig ausgereift), um die Gültigkeit der Eingabe zu überprüfen.

Erläuterung

(Muss noch auf die neueste Version aktualisiert werden)

                          :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
Zottelig
quelle
AEI
Scheint
@Emigna: Ah, verdammt noch mal! Sie können sich vorstellen, dass wir, nachdem wir anfangs von der ersten "Regel" verbrannt wurden, den Rest der Regeln gelesen hätten! : \ Ich habe den Abschnitt "Was ist unmöglich?" Gelesen, um zu implizieren, dass wir keinen dieser Punkte behandeln müssten.
Shaggy
2

Python 3 , 147 Bytes

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)

Probieren Sie es online!

verletzt
quelle
1

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

-2 Bytes dank @Cyoce

-17 weitere Bytes dank einer Idee von @Cyoce

-6 Bytes dank @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;}

Probieren Sie es online!

Ugh, Java-Ersatz ist so ausführlich.

Funktion, die eine Zeichenfolge akzeptiert und die von Zahl -> Buchstabe übersetzte Zeichenfolge zurückgibt oder umgekehrt. Abstürze bei ungültiger Eingabe (Sie können dies im Beispiel tio sehen, in dem die korrekten Werte für die ersten 10 Testfälle ausgegeben werden und dann mit einem Fehler durch Teilen durch Null abstürzt, der in der Debug-Ansicht angezeigt wird.)

Ungolfed (der erste und der letzte Term der for-Schleife werden zur besseren Lesbarkeit herausgezogen)

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

Der reguläre Ausdruck zum Abgleichen der Zahlen ist einfach, aber hier ist der reguläre Ausdruck zum Abgleichen der Buchstaben in Groß- und Kleinschreibung

(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
quelle
Nicht, dass es Ihre massive (s)->
Byteanzahl
@ Cyce jedes Byte hilft
PunPun1000
Da es sich bei allen Zweigen der ifAnweisung um Zuweisungen handelt (die einen Wert zurückgeben), ersetzen Sie den Operator if... else if... elsedurch den bedingten Operator ?:und stellen Sie Object _=ihm ein gültiges Statement voran . Ich bin mir nicht sicher, ob dies der Byte-Zählung tatsächlich helfen würde, aber ich denke, das wird es.
Cyoce
Zwei kleine Dinge, die Sie Golf spielen können. Sie können den String entfernen t, da Sie ihn nur einmal verwenden. So t.charAt(i)+""wird "OIREASGTBP".charAt(i)+""( -4 Bytes ). Und Sie können die letzte Zeile innerhalb der for-Schleife nach i<9;der for-Schleifendeklaration einfügen. So wird es for(;i<9;s=b?s.replace(v,c):s.replace(c,v)){( -1 Byte ). Oh, und Sie können das s=b?..., was direkt nach dem kommt, auch int i=-1;in die for-Schleife einfügen: 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;

Lauf als Pipe mit -nRoder versuche es online .

Nervenzusammenbruch

$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
quelle
1

Java 8, 312 308 304 301 294 290 Bytes

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 Bytes (308 → 304) für eine Fehlerbehebung (kommt nicht oft vor, dass die Byteanzahl abnimmt, wenn ich einen Fehler in meinem Code behebe ..: D)

BEARBEITEN: Verwendet einen anderen Ansatz als die Java-Antwort von @ PunPun1000, indem zuerst der Rückgabestring in einer for-Schleife über den Zeichen erstellt wird und dann ein abstrakterer regulärer Ausdruck verwendet wird, um ihn im Rückgabeternär zu validieren (die Eingabe besteht entweder aus allen Ziffern, oder wechseln sich die gegebenen Vokale und Konsonanten ab (also ohne benachbarte Vokale oder Konsonanten).

Erläuterung:

Probieren Sie es hier aus.

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

Der Validierungs-Regex:

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

05AB1E , 76 Bytes

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

Probieren Sie es online!

Gibt den falschen Wert 0für eine ungültige Eingabe zurück.

Emigna
quelle
0

Bash ,241 238 235 Bytes

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

Probieren Sie es online!

Weniger golfen:

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

Probieren Sie es online!

Jörg Hülsermann
quelle
0

Perl, 127 Bytes

126 Byte + 1 Byte Befehlszeile

$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

Verwendung:

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

Sollte alle Herausforderungsregeln befolgen - kann Buchstaben oder Zahlen akzeptieren und wird Fehler (Division durch Null), wenn die Validierung fehlschlägt

Jarmex
quelle
Die Validierung hat bei der Eingabe NOund falsch positive Ergebnisse US.
Value Ink
0

Rubin , 205 + 1 = 206 Bytes

Verwendet das -pFlag für +1 Byte. Jetzt mit einem umfassenden Eingabevalidierungssystem.

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)

Probieren Sie es online!

Wert Tinte
quelle
Dies scheint weder Buchstaben in Zahlen umzuwandeln, noch führt es eine Validierung durch!
Jarmex
@Jarmex Hoppla, zusätzliche Validierung! Es ist eine riesige Validierungsprüfung, aber ich habe nicht viel Auswahl in der Sache
Value Ink
0

Python 3, 741 Bytes

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)

Probieren Sie es online!

Ich weiß, es gibt viel Raum für Verbesserungen.

Textlich
quelle
0

sed, 123 bytes

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

Erläuterung

Zuerst umgeben wir Ziffern mit _(für Vokale) oder =(für Konsonanten).

Wenn wir keine Ersetzungen vorgenommen haben, konvertieren wir Buchstaben in Ziffern. Es handelt sich also um eine einfache Ersetzung, und löschen Uund N. Dann hör auf.

Ansonsten verzweigen wir zu label a, wo wir uns mit aufeinanderfolgenden Vokalen und dann aufeinanderfolgenden Konsonanten befassen. Wandeln Sie dann die Ziffern in Buchstaben um und löschen Sie die im ersten Schritt eingegebenen Markierungszeichen.

Toby Speight
quelle
0

Python3, 246 Bytes

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

Erläuterung:

  • Karteneingabe zu einer Liste von int
  • Ordnen Sie die Liste int ihrer Position im Alphabet zu
  • Reduzieren Sie die Liste durch Hinzufügen eines Akkumulators plus eines Elements eines Dict- Tupels plus des aktuellen Elements
    • Das Dict- Tupel ist eine Wahrheitstabelle, die auf zwei Elementen basiert: Vokal oder nicht
Setop
quelle
0

JavaScript (ES6), 120

Eine Funktion, die Eingaben als Zeichenfolge akzeptiert. Es gibt den korrekt übersetzten String zurück, wenn die Eingabe gültig ist, andernfalls false oder die Funktion abstürzt.

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

Weniger golfen

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
}

Prüfung

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
quelle