Esta pergunta solicita uma funcionalidade de correspondência de dicionário T9, que é um problema muito interessante. Mas o T9 tem outra maneira de digitar, que é digitar caractere por caractere. Você NÃO precisaria de um dicionário para implementar este teclado.
Aqui está o mapa de teclas de um teclado T9 se você esqueceu:
+-------+-------+-------+
| 1 | 2 | 3 |
| .?! | ABC | DEF |
+-------+-------+-------+
| 4 | 5 | 6 |
| GHI | JKL | MNO |
+-------+-------+-------+
| 7 | 8 | 9 |
| PQRS | TUV | WXYZ |
+-------+-------+-------+
| * | 0 | # |
| ← | SPACE | → |
+-------+-------+-------+
Como o T9 funciona
Para digitar um caractere com T9, você precisa pressionar a tecla numérica que representa esse n
tempo. n
é a ordem desse caractere escrito nessa chave. Os números são o último caractere que você pode digitar para cada tecla. Por exemplo, para digitar B
eu pressione 2
duas vezes ou para digitar 5
eu pressione 5
quatro vezes. Para terminar de digitar esse caractere, pressione #
. *
é simplesmente backspace. Em nossa versão do teclado, não há letras maiúsculas.
Exemplos de entrada e saída:
8#99999#055#33#999#22#666#2#777#3# → T9 KEYBOARD
Explicação:
8
selecionaT
e#
move para o próximo caractere99999
selecione o último caractere da9
chave que é9
e#
move para o próximo caractere0
insere um espaço33
seleciona o segundo caractere da3
tecla que éK
e#
passa para o próximo caractere- E assim por diante...
Regras
Sua função ou programa deve aceitar uma sequência que representa as teclas pressionadas T9. Saída é o texto resultante dessas teclas, conforme descrito acima.
Este é um código básico de golfe, portanto o vencedor é o mais curto em bytes, e aplicam-se regras / brechas padrão.
T9 KEYBOARD
está completamente errado. Aquele lêT9 JEYBARD
#
se os botões consecutivos forem diferentes de qualquer maneira. o que foi dito: sem esse bônus, o que aconteceria se#
for omitido?Respostas:
CJam,
10994 bytes ( 2º bônus)Uma solução muito ingênua e longa
Este é um programa completo, embora uma função tenha a mesma duração.
A entrada entra em STDIN
Exemplo:
Resultado:
Experimente online aqui
fonte
JavaScript ES6,
220-10 = 210178 bytesComo parte do CMC de Helka , superei meu primeiro desafio.
Saídas de amostra:
Explicação
Isso implementa a substituição recursiva, substituindo todos os caracteres seguidos por
*
até que não haja mais*
s.Isso corresponde a todas as execuções de dígitos consecutivos ou
*
s.Isso cria o dicionário desejado, obtendo a parte codificada da cadeia grande e anexando o dígito desejado a ela.
Isso pega o personagem,
a
o comprimento do módulo .Isso prepara a cadeia de caracteres para processamento e remoção de
*
s.fonte
t("2#2");
dá emB
vez deAA
. Tente combinar qualquer um em#
vez de removê-los.Python,167157151 bytes(não suporta '*')
Nada especial. Uso regex para converter a entrada em uma lista e, em seguida, faço um loop nas entradas. Eu uso o primeiro caractere e o comprimento de cada entrada para pesquisá-lo em uma lista de pesquisa:
Depois de jogar golfe, fica assim:
Nenhum bônus (ainda). Não sei como implementaria o primeiro bônus no regex. O segundo bônus adicionaria muitos bytes, pois os elementos de pesquisa não são do mesmo tamanho. Realmente não entendo o terceiro bônus.
fonte
Perl 5: 106 (código 104 + 2 sinalizadores)
Modificado para lidar com exclusões.
Uso:
Perl 5: 88 (código 86 + 2 sinalizadores)Versão antiga sem excluir com estrela.
fonte
AWK 211 bytes (com os bônus)
Este é um programa completo que lê a entrada do stdin. Seria mais eficiente não reposicionar o teclado para cada linha, mas tornaria o script mais longo.
Além disso, se a chave "0" fosse qualquer coisa além de 0, o script seria 4 bytes mais curto, mas isso faz parte do jogo: o)
fonte
C (245 bytes)
Resultado
Explicação
A contagem de bytes não inclui a sequência de entrada fornecida no primeiro
#define
.Eu uso uma matriz bidimensional como tabela de pesquisa para qual caractere imprimir. O programa lê caracteres delimitados por
'#'
.Para cada grupo, o número de entrada determina o índice da matriz de primeira dimensão e o número de repetições do número de entrada determina o índice da matriz de segunda dimensão. Os
'*'
move para trás o índice da matriz para a cadeia de saída, de modo a substituir a letra anterior.Portanto, a sequência de entrada
44#
(1 repetição de'4'
) é traduzida para a tabela de pesquisaK[4][1]
, que é o caractereH
.Versão Ungolfed
fonte
Rubi
254,248, 229 bytesGolfe:
Ungolfed:
Todas essas especificações devem ter sucesso:
A
0 0
resposta parece um pouco com uma solução hacky. Vou investigar quando tiver tempo.fonte
PHP, 183-10 = 173 bytes
Todas as versões pegar as informações de linha de comando argumento; call com
php -r '<code>' <string>
.Nota : Todas as versões emitem um aviso se a entrada começar com
*
.Anexar
$o=[];
ao código para remover essa falha.210-10 - ?? = ??? bytes
181 bytes, sem bônus
demolir
As versões "sem hash tags" dividem a string em (sequência de números iguais) e (asterisco) e esquecem todo o resto. A versão sem bônus leva (sequência de números seguida por
#
) e (asterisco).Em seguida, percorra as correspondências: Se um '*' for encontrado, remova o último elemento da matriz de resultados.
A diferença entre as versões está na
else
parte:-1
.fonte
JavaScript, 147 bytes
A resposta de Conor foi corrigida com o regex da minha resposta PHP e diminuiu.
demolir
versão rotativa, 158 bytes
adicionado
s=
para lembrar a corda e%s.length
girar.fonte