Digitação do teclado do telefone celular

17

Digitação do teclado do telefone celular

Esta pergunta foi feita há um tempo, mas foi encerrada devido a especificações ruins. Então, estou refazendo, com especificações melhores. Esta questão está relacionada, mas segue na direção oposta.

Antes da criação do T9, para digitar um caractere em uma mensagem de texto, era necessário pressionar uma das teclas numéricas várias vezes para obter o caractere desejado. Para referência, aqui está o mapeamento padrão:

+-------+-------+-------+
|   1   |   2   |   3   |
|  .?!1 |  ABC2 |  DEF3 |
+-------+-------+-------+
|   4   |   5   |   6   |
|  GHI4 |  JKL5 |  MNO6 |
+-------+-------+-------+
|   7   |   8   |   9   |
| PQRS7 |  TUV8 | WXYZ9 |
+-------+-------+-------+
|   *   |   0   |   #   |
|   ←   |SPACE 0|   →   |
+-------+-------+-------+

*é backspace, 0é um espaço ( ' ') ou o número 0e #confirma o caractere atual. Por uma questão de simplicidade, todos os caracteres estão em maiúsculas.

Quando você pressionar uma tecla várias vezes, os ciclos de caracteres selecionados através dos caracteres possíveis para essa chave: 2 -> A, 22 -> B, 222 -> C, 2222 -> 2, 22222 -> A, e assim por diante. Observe que, como *só há uma opção, pressionar repetidamente faz com que vários backspaces sejam inseridos. Pressionar #várias vezes seguidas não tem efeito. Um final #é desnecessário.

Além disso, se uma tecla diferente for pressionada imediatamente após pressionar uma tecla, o pressionamento anterior é confirmado automaticamente. Assim, 223é funcionalmente idêntico a 22#3.

Seu desafio é traduzir uma série de pressionamentos de teclas na sequência correspondente que um telefone celular exibirá.

Exemplos

8#99999#055#33#999#22#666#2#777#3#1 -> T9 KEYBOARD
4433555#55566609666666677755533*3111 -> HELLO WORLD!
7##222#222**7#222#4 -> PPCG
00#0#00 -> 0 0

Regras

  • Isso é , então a solução correta mais curta (em bytes) vence
  • A resposta vencedora será escolhida em uma semana
  • As brechas padrão são proibidas
  • Sua resposta pode estar na forma de um programa completo, uma função nomeada ou anônima, recebendo entrada e produzindo saída em um dos métodos padrão

Entre os melhores

O snippet de pilha na parte inferior desta postagem gera o cabeçalho das respostas a) como uma lista da solução mais curta por idioma eb) como um cabeçalho geral.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Se você quiser incluir vários números em seu cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades de sinalizador de intérprete separadamente), verifique se a pontuação real é o último número no cabeçalho:

## Perl, 43 + 2 (-p flag) = 45 bytes

Você também pode transformar o nome do idioma em um link que será exibido no snippet:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

Mego
fonte
11
Como você produz números? Você tem o número '9' em um exemplo, mas sua especificação ( 2 -> A, 22 -> B..., 2222 -> A....) não permite que nenhum número seja produzido.
C. Quilley
11
@ C. Quilley É o que recebo por copiar cegamente esse diagrama, corrigido agora.
Mego
11
@AlexA. Não é idiota, é a entrada padrão do teclado numérico do telefone, não a pesquisa de dicionário T9.
Mego

Respostas:

3

K5, 112 bytes

{(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)[.*x]20!#1_x}'(){$[42=*y;(-#y)_x;35=*y;x;x,,y]}/{(&~0=':x)_x}

Este é realmente uma bagunça, mas acho que há uma boa quantidade de espaço para jogar golfe.

Primeiro, precisamos construir uma tabela de pesquisa para o mapa de teclas. Existem chaves com 2, 4 e 5 caracteres mapeados para elas, portanto, preencher cada entrada até 20 simplifica o processo de indexar ciclicamente esta tabela posteriormente:

  (20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)
(" 0 0 0 0 0 0 0 0 0 0"
 ".?!1.?!1.?!1.?!1.?!1"
 "ABC2ABC2ABC2ABC2ABC2"
 "DEF3DEF3DEF3DEF3DEF3"
 "GHI4GHI4GHI4GHI4GHI4"
 "JKL5JKL5JKL5JKL5JKL5"
 "MNO6MNO6MNO6MNO6MNO6"
 "PQRS7PQRS7PQRS7PQRS7"
 "TUV8TUV8TUV8TUV8TUV8"
 "WXYZ9WXYZ9WXYZ9WXYZ9")

Em seguida, divido a entrada em execuções:

 {(&~0=':x)_x}"8#99999#055#33#999"
(,"8"
 ,"#"
 "99999"
 ,"#"
 ,"0"
 "55"
 ,"#"
 "33"
 ,"#"
 "999")

Solte todas as # corridas e descasque as corridas sempre que encontrar um *:

  (){$[42=*y;(-#y)_x;35=*y;x;x,,y]}/{(&~0=':x)_x}"8#99999#055#33#999"
(,"8"
 "99999"
 ,"0"
 "55"
 "33"
 "999")

E então eu estou pronto para simplesmente indexar nessa tabela de pesquisa com base no comprimento e no primeiro elemento de cada execução.

Todos juntos:

  {(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)[.*x]20!#1_x}'(){$[42=*y;(-#y)_x;35=*y;x;x,,y]}/{(&~0=':x)_x}"4433555#55566609666666677755533*3111"
"HELLO WORLD!"

Editar:

Economize 5 bytes:

0 3 6 9 12 15 19 22
((3*!6),19 22)
JohnE
fonte
Você pode reduzir (20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)para (20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10).
Kirbyfan64sos # 23/15
Sim, acabei de descobrir isso há alguns minutos atrás.
Johne
3

Python 2, 230 206 bytes

import re
f=lambda a,b=dict(zip("0123456789*#"," 0~.?!1~ABC2~DEF3~GHI4~JKL5~MNO6~PQRS7~TUV8~WXYZ9~\b~".split("~"))):"".join([j and b[j][(len(i)-1)%len(b[j])]or b[i]for i,j in re.findall(r"((\d)\2*|.)",a)])

Essa cria uma função f que usa uma sequência de teclas pressionadas como argumento e retorna a sequência correspondente que um telefone celular exibia. Também ocorre com um segundo argumento opcional como um mapeamento de dicionário para os caracteres correspondentes, por exemplo, {"0": "0", "1": ".?! 1", ...} .

Primeiro, a sequência de pressionamentos de teclas é agrupada por caracteres repetidos, por exemplo, ["8", "#", "99999", "#", ...] . Em seguida, o primeiro caractere de cada grupo é mapeado no dicionário passado como segundo argumento, por exemplo, 9 mapeia para o WXYZ9 . Por fim, o comprimento do grupo é usado como deslocamento no valor do dicionário.

Observe que o deslocamento deve usar o módulo no comprimento do grupo de caracteres repetidos, porque as teclas pressionadas podem alternar. Observe também que o caractere # é mapeado para \ 0 e removido apenas no final porque 99 # 99 não é o mesmo que 9999 .

Aqui está a saída da função para cada um dos exemplos na pergunta:

>>> print f("8#99999#055#33#999#22#666#2#777#3#1")
T9 KEYBOARD.
>>> print f("4433555#55566609666666677755533*3111")
HELLO WORLD!
>>> print f("7##222#222**7#222#4")
PPCG
>>> print f("00#0#00")
0 0
cr3
fonte
3

JavaScript, 214 184 168 162 bytes

x=>(x.match(/(.)\1*/g,f='').map(a=>f=(l=a.length,v=' 0#.?!1#ABC2#DEF3#GHI4#JKL5#MNO6#PQRS7#TUV8#WXYZ9'.split`#`[a[0]])?f+v[--l%v.length]:a<'*'?f:f.slice(0,-l)),f)

Provavelmente isso pode ser um pouco menor, mas estou muito feliz com o resultado. Divide os caracteres em grupos repetidos de um ou mais e, em seguida, percorre a matriz, mapeando cada caractere para seu valor no hash e adicionando-o à sequência final. Se encontrar qualquer número de '#', ele será ignorado. Se encontrar algum '*', ele removerá esse número do final da sequência final.

Mwr247
fonte
0

Python 2, 237 bytes

Usando o dicionário de cr3, mas sem re.

def f(i):
 d=dict(zip("0123456789"," 0|.?!1|ABC2|DEF3|GHI4|JKL5|MNO6|PQRS7|TUV8|WXYZ9".split("|")))
 s,x,j='',i[0],0
 for c in i[1:]+'#':
  if c==x:j+=1
  else:
   if x>'/':s+=d[x][j%len(d[x])]
   j=0
  if c=='*':s=s[:-1]
  x=c
 return s
TFeld
fonte
-1

Python 2, 265 bytes

É muito longo. IO: stdin, stdout.

a=reduce(lambda q,w:q+" "+[w,""][w=="#"]if q[-1]!=w else q+w,raw_input()).split()
while "*" in a:del a[a.index("*")-1:a.index("*")+1]
print"".join([(lambda a:a[len(q)%len(a)-1])(" 0:.?!1:ABC2:DEF3:GHI4:JKL5:MNO6:PQRS7:TUV8:WXYZ9".split(":")[int(q[0])])for q in a])
Hannes Karppila
fonte
O terceiro exemplo, 7 ## 222 # 222 ** 7 # 222 # 4 , fará com que seu script gere um literal ValueError : inválido para int () com base 10: '*'.
Cr3 #