ตัวเลขการออกเสียง


14

แนวคิด

การจดจำตัวเลขอาจเป็นเรื่องยาก การจดจำคำศัพท์อาจทำได้ง่ายกว่า เพื่อที่จะจดจำตัวเลขจำนวนมากฉันได้สร้างวิธีการออกเสียงพวกเขาในลักษณะคล้าย leetspeak

กฎระเบียบ

แต่ละหลักจะถูกแทนที่ด้วยตัวอักษรที่เกี่ยวข้องก่อน:

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

หลังจากการแทนที่จะมีการเพิ่มสองสิ่งเพื่อการออกเสียงที่ดีขึ้น:

  • ระหว่างตัวอักษรสองตัว a Uถูกเพิ่ม

  • ระหว่างสระสองสระNจะถูกเพิ่ม

ตัวอย่าง / กรณีทดสอบ

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

สิ่งที่เป็นไปไม่ได้

  • ตัวอักษรและตัวเลขผสมกันในคำเดียวกัน
  • สองพยัญชนะต่อเนื่องหรือสองเสียงสระต่อเนื่อง
  • ตัวอักษรที่ไม่อยู่ในรายการด้านบน
  • ตัวละครอื่น ๆ

กฎระเบียบ

เป้าหมายของนี้คือการสร้างนักแปลแบบสองทางสำหรับแนวคิดนี้

  • โปรแกรมของคุณจะต้องเข้าใจด้วยตัวเองก่อนหากเป็นการแปลเป็นตัวอักษรหรือเป็นตัวเลข
  • มันจะต้องตรวจสอบรายการที่จะเกิดขึ้นอย่างถูกต้อง
  • หากทุกอย่างถูกต้องให้แสดงคำแปล
  • อื่นแสดงข้อความข้อผิดพลาดไม่มีอะไรคืนค่าเท็จหรือโปรแกรมผิดพลาด

รายละเอียด

  • สามารถป้อนหมายเลข / สตริงในรูปแบบใดก็ได้ที่คุณต้องการ (stdin, argument, ... )
  • นี่คือคำตอบที่สั้นที่สุดจึงชนะ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

11
ไม่ควรGIGATESTERจะเป็นGIGATESUTER?
kamoroso94

5
โดยปกติเราไม่ขอให้รายการ 'มีรูปแบบที่ถูกต้อง' เนื่องจากเป็นรหัสเพิ่มเติมโดยไม่มีเหตุผลที่ดี (ดูคำถามเมตาสำหรับคำแนะนำการท้าทายที่ดี) นอกจากนี้ 'รูปแบบที่เหมาะสม' หมายถึงอะไร
Okx

9
หากจำเป็นต้องมีการตรวจสอบความถูกต้องของอินพุตคุณควรรวมชุดทดสอบที่เหมาะสมของอินพุตที่ไม่ถูกต้อง (โดยเฉพาะอินพุตที่เป็นตัวอักษรเท่านั้นที่เกือบจะใช้ได้) ฉันคาดหวังว่านี่จะเป็นส่วนสำคัญของความท้าทายในหลายภาษา
Martin Ender

2
ฉันเห็นด้วยกับ @MartinEnder ว่าคุณควรเพิ่มกรณีทดสอบสำหรับกรณีที่ไม่ถูกต้องเช่นAB23; AEI; BB; Z; ACE; giga; !@#$; -123; เป็นต้นนอกจากนี้ตามกฎการตรวจสอบเราสามารถแปลง6164735732 => GIGATESTERแต่GIGATESTERจะส่งผลให้เกิดค่าเท็จเนื่องจากST(กฎพยัญชนะสองตัวที่ต่อเนื่องกัน) วิธีตั้งค่าความท้าทายของคุณในปัจจุบันส่วนหลักของความท้าทายคือการตรวจสอบความถูกต้องแทนการแปลง ฉันไม่เป็นไร แต่การตรวจสอบควรกำหนดไว้ดีกว่าในกรณีนั้น
Kevin Cruijssen

2
โปรแกรมของคุณจะต้องเข้าใจด้วยตัวเองก่อนหากเป็นการแปลแบบตัวอักษรหรือตัวเลข ดังนั้นการแปลจึงต้องเป็นแบบสองทาง ข้อความก่อนหน้าและกรณีทดสอบแนะนำจำนวนเฉพาะตัวอักษร
Luis Mendo

คำตอบ:


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

หวังว่าตอนนี้ทำงานได้ตามที่คาดไว้
Arnauld

... หรือหยุดทำงานเมื่อมีอักขระ regexp สำรองในอินพุต ยังคงใช้ได้แม้ว่า
edc65

2

Japt , 61 59 92 85 84 ไบต์

ฉันออฟไลน์สำหรับสุดสัปดาห์ (ยาว) หากพบปัญหาใด ๆ เพิ่มเติมโปรดถาม mod เพื่อลบให้ฉันจนกว่าจะถึงเวลาที่ฉันสามารถแก้ไขได้

จะเข้าเป็นสตริงสำหรับการดำเนินงานทั้งในและส่งกลับสตริงสำหรับทั้งสองเป็นอย่างดีหรือ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 ไบต์บันทึกไว้ขอบคุณโอบารากรใครจะโน้มน้าวให้ฉันหยิบมันขึ้นมาอีกครั้งหลังจากฉันทิ้งมันไปก่อนหน้านี้ ฉันหวังว่าเขาจะไม่ได้!
  • 33 26 25 (!) bytes เสียสละดำเนินการแก้ไขด่วน (เช่นยังไม่ได้กอล์ฟอย่างเต็มที่) เพื่อตรวจสอบความถูกต้องของการป้อนข้อมูล

คำอธิบาย

(ยังไม่ได้รับการอัพเดทเป็นเวอร์ชั่นล่าสุด)

                          :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

@Emigna: อ้า Goddamnit! คุณคงนึกภาพว่าหลังจากที่ "กฎ" ตัวแรกถูกเผาในตอนแรกเราคงคิดที่จะอ่านกฎที่เหลือ! : \ ฉันใช้ส่วน "มีอะไรที่เป็นไปไม่ได้" เพื่อบอกเป็นนัยว่าเราไม่ต้องจัดการกับประเด็นเหล่านี้แก้ไขเร็ว ๆ นี้
ขนดก


1

Java (OpenJDK 8) , 416 410 399 382 376 370 ไบต์

-2 ไบต์ขอบคุณ @Cyoce

-17 ไบต์เพิ่มเติมขอบคุณความคิดโดย @Cyoce

-6 ไบต์ขอบคุณ @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;}

ลองออนไลน์!

เอ่อ, การแทนที่ java เป็น verbose มาก

ฟังก์ชั่นที่ใช้สตริงและส่งคืนสตริงที่แปลจากตัวเลข -> ตัวอักษรหรือในทางกลับกัน เกิดปัญหากับการป้อนข้อมูลที่ไม่ถูกต้อง (คุณสามารถดูได้ในตัวอย่าง tio ที่มันส่งออกค่าที่ถูกต้องสำหรับ 10 กรณีทดสอบแรกแล้วเกิดปัญหากับการหารด้วยศูนย์ข้อผิดพลาดซึ่งแสดงในมุมมองการดีบัก)

Ungolfed (เทอมแรกและสุดท้ายของ for for loop ถูกดึงออกมาเพื่อให้อ่านได้)

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 สำหรับการจับคู่ตัวเลขนั้นง่าย แต่นี่คือ regex สำหรับการจับคู่ตัวอักษรกับตัวเลข

(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

@Cyoce ช่วยทุกไบต์
PunPun1000

เนื่องจากทุกสาขาของคุณของifคำสั่งมีการมอบหมายงาน (ซึ่งกลับค่า) ลองเปลี่ยนif... else if... elseกับผู้ประกอบการที่มีเงื่อนไข?:, prefacing ด้วยObject _=จะทำให้มันเป็นคำสั่งที่ถูกต้อง ไม่แน่ใจว่าสิ่งนี้จะช่วยนับจำนวนไบต์จริงหรือไม่ แต่ฉันคิดว่ามันจะ
Cyoce

สองสิ่งเล็ก ๆ ที่คุณสามารถเล่นกอล์ฟได้ คุณสามารถลบสตริงtได้เนื่องจากคุณใช้ครั้งเดียวเท่านั้น ดังนั้นt.charAt(i)+""จะกลายเป็น"OIREASGTBP".charAt(i)+""( -4 ไบต์ ) และคุณสามารถวางบรรทัดสุดท้ายใน for-loop ได้หลังจากi<9;ด้านใน for-loop declaration ดังนั้นมันจึงกลายเป็นfor(;i<9;s=b?s.replace(v,c):s.replace(c,v)){( -1 ไบต์ ) โอ้และคุณสามารถนำสิ่งs=b?...ที่มาหลังจากint i=-1;ด้านในของ for-loop ได้ด้วย: for(s=b?...;i<9;...( -1 ไบต์ )
Kevin 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

ชวา 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)

แก้ไข: ใช้แนวทางที่แตกต่างจากคำตอบ Java ของ @ PunPun1000จากโดยการสร้าง return-String ใน for-loop เหนือตัวอักษรจากนั้นใช้ regex ที่เป็นนามธรรมเพื่อตรวจสอบความถูกต้องของ 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

การตรวจสอบ regex:

(([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
Value Ink

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 อุ๊ปส์เพิ่มการตรวจสอบ! มันเป็นการตรวจสอบความถูกต้องอย่างมาก แต่ฉันไม่มีทางเลือกมากนักในเรื่องนี้
Value Ink

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

คำอธิบาย

ก่อนอื่นเราล้อมรอบตัวเลขด้วย _ (สำหรับสระ) หรือ=(สำหรับพยัญชนะ)

หากเราไม่ได้ทำการทดแทนใด ๆ เรากำลังแปลงตัวอักษรเป็นตัวเลขดังนั้นจึงเป็นการแทนที่แบบง่ายและลบ UNและ จากนั้นออกจาก

มิฉะนั้นเราจะแยกสาขาเพื่อทำฉลาก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 ไปยังตำแหน่งของพวกเขาในตัวอักษร
  • ลดรายการโดยการเพิ่มตัวสะสมรวมถึงองค์ประกอบของdict tuple รวมถึงองค์ประกอบปัจจุบัน
    • the tict the dictเป็นตารางความจริงโดยมีองค์ประกอบสองอย่างคือสระหรือไม่

0

JavaScript (ES6), 120

ฟังก์ชันรับอินพุตเป็นสตริง มันจะส่งคืนสตริงที่แปลอย่างถูกต้องหากอินพุตนั้นถูกต้องมิฉะนั้นเป็นเท็จหรือฟังก์ชั่นขัดข้อง

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

น้อย golfed

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.