Tastaturcode zum Text!


14

Wenn Sie eine Zeichenfolge und ein Array als Eingabe verwenden, müssen Sie den Text ausgeben, den die Eingabezeichenfolge bei der Eingabe über ein typisches mobiles Tastenfeld ausgibt. In einer mobilen Tastatur wird ein Buchstabe durch n-maliges Drücken einer Taste eingegeben, wobei n die Position ist, an der sich der Buchstabe auf der Beschriftung der Taste befindet. Also 22sollte ausgeben b.

Tastenfeld


Regeln

  • Das Helfer-Array enthält die Zeichentabelle ( [" ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]). Dies wird gegeben, um Ihnen einige Bytes zu sparen.

  • Das #Symbol schaltet die Groß- / Kleinschreibung um. Initial Case wird niedriger sein. Sollte also 2#3ausgeben aD.

  • Das 0wird ein Leerzeichen hinzufügen. Also 202sollte ausgeben a a.

  • In der Eingabezeichenfolge befindet sich ein Leerzeichen ( ), um einen neuen Buchstaben zu beginnen, der sich auf derselben Zifferntaste befindet. Für den Typ Beispiel lautet aadie Eingabezeichenfolge 2 2.

  • Es wird garantiert, dass der eingegebene String immer ein gültiger KeyPad-Code ist.


Eingang

Sie können Eingaben auf jede Art und Weise vornehmen, die Ihre Sprache unterstützt.


Ausgabe

Sie können das Ergebnis beliebig ausgeben. Funktion returnist auch erlaubt.


Testfälle

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


Das ist , also gewinnt der kürzeste Code in Bytes!



4
Ich denke, die Großschreibung yearim letzten Testfall ist falsch.
Maltysen

1
Müssen wir Schleifen berücksichtigen? Wie 2222-> ungültig oder 2222-> b?
Kuilin Li

@Maltysen Ja, du hast recht. Ich habe die Frage bearbeitet. Vielen Dank für den Hinweis. :)
Arjun

Müssen aus Interesse ##doppelte Leerzeichen behandelt werden?
Neil

Antworten:


4

Pyth - 31 Bytes

Die neue Schlüsselsache hat mich zu viel gekostet.

ss.emr!FZk@@QsedthdfndeTrb8cz\#

Test Suite .


3

JavaScript, 105 99 Bytes

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 Bytes weg danke @Neil.

Sie können einige Bytes speichern, indem Sie den Buchstaben in einem temporären Ordner (z. B. l) speichern und dann verwenden c?l:l.toUpperCase().
Neil

@Neil. In Anbetracht der Anordnung ist bereits in Kleinbuchstaben ... danke :)
Washington Guedes

2

Perl 6 ,  119  97 Bytes

kartenbasierte Lösung 119 Bytes

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

Versuch es

substituierungsbasierte Lösung 97 Bytes

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

Versuch es

Erweitert:

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

Golf gespielt:

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 Bytes

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

Ich weiß, das ist sehr lang, aber das ist das Beste, was ich kann.


1

V , 60 Bytes

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

(Es gibt eine nicht druckbare ½<Ctrl+r>a)

Probieren Sie es online!

Erklären


Í /|                                          #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 (#)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.