Uma certa empresa de cabo conhecida possui um recurso um pouco desajeitado de 'Pesquisar programa' que funciona através do controle remoto. É preciso pressionar muito o botão; portanto, sendo um admirador da economia de movimento, pensei em procurar a ajuda de um programador para minimizar o número de movimentos dos dedos que tenho que fazer.
O recurso de pesquisa do Craptastic apresenta um layout de células selecionáveis, 1 linha de 3 células seguida por 6 linhas de 6 células, com a seguinte aparência:
del spa sav
A B C D E F
G H I J K L
M N O P Q R
S T U V W X
Y Z 0 1 2 3
4 5 6 7 8 9
Existem células para cada uma das letras A-Z
e spa
que são usadas para adicionar um espaço à string de pesquisa. del
deve ser usado para excluir um caractere; e sav
deve ser usado para salvar a sequência de pesquisa. Ignoraremos essas funções reais para esse desafio; mas as células ainda são selecionáveis para nossos propósitos.
Começamos com uma string de pesquisa vazia e a A
célula selecionada; e usamos os botões de seta para a esquerda, direita, para cima e para baixo para alterar a célula selecionada. Quando a tecla central 'OK' é pressionada, o caractere na célula selecionada é adicionado à string de pesquisa. Por conveniência, nós usaremos <
, >
, ^
, v
e _
para a esquerda, direita, para cima, para baixo e OK, respectivamente.
Para as letras e números, a ação dos botões direcionais é direta. Não há 'wrap-around'; por exemplo, se a célula atual estiver G
, <
não terá efeito.
Então, para inserir a string de pesquisa BIG
, poderíamos usar a sequência
>_>v_<<_
(a inicial >
é necessária para nos mover da célula inicial padrão A
para a célula B
). Como alternativa, é claro que poderíamos usar >_v>_<<_
; mas observe que não há uma sequência menor que 8 teclas que podem fazer o trabalho.
Agora, como a linha superior tem apenas três células, a ação é um pouco diferente e complica um pouco as coisas:
Primeiro, se a célula selecionada estiver na linha superior da letra A-F
, a ^
tecla move a célula selecionada diretamente acima; então A,B
vá para del
, C,D
vá para spa
e E,F
vá para sav
.
Por outro lado, se a célula selecionada é 'del', a v
tecla move a célula selecionada para A
e a >
tecla faz a célula selecionada spa
. Da mesma forma, a v
tecla move a célula selecionada de spa
para C
e sav
para E
.
Isso significa que, por exemplo, se você estiver atualmente na B
célula, a sequência ^v
não retornará você para a B
célula; em vez disso, leva você para a A
célula.
E começando na A
célula, a sequência v>>^
nos move para a C
célula; enquanto a sequência ^>>v
nos move para a E
célula.
O desafio
Dado um programa de TV ou título de filme s
, consistindo apenas de caracteres em A-Z
, 0-9
e space
, seu programa / função deve exibir uma das seqüências de pressionamentos de tecla de comprimento mínimo para inserir s
como a sequência de pesquisa do estado inicial, da maneira Craptastic.
Sua saída deve ser uma sequência ou uma lista de valores distintos que representam uma sequência de cima, baixo, direita, esquerda e OK; para que você não fique restrito ao conjunto de caracteres <>^v_
(por exemplo, udrl*
ou uma lista com elementos inteiros 0,1,2,3,4 seria uma alternativa aceitável, desde que você articule qual é o seu esquema).
Isso é código-golfe ; os tabus usuais da brecha se aplicam. Que as probabilidades estejam sempre a seu favor para cada idioma.
Casos de teste
Abaixo estão as entradas e um exemplo de resposta aceitável (outras seqüências diferentes também estarão corretas, mas devem ter no máximo o comprimento dos exemplos fornecidos).
(Volto a postar o teclado aqui para que você possa tocar mais facilmente visualmente, se for o caso ...)
del spa sav
A B C D E F
G H I J K L
M N O P Q R
S T U V W X
Y Z 0 1 2 3
4 5 6 7 8 9
BIG >_>v_<<_
THE OFFICE >vvv_^^_>>>^_^<_vvv_>>>^^__<<<v_^_>>_
FARGO ^>>v>_^<<v_^>>v>vv_<<<<<^_>>v_
BUFFY >_>vvv_>>>^^^__^<<vvvvv_
DALLAS >>>_<<<_^>>v>v__^^<<v_vvv_
THX1138 >vvv_^^_>>>>vv_<<v__>>_<v_
ON DEMAND >>vv_<_^^^>_v>_>_<<<<vv_^^_>vv_>>^^_
NEWS RADIO >vv_>>>^^_vvv_<<<<_^^^^>_>vvv>_^^^<<v_>>>_<v_v_
ROOM 909 ^>>v>vv_<<<__<<_^^^>_>vvvvvv>_<<<^_>>>v_
FA
não vá em frente, mas para cima e para baixodel
esav
inútil aqui?del
esav
não tem função se 'OK' for usado quando forem selecionados; mas isso desperdiçaria um pressionamento de tecla.Respostas:
JavaScript (ES6), 196 bytes
Jogar este código abaixo de 200 bytes foi basicamente um pesadelo (mas foi divertido). Estou realmente ansioso por uma implementação mais simples e mais curta.
Experimente online!
Quão?
Variáveis
p é a posição atual no teclado de acordo com o seguinte mapeamento e inicializada em 6 (a tecla "A" )
P é a posição do caractere alvo c
Mover codificação
Existem 7 movimentos possíveis. Codificamos cada um deles como um número inteiro de 7 bits. Os 4 bits menos significativos manter o valor de deslocamento V + 6 e os 3 bits mais significativos segurar o símbolo ID S .
Alinhamento com as teclas de função
No início de cada iteração, executamos o código a seguir para garantir que p esteja alinhado com a tecla de função atual, se estivermos localizados na primeira linha:
Mover lógica
A mudança é escolhida com uma longa cadeia de operadores ternários, que é detalhada abaixo.
fonte
Python 2 ,
294293289 bytesExperimente online!
fonte
JavaScript, 311 bytes
Não sei como jogar golfe ...
f
: converta 'A-Z0-9' para 1-36, espaço para "S"g
: obtenha 4 irmãos da chave fornecidah
: encontre o caminho mais curto de p a qF
: a respostafonte