Код клавиатуры в текст!

14

Используя String и Array в качестве входных данных, ваша задача состоит в том, чтобы вывести текст, который будет вводить String при вводе на обычной мобильной клавиатуре. В мобильной клавиатуре буква набирается нажатием кнопки n раз, где n - это положение, в котором буква находится на ярлыке кнопки. Итак, 22должен выходной b.

клавиатура


правила

  • Массив помощников будет содержать карту персонажей ( [" ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]). Это будет дано, чтобы сэкономить вам несколько байтов.

  • #Символ будет переключать случай. Начальный регистр будет ниже. Так 2#3должен выходной aD.

  • 0Добавит пробел. Итак, 202должен выходной a a.

  • Во входной строке будет пробел ( ), чтобы начать новую букву с той же цифровой кнопки. Например aa, для ввода введите String 2 2.

  • Гарантируется, что входная строка всегда будет действительным кодом клавиатуры.


вход

Вы можете использовать любой способ, которым поддерживает ваш язык.


Выход

Вы можете вывести результат любым удобным вам способом. Функция returnтакже разрешена.


Тестовые случаи

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


Это , поэтому выигрывает самый короткий код в байтах!

Арджун
источник
4
Я думаю, что заглавная буква yearв последнем тесте неверна.
Maltysen
1
Должны ли мы рассмотреть циклы? Мол, 2222-> недействительный или 2222-> б?
Куйлин Ли
@ Maltysen Да, вы правы. Я редактировал вопрос. Спасибо за указание на это. :)
Арджун
Из интереса ##нужно ли обрабатывать двойное пространство?
Нил

Ответы:

3

JavaScript, 105 99 байт

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 байтов от спасибо @Neil.
Вашингтон Гуэдес
источник
Вы можете сохранить несколько байтов, сохранив письмо во временном (например l), а затем используя c?l:l.toUpperCase().
Нил
@Neil. Учитывая, что массив уже в нижнем регистре ... спасибо :)
Вашингтон
2

Perl 6 ,  119  97 байт

решение на основе карты 119 байтов

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

Попытайся

решение на основе замещения 97 байт

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

Попытайся

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)

  }/
}
Брэд Гилберт b2gills
источник
2

JavaScript ES6 - 124 байта

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 байт

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

Я знаю, что это очень долго, но это лучшее, что я могу.

Арджун
источник
1

V , 60 байтов

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

(Там непечатный ½<Ctrl+r>a)

Попробуйте онлайн!

объяснять


Í /|                                          #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
источник