Descargo de responsabilidad: La historia contada dentro de esta pregunta es completamente ficticia e inventada únicamente con el propósito de proporcionar una introducción.
Mi jefe ha conseguido un nuevo robot de juguete y quiere que lo ayude a programarlo. Quiere poder ingresar instrucciones de flechas simples para que se mueva. Estas instrucciones son: ^ (para avanzar) <(para girar a la izquierda) y> (para girar a la derecha). Sin embargo, ahora que he programado el robot, quiere una funcionalidad adicional. Quiere que transforme cualquier secuencia de flechas que ingrese, de modo que en lugar de que el robot tome la ruta indicada, se mueva a la ubicación deseada, indicada por el lugar donde terminaría si hubiera tomado la ruta ingresada, tan eficientemente como posible. Les pido a ustedes, los miembros de PP&CG, que me ayuden con esta tarea.
Tu tarea:
Escriba un programa o función para convertir una cadena formada por flechas en una cadena que llegue a la ubicación indicada por la entrada lo más rápido posible. Girar lleva exactamente el mismo tiempo que retroceder o avanzar.
Entrada:
Una cadena de flechas, como se indicó anteriormente. Si lo desea, las flechas pueden sustituir diferentes caracteres, pero asegúrese de incluir el hecho de que lo hace en su respuesta. Todos los casos de prueba usan las flechas normalmente.
Salida:
Una serie de flechas (o sus caracteres equivalentes) que llevan al robot al destino deseado de la manera más eficiente posible.
Casos de prueba:
Tenga en cuenta que las soluciones ofrecidas son solo posibilidades, y que otras soluciones pueden ser válidas.
>^<<^^>^^ -> ^^<^
^^^^>^^^^ -> ^^^^>^^^^
>>>^^^^^^ -> <^^^^^^
>^>^>^>^ -> (empty string)
^<^^<^^<^^^^ -> >^^>^
Tanteo:
La memoria del robot es limitada, por lo que su programa debe tener el recuento de bytes más bajo posible.
fuente
^<^^<^^<^^^^
->>^^>^
?Respuestas:
Retina ,
1037471 bytesPruébalo en línea! El enlace incluye casos de prueba. Explicación:
Gire a la izquierda en triple giro a la derecha.
Reducir todas las vueltas módulo 4.
Cancelar movimientos en direcciones opuestas.
Gire un triple giro a la derecha nuevamente en un giro a la izquierda. Esto también maneja el caso de lo
>>^>^
que debe hacerse<^<^
.Eliminar giros finales innecesarios.
fuente
Mathematica, 135 bytes
Toma una
List
de las cadenas como entrada.Explicación
Establezca
j
en 0 y establezcai
en 1.Para cada carácter en la entrada ...
Si el personaje es
>
, multiplíqueloi
por la unidad imaginaria. Si el personaje es>
, divídaloi
por la unidad imaginaria. Si el personaje es^
, agreguei
aj
.Tome las partes reales e imaginarias de
j
. Esto proporciona la coordenada cartesiana del robot.Aplique lo siguiente a este resultado:
Establézcalo
a
en una función que genere una cadena con(input)
o0
caracteres^
s, lo que sea mayor.Un
List
compuesto de ...a
aplicado a la primera entrada (parte real dej
)Si la segunda entrada (parte imaginaria de
j
) es mayor que0
,>
. De lo contrario,<
. Establecers
el carácter resultante.a
aplicado al valor absoluto de la segunda entrada.Si la primera entrada es menor que 0
s
,. De lo contrario, cadena vacía.Aplicar
a
a la entrada multiplicada por uno negativo.Únete a las cuerdas.
fuente
Mathematica 119 Bytes
La posición final de JungHwan para el código de ruta era más corta que la mía, así que usar eso. Creo que probablemente hay una forma aún más corta de hacer esto ...
Utilizo la
AnglePath
función incorporada para decidir la posición final. También defino los símbolos L, F y R para "<", "^" y ">", para guardar algunos caracteres de comillas.Uso:
Salida:
fuente
Ruby , 130 bytes
Cómo funciona
Pruébalo en línea!
fuente
J, 90 bytes
solución
explicación
hay un buen truco con números complejos (multiplicar por i es una rotación a la izquierda de 90 grados, y -i te da una correcta).
entonces tomamos nuestra entrada como números complejos: un 1 representa "caminar hacia adelante" e i / -i representan giros a izquierda y derecha.
La posición final se calcula sin esfuerzo con esta representación. Tenga en cuenta que esta es la primera parte (más a la derecha) de mi expresión final anterior:
Esa línea corta de arriba es lo que resuelve el problema. Todo lo demás es descubrir cómo formatear la respuesta, y seguramente podría reducirse significativamente más.
Para comprender la línea corta anterior, tenga en cuenta que
*/\
(el escaneo de productos parciales) le da una lista de las posiciones que enfrenta en cada índice en la entrada: i es norte, 1 y -1 son este y oeste, y -i es sur . Pero dado que comenzamos a mirar hacia el norte, tenemos que multiplicarlos por i que, en J, está representado porj.
(masticar esa oración por un momento).Sólo en realidad "movimiento" cuando la entrada original es 1, por lo que luego se multiplica ese resultado elementwise por la matriz booleana que es 1 donde la entrada original es 1 y 0 de otro modo:
=&1*
. El resultado de esa multiplicación es una matriz de "pasos direccionales". Nuestra posición final es simplemente la suma de esos pasos:+/
pruebas
Desafortunadamente no puedo hacer que esto funcione en TIO por alguna razón, pero pegando lo siguiente en la consola J verificará que funciona:
fuente
C # (.NET Core) , 349 bytes
Pruébalo en línea!
Toma una cadena como entrada y genera la ruta más corta que tomaría la entrada.
No golfista y comentado
fuente
JavaScript (Node.js) , 187 bytes
Pruébalo en línea!
Versión de golf con espacios en blanco
-14 bytes por @Neil
Sin golf:
fuente
t&3
lugar det%4
porque eso funciona con negativot
para que pueda eliminar el4+
y el()
s.(x?"":t)+t
puede escribirse(x?t:t+t)
para un ahorro de 1 byte. El código de movimiento de dirección parece demasiado largo. También creo que probablemente debería reemplazarindexOf
yMath.abs
con comparaciones.indexOf
con una comparación?t-=b=c<'>'||-(c<'^')
.Python 2 ,
174169165 bytesEdite 1: -5 bytes permitiendo que la dirección esté fuera del rango 0-3 y eliminando espacios en blanco.
Edite 2: -4 bytes cambiando la entrada a (1, 2, 3) en lugar de (<, ^,>) ya que el OP lo permitió, así como cambiando mi sistema de coordenadas para permitirme reducir mi cálculo de distancia.
Pruébalo en línea!
Determina las coordenadas finales a través de los valores del diccionario que se ejecutan, luego simplemente imprime la ruta directa al objetivo final.
fuente
Perl 5 , 185 + 1 (-p) = 186 bytes
Pruébalo en línea!
fuente
JavaScript (document.getElementById () kind), 343 caracteres
expandido:
}
Uso:
alertas:
>^^>^
Un robot con reversa habría sido útil.
fuente