Este desafío es un premio para ais523 por ganar la categoría " Novato del año " en " Lo mejor de PPCG 2016 ". ¡Felicidades!
BackFlip es un lenguaje de programación esotérico creado por el usuario ais523 , que ha creado más de 30 interesantes esolangs .
BackFlip es un lenguaje 2D como Befunge o > <> donde el puntero de instrucción atraviesa una cuadrícula de texto (el programa), moviéndose hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha, cambiando de dirección según el carácter en el que se encuentre. Críticamente, la cuadrícula en un programa BackFlip cambia a medida que se atraviesa, un poco como la hormiga de Langton .
Para este desafío, puede suponer que un programa BackFlip es siempre una cuadrícula de texto rectangular (todas las líneas tienen la misma longitud), 1 × 1 de tamaño mínimo, que solo contiene los caracteres ./\<>^V
. ( .
se usa para visibilidad en lugar de espacio). Semánticamente, el BackFlip que usaremos aquí es idéntico a la especificación original .
El puntero de instrucción (IP) en BackFlip siempre comienza justo a la izquierda de la esquina superior izquierda del programa, hacia la derecha. Hay tres tipos de comandos que puede encontrar:
.
es un no-op. La IP continúa en la dirección en que se dirigía. El no-op sigue siendo un no-op./
Y\
son espejos. Reflejan la IP en la dirección indicada por su ángulo, luego cambian al otro tipo de espejo .- Por ejemplo, si la IP se dirige hacia la izquierda
\
, comienza a moverse hacia arriba en lugar de hacia la izquierda y se\
convierte en a/
.
- Por ejemplo, si la IP se dirige hacia la izquierda
<
,>
,^
, YV
son flechas. Redirigen la IP a la dirección en la que apuntan, luego cambian a una flecha que apunta en la dirección de la que proviene la IP (opuesta a la dirección en que se movía la IP) .- Por ejemplo, si la IP se dirige hacia abajo
>
, comienza a moverse hacia la derecha en lugar de hacia abajo y se>
convierte en una^
porque esa es la dirección de la que proviene la IP.
- Por ejemplo, si la IP se dirige hacia abajo
Un programa BackFlip finaliza cuando la IP se sale de los límites, es decir, se desconecta de la red. Resulta que todos los programas BackFlip finalmente terminan porque los bucles infinitos son imposibles. (Puede suponer que esto es cierto).
Su objetivo en este desafío es escribir un programa o función que tome un programa BackFlip y genere el número de movimientos que realiza el puntero de instrucción antes de que finalice el programa. Es decir, ¿cuántos pasos toma la IP en el curso de la ejecución de un programa? Esto incluye el paso inicial en la cuadrícula y el paso final fuera de ella.
Por ejemplo, el puntero de instrucciones toma 5 pasos en la cuadrícula trivial ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
Entonces la salida a ....
es 5
.
En la cuadrícula 4 × 2 más compleja
\...
\.><
la IP sale de la cuadrícula en su noveno paso, por lo que la salida es 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
El código más corto en bytes gana.
Puede tomar la entrada como una matriz de líneas o matriz de caracteres en lugar de una cadena de varias líneas si lo desea, pero debe usar los caracteres ./\<>^V
(no los códigos de operación enteros). Puede usar espacio en lugar de .
si lo prefiere. Está bien si se \
necesita escapar caracteres como en la entrada. La salida es siempre un entero más de uno.
Casos de prueba
....
5
\...
\.><
9
.
2
..
3
.
.
2
\
2
^
2
.^.
3
<.
2
\\
\/
7
>V
^<
6
>\
>/
6
\><
2
\><
\><
7
\><
\><
\><
12
\.V.
\.\<
5
\.V.
\./<
9
V./\
V./\
>./<
..\/
14
\V..
.^..
\/><
.V..
.^..
20
\.V.V.
\./.\<
.>\<..
..^.^.
31
\.V.V.V.
\./>/.\<
.>\>\<..
..^.^.^.
69
\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.
145
\.V.V.V.V.V.V.V.V.V.V.
\./>/>/>/>/>/>/>/>/.\<
.>\>\>\>\>\>\>\>\>\<..
..^.^.^.^.^.^.^.^.^.^.
9721
fuente
/
la IP hará que suba y hacia arriba/
hará que la IP vaya hacia la derecha, como si fuera una pelota que rebota en una pared. (Pero recuerde los/
cambios en la barra invertida después de que la IP lo toque).Respuestas:
JavaScript (ES6), 158 bytes
Desarrollado independientemente de la respuesta de @ tsh, aunque sorprendentemente similar.
La asignación de direcciones
^<v>
a enteros 0-3 se rige por el hecho de que.search('^')
devuelve 0 ya que^
es un metacarácter regexp.fuente
Haskell ,
333325 bytesEDITAR:
f
puntos y fusionadob
.b
toma una lista deString
sy devuelve unInteger
.Pruébalo en línea!
Cómo funciona
C a
es un tipo de datos utilizado porque Haskell no permitirá que un tipo sea recursivo sin declararlo explícitamente.C
también es un constructor de envoltura yc
es su función de desenvoltura correspondiente. Solo se usa cona=[Int]
.C [Int]
representa un comando de celda, como una función que toma un[Int]
argumento direction ( ) y devuelve un par de una nueva dirección y un nuevoC [Int]
valor.b
Es la función principal. Convierte cada carácter en unC
valor, luego llama#
.g
es la cuadrícula como una lista de cadenas.\
necesita ser escapado y también lo es el carácter más largo para mencionar, su resultado se usa como el valor predeterminado para la búsqueda de la lista.#
ejecuta la simulación principal, verifica los límites&
y genera nuevas cuadrículas con?
.[y,x]
es la posición actual,d
la dirección actual yg
la cuadrícula actual.[f,e]
es la siguiente dirección, yn
es un par de ella y la siguiente cuadrícula.l&i
comprueba si el índicei
está fuera de los límites de la listal
. (VuelveTrue
fuera de límites, ya que eso evita una condición de guardia ficticia en#
).f(l!!i)==(d,x)
,(f?i)l==(d,m)
dóndem
está la listal
con eli
elemento th reemplazado porx
.(?i)
es una lente más general, que se enfoca en el i-ésimo elemento de una lista, en este caso usado con la(,) [Int]
instancia de functor.n
es la función que representa un punto.a v
es una función que representa una flecha en direcciónv
.m s
es una función que representa un espejo;s==1
por\\
ys==-1
para/
.fuente
JavaScript, 172 bytes
Pero no puedo probar el último caso de prueba ya que tuve un desbordamiento de pila en mi máquina. (debería funcionar si hay una máquina con ram más grande)
Usamos un número para la dirección:
Deje
d
ser el número de dirección ...Vamos a
(x, y)
ser la posición actual, la siguiente posición es:x+(t&1&&t-2)
,y+(~t&1&&t-1)
Nota:
La función toma un parámetro con el siguiente formato:
Pruébalo aquí
fuente
Uncaught RangeError: Maximum call stack size exceeded
16GB de RAM.var
declaración lo hacen pasar el último caso de prueba (el intérprete js optimiza la llamada de cola en modo estricto)C,
232221 bytesToma entrada en el primer argumento, imprime el resultado. Requiere que la entrada contenga al menos 1 nueva línea (por lo tanto, si solo hay 1 fila, debe terminar con una nueva línea)
Ejemplo de uso:
Descompostura:
fuente
Python 3 , 286 bytes
[f () toma la entrada en forma de,
{(0,0):'/',(0,1):'.'}
así que también he escrito una función g () para convertir una matriz de líneas a esa forma]Pruébalo en línea!
fuente