Code clavier pour texte!

14

Étant donné une chaîne et un tableau en entrée, votre tâche consiste à sortir le texte que la chaîne d'entrée imprimera lorsqu'elle sera tapée sur un clavier mobile typique. Dans un clavier mobile, une lettre est saisie en appuyant sur un bouton n fois, où n est la position de la lettre sur l'étiquette du bouton. Donc, 22devrait sortir b.

Clavier


Règles

  • Le tableau d'aide contiendra la carte des personnages ([" ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"] ). Ce sera donné pour vous faire économiser quelques octets.

  • Le #symbole fera basculer la casse. Le cas initial sera inférieur. Donc2#3 sortie devraitaD .

  • Le 0ajoutera un espace. Donc,202 devrait sortir a a.

  • Il y aura un espace ( ) dans la chaîne d'entrée pour commencer une nouvelle lettre qui se trouve sur le même bouton numérique. Par exemple pour taperaa , la chaîne d'entrée sera 2 2.

  • Il est garanti que la chaîne d'entrée sera toujours un code de clavier valide.


Contribution

Vous pouvez saisir des informations de la manière que votre langue prend en charge.


Production

Vous pouvez sortir le résultat comme vous le souhaitez. La fonction returnest également autorisée.


Cas de test

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


C'est le , donc le code le plus court en octets gagne!

Arjun
la source
4
Je pense que la capitalisation yeardans le dernier cas de test est erronée.
Maltysen
1
Faut-il envisager de boucler? Comme, 2222-> invalide ou 2222-> b?
Kuilin Li
@Maltysen Oui, vous avez raison. J'ai édité la question. Merci de l'avoir signalé. :)
Arjun
Par intérêt, ##un espace double ou doit-il être géré?
Neil

Réponses:

4

Pyth - 31 octets

Le nouvel élément clé m'a coûté trop cher.

ss.emr!FZk@@QsedthdfndeTrb8cz\#

Suite de tests .

Maltysen
la source
3

JavaScript, 105 99 octets

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 octets de réduction merci @Neil.
Washington Guedes
la source
Vous pouvez enregistrer quelques octets en stockant la lettre dans un fichier temporaire (par exemple l) puis en utilisant c?l:l.toUpperCase().
Neil
@Neil. Considérant que le tableau est déjà en minuscules ... merci :)
Washington Guedes
2

Perl 6 ,  119  97 octets

solution basée sur la carte 119 octets

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

Essayez-le

solution basée sur la substitution 97 octets

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

Essayez-le

Étendu:

->     # 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
la source
2

JavaScript ES6 - 124 octets

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

Non golfé:

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
la source
1

JavaScript, 301 octets

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

Je sais que c'est très long, mais c'est du mieux que je peux.

Arjun
la source
1

V , 60 octets

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

(Il y a un non imprimable ½<Ctrl+r>a)

Essayez-le en ligne!

Explique


Í /|                                          #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
la source