Wymawiaj liczby

14

Pojęcie

Zapamiętywanie liczb może być trudne. Zapamiętywanie słowa może być łatwiejsze. Aby zapamiętać duże liczby, stworzyłem sposób ich wymawiania w sposób przypominający leetspeak.

Zasady

Każda cyfra jest najpierw zastępowana odpowiednią literą:

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

Po zamianie wykonywane są dwie dodatkowe czynności w celu poprawy wymowy:

  • Pomiędzy dwiema spółgłoskami Udodaje się a.

  • Pomiędzy dwiema samogłoskami Ndodaje się a.

Przykłady / przypadki testowe

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

Co jest niemożliwe

  • Litery i cyfry mieszane w tym samym słowie
  • Dwie kolejne spółgłoski lub dwie kolejne samogłoski
  • Listy, których nie ma na powyższej liście
  • Inne postaci

Zasady

Celem tego jest stworzenie dwukierunkowego tłumacza tej koncepcji.

  • Twój program musi najpierw zrozumieć sam, czy jest to tłumaczenie litery na cyfrę lub cyfrę na literę.
  • Musi sprawdzić, czy wpis został poprawnie utworzony.
  • Jeśli wszystko jest w porządku, wyświetl tłumaczenie.
  • W przeciwnym razie wyświetl komunikat o błędzie, nic, zwróć wartość falsey lub awarii programu.

Detale

  • Numer / ciąg wejściowy można wprowadzić w dowolnym formacie (standardowe, argument, ...)
  • To jest , więc wygrywa najkrótsza odpowiedź.
  • Standardowe luki są zabronione.
SteeveDroz
źródło
11
Nie powinno GIGATESTERbyć GIGATESUTER?
kamoroso94
5
Zwykle nie wymagamy, aby wpis był „poprawnie sformułowany”, ponieważ jest to tylko dodatkowy kod bez uzasadnionego powodu (zobacz meta pytanie, aby uzyskać dobre rekomendacje dotyczące wyzwań). Ponadto, co oznacza „prawidłowo uformowany”?
Okx,
9
Jeśli wymagana jest weryfikacja danych wejściowych, należy dołączyć przyzwoitą partię przypadków testowych niepoprawnych danych wejściowych (zwłaszcza dane wejściowe zawierające tylko litery, które są prawie poprawne). Oczekuję, że tak naprawdę będzie to główna część wyzwania w wielu językach.
Martin Ender
2
Zgadzam się z @MartinEnder, że powinieneś dodać kilka przypadków testowych dla nieważnych przypadków, takich jak AB23; AEI; BB; Z; ACE; giga; !@#$; -123; itd. Ponadto, w oparciu o reguły sprawdzania poprawności, możemy przekonwertować 6164735732 => GIGATESTER, ale GIGATESTERspowoduje to fałszywą wartość z powodu ST(dwóch kolejnych reguł spółgłosek). Sposób, w jaki obecnie konfigurujesz wyzwanie, jego główną częścią jest walidacja zamiast konwersji. Nie przeszkadza mi to, ale w takim przypadku walidację należy zdefiniować nieco lepiej.
Kevin Cruijssen
2
Twój program musi najpierw sam się podkreślić, jeśli jest to tłumaczenie z litery na cyfrę lub z cyfry na literę. Więc tłumaczenie musi być dwukierunkowe? Powyższy tekst i przypadki testowe sugerują tylko cyfrę do litery
Luis Mendo

Odpowiedzi:

5

JavaScript (ES6), 130 bajtów

Pobiera dane wejściowe jako ciąg znaków na oba sposoby tłumaczenia. Zwraca tłumaczenie jako ciąg znaków lub falsew przypadku nieprawidłowego wprowadzenia.

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)

Próbny

Arnauld
źródło
Jeśli to nie działa idealnie, nie publikuj tego.
Okx,
Mam nadzieję, że teraz działa zgodnie z oczekiwaniami.
Arnauld
... lub ulega awarii, gdy na wejściu są zastrzeżone znaki wyrażenia regularnego. Nadal aktualne
edc65
2

Japt , 61 59 92 85 84 bajtów

Jestem nieaktywny przez większość (długiego) weekendu, jeśli odkryjesz więcej problemów, poproś mod, aby go dla mnie usunął, dopóki nie będę w stanie go naprawić.

Pobiera dane wejściowe jako ciąg znaków dla obu operacji i zwraca ciąg znaków zarówno dla, jak i falsedla danych wejściowych niepoprawnych. Sumy liczbowe zawsze będą zawierać wiele cyfr, dodaj 1 bajt, zastępując je, Un<space>jeśli to nie jest poprawne. Zwraca falseprzypadek testowy, GIGATESTERale zgodnie z regułami, powinno to być nieprawidłowe wejście.


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

Spróbuj: Liczby -> Litery lub Litery -> Liczby


  • 2 4 bajty zaoszczędzone dzięki obarakonowi , który również przekonał mnie do wzięcia tego ponownie po tym, jak wcześniej go porzuciłem. Chciałbym, żeby tego nie zrobił!
  • 33 26 25 (!) Bajtów poświęcono na wdrożenie szybkiej poprawki (tj. Jeszcze do pełnej gry w golfa), aby sprawdzić poprawność danych wejściowych.

Wyjaśnienie

(Jeszcze do aktualizacji do najnowszej wersji)

                          :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
Kudłaty
źródło
AEI
Wygląda na
@Emigna: Ach, cholera! Można sobie wyobrazić, że po początkowym spaleniu przez pierwszą „Regułę” pomyślelibyśmy przeczytać resztę zasad! : \ Wziąłem sekcję „Co niemożliwe”, aby zasugerować, że nie będziemy musieli zajmować się żadnym z tych punktów. Poprawka będzie dostępna wkrótce.
Kudłaty
2

Python 3 , 147 bajtów

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)

Wypróbuj online!

niewzruszony
źródło
1

Java (OpenJDK 8) , 416 410 399 382 376 370 bajtów

-2 bajty dzięki @Cyoce

-17 dodatkowych bajtów dzięki pomysłowi @Cyoce

-6 bajtów dzięki @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;}

Wypróbuj online!

Ugh, zastąpienie Java jest takie pełne.

Funkcja, która pobiera ciąg znaków i zwraca ciąg przetłumaczony z liczby -> litera lub odwrotnie. Występuje awaria przy nieprawidłowym wprowadzeniu (można to zobaczyć w przykładzie tio, w którym wyświetla prawidłowe wartości dla pierwszych 10 przypadków testowych, a następnie ulega awarii z błędem dzielenia przez zero, który jest wyświetlany w widoku debugowania)

Ungolfed (pierwszy i ostatni termin pętli for są wyciągane dla zapewnienia czytelności)

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

Wyrażenie regularne dla dopasowania liczb jest proste, ale oto regex dla dopasowania liter do cyfr

(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
źródło
Nie oznacza to, że znacznie poprawia to masową liczbę bajtów, ale możesz usunąć nawiasy wokół(s)->
Cyoce
@Cyoce pomaga każdy bajt
PunPun1000,
ponieważ wszystkie gałęzie ifinstrukcji są przypisaniami (które zwracają wartość), spróbuj zastąpić if... else if... elseoperatorem warunkowym ?:, zastępując go, Object _=aby stała się poprawną instrukcją. Nie jestem pewien, czy to rzeczywiście pomogłoby w liczeniu bajtów, ale myślę, że tak.
Cyoce
Dwie małe rzeczy, na które możesz grać w golfa. Możesz usunąć Ciąg t, ponieważ używasz go tylko raz. Tak t.charAt(i)+""staje się "OIREASGTBP".charAt(i)+""( -4 bajty ). I możesz umieścić ostatni wiersz w pętli for po i<9;deklaracji for-loop. Więc staje się for(;i<9;s=b?s.replace(v,c):s.replace(c,v)){( -1 bajt ). Aha, i możesz umieścić to, s=b?...co pojawia się zaraz po int i=-1;wewnętrznej pętli for: for(s=b?...;i<9;...( -1 bajt ).
Kevin Cruijssen
1

PHP; 129 127 267 259 228 bajtów

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

Uruchom jako potok z -nRlub spróbuj online .

awaria

$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
Tytus
źródło
1

Java 8, 312 308 304 301 294 290 bajtów

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 bajty (308 → 304) na naprawę błędu (nie zdarza się często, że liczba bajtów zmniejsza się, gdy naprawiam błąd w moim kodzie ..: D)

EDYCJA: Używa innego podejścia niż odpowiedź Java @ PunPun1000 najpierw tworząc ciąg znaków return w pętli for nad znakami, a następnie używa bardziej abstrakcyjnego wyrażenia regularnego do sprawdzenia poprawności w trójce zwrotnej (dane wejściowe to albo wszystkie cyfry, lub podane są samogłoski i spółgłosek na przemian (więc bez sąsiadujących samogłosek i spółgłosek).

Wyjaśnienie:

Wypróbuj tutaj.

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

Wyrażenie regularne sprawdzania poprawności:

(([AEIOU][BGNPRST])*[AEIOU]?)|(([BGNPRST][AEIOU])*[BGNPRST]?)|\\d*
Kevin Cruijssen
źródło
0

05AB1E , 76 bajtów

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

Wypróbuj online!

Zwraca wartość fałszowania 0dla nieprawidłowych danych wejściowych.

Emigna
źródło
0

Grzmotnąć ,241 238 235 bajtów

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

Wypróbuj online!

Mniej golfa:

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
źródło
0

PHP, 268 bajtów

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

Wypróbuj online!

Jörg Hülsermann
źródło
0

Perl, 127 bajtów

126 bajtów + 1 bajt wiersza poleceń

$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

Stosowanie:

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

Powinny być zgodne ze wszystkimi regułami wyzwania - mogą przyjmować litery lub cyfry i będą błędne (dzielenie przez zero), jeśli walidacja się nie powiedzie

Jarmex
źródło
Sprawdzanie poprawności ma fałszywie dodatnie dane wejściowe NOi US.
Wartość tuszu
0

Rubin , 205 + 1 = 206 bajtów

Używa -pflagi dla bajtu +1. Teraz z wyczerpującym systemem sprawdzania poprawności danych wejściowych.

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)

Wypróbuj online!

Wartość tuszu
źródło
Wydaje się, że to nie zamienia liter na cyfry ani nie sprawdza poprawności!
Jarmex
@Jarmex, ups, dodano sprawdzanie poprawności! To ogromna kontrola walidacji, ale nie mam dużego wyboru
Value Ink
0

Python 3, 741 bajtów

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)

Wypróbuj online!

Wiem, że jest dużo miejsca na ulepszenia.

LyricLy
źródło
0

sed, 123 bajty

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

Wyjaśnienie

Po pierwsze, otaczamy cyfry _(dla samogłosek) lub= (dla spółgłosek).

Jeśli nie dokonaliśmy żadnych podstawień, konwertujemy litery na cyfry, więc jest to proste zastąpienie, a także usuwanie Ui N. Potem wyjdź.

W przeciwnym razie rozgałęziamy się do etykiety a, gdzie mamy do czynienia z kolejnymi samogłoskami, a następnie kolejnymi spółgłosek. Następnie zamień cyfry na litery i usuń znaki znaczników, które wprowadziliśmy w pierwszym kroku.

Toby Speight
źródło
0

Python3, 246 bajtów

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

wyjaśnienie:

  • mapowanie danych wejściowych na listę int
  • lista map int do ich pozycji w alfabecie
  • zmniejsz listę, dodając akumulator, element krotki dict oraz element bieżący
    • DICT krotka jest stół prawda opiera się na dwóch elementach, będąc samogłoskę lub nie
Setop
źródło
0

JavaScript (ES6), 120

Funkcja przyjmująca dane wejściowe jako ciąg. Zwraca poprawnie przetłumaczony ciąg, jeśli dane wejściowe są prawidłowe, w przeciwnym razie false lub funkcja ulega awarii.

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

Mniej golfa

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
}

Test

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
źródło