Muitos jogos antigos do Game Boy frequentemente exigiam a entrada de strings do usuário. No entanto, não havia teclado. Isso foi tratado ao apresentar ao usuário uma "tela do teclado" da seguinte forma:
O 'ponteiro caráter' iria começar na letra A. O usuário navegar para cada caractere desejado com o D-Pad 's quatro botões ( UP
, DOWN
, LEFT
e RIGHT
) e pressione BUTTON A
para anexá-lo para a cadeia final.
Observe:
- A grade se quebra , pressionando
UP
a letra A o levaria até T. - O 'ponteiro de caractere' permanece colocado após o anexo de uma letra
O desafio
O teclado acima tem opções para mudar de maiúsculas e minúsculas e tem uma forma irregular. Portanto, para simplificar, neste desafio, usaremos o seguinte teclado (o canto inferior direito é ASCII char 32, um espaço):
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 .
Digitar em teclados como esse é extremamente lento - portanto, para facilitar isso, sua tarefa é escrever um programa que informe ao usuário a maneira mais rápida possível de digitar uma determinada string. Se houver várias maneiras mais rápidas, você só precisará mostrar uma.
A chave de saída deve ser:
>
paraRIGHT
<
paraLEFT
^
paraUP
v
paraDOWN
.
forBUTTON A
(acrescente a letra atual à string)
Por exemplo, quando recebida a string DENNIS
, a solução seria assim:
>>>.>.>>v..>>.>>>v.
Regras / Detalhes
- Por favor, lembre-se, a grade envolve!
- Você pode enviar um programa completo ou uma função, desde que ela pegue a cadeia inicial e produza uma cadeia de solução. As novas linhas de espaço em branco / à direita são irrelevantes desde que a saída esteja correta.
- Você pode assumir que a entrada será composta apenas por caracteres digitáveis no teclado especificado, mas pode estar vazia.
- Isso é código-golfe , então o código mais curto vence. Aplicam-se lacunas de código-golfe padrão.
Casos de teste
Geralmente existem várias soluções do mesmo comprimento. Para cada caso de teste, incluí o comprimento ideal e um exemplo. Você não precisa imprimir o comprimento da sua resposta, apenas a solução.
FLP.TKC -> 25 steps: <<.<v.<<<v.<<<v.^.<<^.<^.
MOYLEX -> 23 steps: <<v.>>v.>>>v.>^^.^.<<^.
FEERSUM -> 18 steps: <<.<..<vv.>.>>.<^.
MEGO -> 14 steps: <<v.<^.>>.>vv.
A CAT -> 17 steps: .<^.>>>v.<<.<<vv.
BOB -> 10 steps: >.<vv.>^^.
(space) -> 3 steps: <^.
(empty) -> 0 steps: (empty)
Você pode ver meu gerador de caixa de teste em repl.it - notifique-me se houver algum erro.
Obrigado a todos pelos envios! Atualmente, o usuário ngn é o vencedor com 61 bytes, mas se alguém encontrar uma solução mais curta, o pequeno tique verde pode ser movido;)
Respostas:
Dyalog APL , 61 bytes
4 7∘{∊'.',⍨⍉↑b⍴¨¨'^v' '<>'⌷¨⍨⊂¨a>b←a⌊⍺-a←⍺|↓2-/0,⍺⊤⍵⍳⍨⎕a,'.'}
assume
⎕IO←0
⎕a,'.'
o alfabeto seguido de um ponto final⍵⍳⍨
encontre os caracteres do argumento como índices 0..26 (' '
e todos os outros terão 27)⍺⊤
codificar na base 7 (observe que o argumento esquerdo⍺
está vinculado4 7
), obtenha uma matriz 2 × n0,
Anexar zeros à esquerda2-/
diferenças entre colunas adjacentes↓
dividir a matriz em um par de vetoresa←⍺|
tomam os módulos 4 e 7 respectivamente, atribuem aa
b←a⌊⍺-a
fazerb
o menora
e seu inverso modular'^v' '<>'⌷¨⍨⊂¨a>b
escolha^
ouv
para o primeiro vetor e<
ou>
para o segundo, com base em ondea
difereb
b⍴¨¨
repita cada um dessesb
momentos⍉↑
misture os dois vetores em uma única matriz e transponha, obtenha uma matriz n × 2'.',⍨
acrescente.
-s à direita∊
aplainarfonte
JavaScript (ES6), 147 bytes
Um comportamento interessante
substring
é que ele troca os argumentos se o segundo for menor que o primeiro. Isso significa que, se eu calcular o número ideal de pressionamentos esquerdo / direito como um número entre -3 e 3, posso adicionar 3 e pegar a substring de<<<>>>
começar em 3 e obter o número correto de setas. Enquanto isso, as prensas para baixo / para cima são tratadas simplesmente procurando uma matriz usando um bit a bit e a diferença nas linhas com 3; dessa forma, é um pouco mais curto, pois há menos elementos da matriz.fonte
Ruby, 107 bytes
Ungolfed in program program
fonte
Mathematica, 193 bytes
Golfe
Legível
fonte
Python 2, 298 bytes
Isso é mais longo do que deveria ser, mas ...
Qualquer ajuda seria muito apreciada!
É inserido entre aspas.
l
retorna a localização de um caractere no teclado.As duas
if
instruções no meiod
são para verificar se seria o melhor para 'envolver' o teclado.A entrada
s
foi"A"
anexada a ela porque a posição inicial do cursor éA
.Passamos a corda em pares, descartando a última (que não é um par
[:-1]
:), encontrando a distância mínima entre as duas metades do par.Agradeço ao Flp.Tkc por me dizer que posso fazer em
a=abs
vez de dizerabs
todas as vezes!fonte
Java 8, 1045 bytes
Golfe
Legível
Explicação
A solução é uma abordagem direta: força bruta pouco otimizada. O método
g(...)
é uma primeira pesquisa básica de profundidade, passando por cada permutação (para cima, para baixo, esquerda, direita). Com algumas pequenas modificações no pedido para os casos de teste, recebo a saída:fonte