Metin için Tuş Takımı Kodu!


15

Giriş olarak bir Dize ve bir Dizi verildiğinde, göreviniz tipik bir Mobil Tuş Takımına yazıldığında Dize girişinin yazacağı metni çıkarmaktır. Mobil Tuş Takımında, bir tuşa n kez basılarak bir harf yazılır; burada n, harfin düğmenin etiketinde bulunduğu konumdur. Yani, 22çıktı almalısınız b.

Klavye


kurallar

  • Yardımcı Dizi, Karakter Eşlem ( [" ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]) içerecektir . Bu size bazı baytlar kazandırmak için verilecektir.

  • #Sembol durumda geçiş yapılır. İlk Durum daha düşük olacaktır. Bu yüzden 2#3çıktı aD.

  • 0Bir boşluk ekleyecektir. Yani, 202çıktı almalısınız a a.

  • Aynı sayısal düğmedeki yeni bir harfi başlatmak için String girişinde bir boşluk ( ) olacaktır . Örnek yazmak için aa, Dize girişi olacaktır 2 2.

  • Dize girişinin her zaman geçerli bir KeyPad Kodu olacağı garanti edilir.


Giriş

Dilinizin desteklediği herhangi bir şekilde girdi alabilirsiniz.


Çıktı

Sonucu istediğiniz şekilde çıkarabilirsiniz. Fonksiyona returnda izin verilir.


Test Durumları

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


Bu , yani bayt içindeki en kısa kod kazanır!



4
Bence yearson test durumunda büyük harf kullanımı yanlış.
Maltysen

1
Döngüyü düşünmeli miyiz? 2222-> geçersiz veya 2222-> b gibi mi?
Kuilin Li

@Maltysen Evet, haklısın. Soruyu düzenledim. Gösterdiğiniz için teşekkürler. :)
Arjun

İlginin dışında, ##veya iki boşluğun ele alınması gerekiyor mu?
Neil

Yanıtlar:



3

JavaScript, 105 99 bayt

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

  • @Neil 6 bayt kapalı teşekkürler.

Mektubu geçici olarak (örn. l) Saklayıp ardından kullanarak bayt kaydedebilirsiniz c?l:l.toUpperCase().
Neil

@Neil. Dizi zaten küçük harfli olduğunu düşünüyoruz ... teşekkürler :)
Washington Guedes

2

Perl 6 ,  119  97 bayt

harita tabanlı çözüm 119 bayt

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

Dene

ikame tabanlı çözüm 97 bayt

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

Dene

Expanded:

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

  }/
}

2

JavaScript ES6 - 124 bayt

golfed:

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

Ungolfed:

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

1

JavaScript, 301 bayt

(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"]));

Bunun çok uzun olduğunu biliyorum, ama bu yapabileceğim en iyisi.


1

V , 60 bayt

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

(Yazdırılamaz ½<Ctrl+r>a)

Çevrimiçi deneyin!

Açıklamak


Í /|                                          #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 (#)
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.