Kode KeyPad ke Teks!

14

Diberikan String dan Array sebagai input, tugas Anda adalah menampilkan teks yang akan dicetak oleh String input saat diketikkan pada Keypad Seluler biasa. Dalam Keypad Seluler, huruf diketik dengan menekan tombol n kali, di mana n adalah posisi di mana huruf berada pada label tombol. Jadi, 22sebaiknya output b.

Papan tombol


Aturan

  • Array Pembantu akan berisi Peta Karakter ( [" ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]). Ini akan diberikan untuk menghemat beberapa byte.

  • The #simbol akan beralih kasus. Kasus awal akan lebih rendah. Jadi 2#3seharusnya output aD.

  • The 0akan menambahkan spasi. Jadi, 202sebaiknya output a a.

  • Akan ada spasi ( ) di String input untuk memulai huruf baru yang ada di tombol angka yang sama. Untuk Contoh mengetik aa, String input akan 2 2.

  • Dijamin bahwa String input akan selalu menjadi Kode KeyPad yang valid.


Memasukkan

Anda dapat mengambil input dengan cara apa pun yang didukung bahasa Anda.


Keluaran

Anda dapat menampilkan hasilnya dengan cara apa pun yang Anda inginkan. Fungsinya returnjuga diperbolehkan.


Uji Kasus

#4440555#666888330#999#66688111 -> "I Love You!"
#6#33777 7779990#222#4477744477778627777111 -> "Merry Christmas!"
#44#27 79990#66#3390#999#332777111 -> "Happy New Year!"


Ini adalah , jadi kode terpendek dalam byte menang!

Arjun
sumber
5
Erat terkait
Mego
4
Saya pikir kapitalisasi pada yearkasus tes terakhir salah.
Maltysen
1
Apakah kita harus mempertimbangkan perulangan? Suka, 2222-> tidak valid atau 2222-> b?
Kuilin Li
@Maltysen Ya, Anda benar. Saya telah mengedit pertanyaan. Terima kasih telah menunjukkannya. :)
Arjun
Karena ketertarikan, apakah ##ruang ganda perlu ditangani?
Neil

Jawaban:

4

Pyth - 31 byte

Hal kunci yang baru membuat saya terlalu mahal.

ss.emr!FZk@@QsedthdfndeTrb8cz\#

Test Suite .

Maltysen
sumber
3

JavaScript, 105 99 byte

f=
(s,a)=>s.replace(/#| ?((.)\2*)/g,(m,n,d)=>d?(l=a[d][n.length-1],x?l:l.toUpperCase()):(x=!x,''),x=1)

a=['  ','.,!','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']

F=s=>console.log( f(s,a) )
F('#4440555#666888330#999#66688111')
F('#6#33777 7779990#222#4477744477778627777111');
F('#44#27 79990#66#3390#999#332777111');

  • 6 byte off terima kasih @Neil.
Washington Guedes
sumber
Anda dapat menyimpan beberapa byte dengan menyimpan surat secara sementara (misalnya l) dan kemudian menggunakan c?l:l.toUpperCase().
Neil
@Neil. Mengingat array sudah dalam huruf kecil ... terima kasih :)
Washington Guedes
2

Perl 6 ,  119  97 byte

solusi berbasis peta 119 byte

->$_,\a{my$u=0;[~] map {/'#'/??{$u+^=1;|()}()!!(&lc,&uc)[$u](a[.substr(0,1)].substr(.chars-1,1))},.comb(/(\d)$0*|'#'/)}

Cobalah

solusi berbasis substitusi 97 byte

->$_,\a{my$u=0;S:g/(\d)$0*|./{$0??(&lc,&uc)[$u](a[$0].substr($/.chars-1,1))!!($u+^=$/eq'#')x 0}/}

Cobalah

Diperluas:

->     # pointy block lambda

  $_,  # input string
  \a   # helper array

{

  my $u = 0;

  S                        # substitute (implicit against 「$_」)
  :global
  /

    | (\d) $0*             # digit followed by same digit
    | .                    # everything else

  /{

    $0                     # is 「$0」 set (digit)


    ??                     # if so then
        (&lc,&uc)[$u](     # call either 「lc」 or 「uc」

          a[$0]            # get the value from the input array
          .substr(         # select the correct character
            $/.chars - 1,
            1
          )

        )


    !!
        (
          $u +^= $/ eq '#' # numeric xor $u if 「#」 was matched
        ) x 0              # string repeated zero times (empty string)

  }/
}
Brad Gilbert b2gills
sumber
2

JavaScript ES6 - 124 byte

Golf:

f=h=>a=>(o=c="")+a.match(/#|(.)\1*/g).forEach(e=>e==" "?0:e=="#"?c=!c:(n=h[e[0]][e.length-1])*(o+=c?n.toUpperCase():n))?o:0;

f=h=>a=>(o=c="")+a.match(/#|(.)\1*/g).forEach(e=>e==" "?0:e=="#"?c=!c:(n=h[e[0]][e.length-1])*(o+=c?n.toUpperCase():n))?o:0;

console.log(f(["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"])("#4440555#666888330#999#66688111"));
console.log(f(["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"])("#6#33777 7779990#222#4477744477778627777111"));
console.log(f(["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"])("#44#27 79990#66#3390999332777111"));

Tidak Disatukan:

f=(a,h)=>{
    //out string
    o="";
    //uppercase or lowercase (initialized as "" and then inverted in golfed version)
    c=0;
    //split it into array of instructions, which are sets of repeated characters, or # solely alone
    a.match(/#|(.)\1*/g).forEach((e)=>{
        e==" "?0:
            e=="#" ? (c=!c) : ( ()=>{ //lambda added because two statements ungolfed, multiplied in the golfed version
                    n=h[e[0]][e.length-1];
                    o+=c?n.toUpperCase():n;
                })()
    })
    return o;
}
Kuilin Li
sumber
1

JavaScript, 301 byte

(a,b)=>{u="l";p=[];r="";a.split``.map((c,i)=>p.push(c!=a[i-1]?" "+c:c));p.join``.trim().replace('   ', ' ').split` `.map(l=>{if(l=="#"){u=(u=="l"?b.forEach((y,j)=>b[j]=y.toUpperCase())||"u":b.forEach((y,j)=>b[j]=y.toLowerCase())||"l")}else{if(l!="  "){r+=b[+l[0]][l.length-1]}else{r+=" "}}});return r}

f=(a,b)=>{u="l";p=[];r="";a.split``.map((c,i)=>p.push(c!=a[i-1]?" "+c:c));p.join``.trim().replace('   ', ' ').split` `.map(l=>{if(l=="#"){u=(u=="l"?b.forEach((y,j)=>b[j]=y.toUpperCase())||"u":b.forEach((y,j)=>b[j]=y.toLowerCase())||"l")}else{if(l!="  "){r+=b[+l[0]][l.length-1]}else{r+=" "}}});return r}

console.log(f("#4440555#666888330#999#66688111 ",["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]));
console.log(f("#6#33777 7779990#222#4477744477778627777111",["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]));
console.log(f("#44#27 79990#66#3390#999#332777111",["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]));

Saya tahu ini sangat panjang, tetapi ini adalah yang terbaik yang saya bisa.

Arjun
sumber
1

V , 60 byte

Í /|
ͨ䩨±*©/½a[submatch(1)][len(submatch(2))]
Í|
ò/#
g~$x

(Ada yang tidak patut dicetak ½<Ctrl+r>a)

Cobalah online!

Menjelaskan


Í /|                                          #Replace all " " with "|"
ͨ䩨±*©                                      #Replace all (\d)(\1*)
        /½                                    #With =
          ^Ra                                 #(Inserts the passed array)
             [submatch(1)][len(submatch(2))]  #Index into the array
Í|                                            #Replace all "|" with "" (second ò implied)
ò   ò                                         #Recursively (until breaking)
 /#                                           #Go to the next #
g~$                                           #Toggle case until the of the line
   x                                          #Delete current char (#)
nmjcman101
sumber