Muchos juegos antiguos de Game Boy a menudo requerían una entrada de cadena del usuario. Sin embargo, no había teclado. Esto se manejó presentando al usuario una "pantalla de teclado" como esta:
El 'puntero del carácter' comenzaría en letra A. El usuario navegar a cada carácter deseado con el D-Pad 's cuatro botones ( UP
, DOWN
, LEFT
y RIGHT
), a continuación, pulse BUTTON A
para anexar a la cadena final.
Tenga en cuenta:
- La cuadrícula se enrolla , por lo que presionar
UP
mientras está en la letra A lo llevaría a T. - El 'puntero de caracteres' permanece fijo después de agregar una letra
El reto
El teclado anterior tiene opciones para cambiar mayúsculas y minúsculas y tiene una forma irregular. Entonces, por simplicidad, en este desafío usaremos el siguiente teclado (la parte inferior derecha es ASCII char 32, un espacio):
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 .
Escribir en teclados como este es extremadamente lento, por lo tanto, para facilitar esto, su tarea es escribir un programa que le diga al usuario la forma más rápida posible de escribir una cadena dada. Si hay varias formas más rápidas, solo necesita mostrar una.
La clave de salida debe ser:
>
paraRIGHT
<
paraLEFT
^
paraUP
v
paraDOWN
.
paraBUTTON A
(agregar la letra actual a la cadena)
Por ejemplo, cuando se le da la cadena DENNIS
, la solución se vería así:
>>>.>.>>v..>>.>>>v.
Reglas / Detalles
- Por favor, recuerde, la cuadrícula se envuelve!
- Puede enviar un programa completo o una función, siempre que tome la cadena inicial y produzca una cadena de solución. Los espacios en blanco / las nuevas líneas finales son irrelevantes siempre que la salida sea correcta.
- Puede suponer que la entrada solo consistirá en caracteres que se pueden escribir en el teclado especificado, pero puede estar vacío.
- Este es el código de golf , por lo que gana el código más corto. Se aplican las lagunas de código estándar de golf.
Casos de prueba
Por lo general, hay múltiples soluciones de la misma longitud. Para cada caso de prueba, he incluido la longitud óptima y un ejemplo. No necesita imprimir la longitud en su respuesta, solo la solución.
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)
Puede ver mi generador de casos de prueba en repl.it ; notifíqueme si hay algún error.
¡Gracias a todos por las presentaciones! El usuario ngn es actualmente el ganador con 61 bytes, pero si alguien puede encontrar una solución más corta, se puede mover la pequeña marca verde;)
Respuestas:
Dyalog APL , 61 bytes
4 7∘{∊'.',⍨⍉↑b⍴¨¨'^v' '<>'⌷¨⍨⊂¨a>b←a⌊⍺-a←⍺|↓2-/0,⍺⊤⍵⍳⍨⎕a,'.'}
asume
⎕IO←0
⎕a,'.'
el alfabeto seguido de un punto final⍵⍳⍨
encuentre los caracteres del argumento allí como índices 0..26 (' '
y todos los demás serán 27)⍺⊤
codificar en la base 7 (tenga en cuenta que el argumento izquierdo⍺
está vinculado4 7
), obtenga una matriz 2 × n0,
anteponer ceros a la izquierda2-/
diferencias entre columnas adyacentes↓
dividir la matriz en un par de vectoresa←⍺|
tomarlos módulo 4 y 7 respectivamente, asignar aa
b←a⌊⍺-a
hacerb
el más pequeño dea
y su inverso modular'^v' '<>'⌷¨⍨⊂¨a>b
elija^
ov
para el primer vector y /<
o>
para el segundo, según dóndea
difiere deb
b⍴¨¨
repetir cada uno de esosb
momentos⍉↑
mezclar los dos vectores en una sola matriz y transponerla, obtener una matriz n × 2'.',⍨
agregar.
-s a la derecha∊
aplanarfuente
JavaScript (ES6), 147 bytes
Un comportamiento interesante
substring
es que intercambia los argumentos si el segundo es menor que el primero. Esto significa que si calculo el número óptimo de presiones izquierda / derecha como un número entre -3 y 3, puedo sumar 3, y tomar la subcadena de<<<>>>
comenzar en 3 y obtendré el número correcto de flechas. Mientras tanto, las prensas hacia abajo / arriba se manejan simplemente buscando una matriz usando un bit y la diferencia en filas con 3; de esta manera es un poco más corto ya que hay menos elementos de matriz.fuente
Ruby, 107 bytes
Sin golf en el programa de prueba
fuente
Mathematica, 193 bytes
Golf
Legible
fuente
Python 2, 298 bytes
Esto es más largo de lo que debería ser, pero ...
Cualquier ayuda sería muy apreciada!
Toma entrada entre comillas.
l
devuelve la ubicación de un personaje en el teclado.Las dos
if
declaraciones en el mediod
son para verificar si sería óptimo 'envolver' el teclado.La entrada se
s
ha"A"
antepuesto a ella porque la posición inicial del cursor esA
.Recorremos la cadena en pares, descartando la última (que no es un par
[:-1]
:), encontrando la distancia mínima entre las dos mitades del par.¡Gracias a Flp.Tkc por decirme que puedo hacer en
a=abs
lugar de decirabs
cada vez!fuente
Java 8, 1045 bytes
Golf
Legible
Explicación
La solución es un enfoque directo: fuerza bruta mal optimizada. El método
g(...)
es una primera búsqueda de profundidad básica que pasa por cada permutación (arriba, abajo, izquierda, derecha). Con algunas ligeras modificaciones al ordenar los casos de prueba, obtengo el resultado:fuente