El querido pez que nada a través del código de > <> (un lenguaje de programación esotérico) ha sido sacado de su entorno natural. Este cambio lo ha vuelto incapaz de moverse de la forma en que solía hacerlo: lo que solía ser un movimiento toroidal se ha restringido a un simple movimiento de izquierda a derecha. Pero los programas> <> todavía se escriben como si el pez fuera capaz de moverse a través de ellos. Es su tarea, querido programador, escribir un programa para linealizar un programa> <>. Y hazlo en el menor número de bytes posible; Los peces no tienen recuerdos muy grandes.
Movimiento en> <>
En> <>, el movimiento es toroidal y un carácter a la vez. Esto significa que el pez (el puntero) puede "envolverse" desde el final de una línea hasta el principio. En> <>, el pez también es capaz de moverse de arriba hacia abajo, de abajo hacia arriba y de derecha a izquierda, en contraste con la forma en que se mueven la mayoría de los punteros. Entonces este patrón de movimiento sería válido:
>>>^ >>>v
>>>^ v
y terminaría en un bucle infinito (volviendo a la línea superior una vez que pasa infinitamente por la inferior).
El pez se mueve en una cuadrícula de longitud igual al máximo (longitud de la fila) y la altura igual al número de filas.
¿Cómo sabes de qué manera se mueve el pez? Estos comandos cambian el vector de dirección del movimiento (por ejemplo, (-1,0)
significa de derecha a izquierda):
Command | Direction Change
---------------------------
> | (1,0) (default)
< | (-1,0)
^ | (0,1)
v | (0,-1)
/ | (x,y) -> (y,x)
\ | (x,y) -> (-y,-x)
| | (x,y) -> (-x,y)
_ | (x,y) -> (x,-y)
# | (x,y) -> (-x,-y)
; | (0,0)
Como se señaló, el pez comienza a moverse de izquierda a derecha, es decir, con el vector de dirección (1,0)
. El pez comienza a analizar los comandos comenzando con el primer comando que ve y cambia su dirección si un comando coincide con uno de los cambiadores de dirección mencionados anteriormente.
El pez deja de moverse cuando ve a ;
y finaliza el programa.
Entrada
La entrada será un programa válido (por ejemplo, no de bucle infinito) dado a través de STDIN. También puede leer un archivo si lo desea. Las líneas de cada programa no serán necesariamente de la misma longitud.
La entrada se da como una cadena, con nuevas líneas que separan cada línea en el programa.
Los programas no se repetirán, lo que también significa que siempre terminarán con a ;
.
Salida
La salida será el programa linealizado. Es decir, debe devolver todos los caracteres (incluidos los cambiadores de dirección) que el pez vería si ejecutara el programa "normalmente". Estos son todos los personajes en su camino hacia el ;
.
Si la entrada tiene líneas de longitud desigual y el pez termina moviéndose a lo largo de una línea más corta que la longitud de la línea más larga, debe tratar eso como si el pez se moviera sobre un espacio (ver casos de prueba).
Aquellos familiarizados con> <> sabrán que los cambiadores de dirección no son la única forma de hacer movimiento en él, sino que, por simplicidad, tratan la entrada como si fueran la única forma de afectar el movimiento.
Reglas
- Se aplican lagunas estándar
- Puede escribir un programa completo o una función
- La entrada se proporciona a través de STDIN o un archivo como una cadena que contiene las líneas del programa separadas por líneas nuevas (
\n
)- Puede tomar la entrada de manera diferente, dentro de lo razonable (no dude en preguntarme si tiene un tipo específico de entrada en mente). No puede rellenar la entrada con espacios para que las longitudes de línea coincidan.
- Consulte esta meta publicación con respecto a la entrada flexible. Tal como están las publicaciones, el consenso general debe ser lo más flexible posible dentro de lo razonable.
- La salida es una sola cadena a través de STDOUT o devuelta por la función (dependiendo de lo que elija hacer, consulte la Regla 2)
Casos de prueba
v >v
>abcv//;
gfed<^ih
v>abcv<defghi^//>v;
v >v
>abcv//;
gfed<^
v>abcv<defg ^//>v;
abcdef;
abcdef;
abcd|;
abcd|dcba;
abcd#;
abcd#dcba;
abcd\;
_
abcd\_\dcba;
^;
>abcde/
^jihg<
^ >abcde/ <ghij^a;
;
;
Respuestas:
Röda ,
405393392391371366361236234232230223200 bytesPruébalo en línea!
¡Verifique las salidas!
Explicación (obsoleta)
Ediciones
%
lugar de verificar si x o y está por encima de los límites, lo que allanó el camino para 2 más!`\`
lugar de"\\"
c=""
a la segunda línea y luego eliminó la nueva línea que le siguewhile
llaves de (gracias a @fergusq por detectar eso)a=X
fuera de las declaraciones if+1
finalindexOf
y reestructurado para guardar 2 bytesuntil[c=";"]
lugar dewhile[c!=";"]
l.=[" "]*L
fuente
x=((x+X)%#l)
lugar dex+=X
. Lamentablemente,(-1)%#l
todavía regresa-1
.y
demasiado:y=y%#f
.key
lugar decmp
y usar en{...}while[...]
lugar dewhile[...]do ... done
.Python 2,
262243237235234233231221219218217 bytesToma entrada como
['<line_1>', '<line_2>', ...]
Pruébalo en línea!
-19 bytes gracias a @math_junkie
-6 bytes gracias a @ThisGuy
-2 bytes extrayendo
max(map(L,i))
a una variable (porque teóricamente se usa dos veces).-1 byte al reducir la cantidad de veces que
i[y][x]
aparece.-1 byte usando
'\x00'
para no tener que hacer la[1:]
parte deo[1:]
la salida-2 bytes usando en
\0
lugar de\x00
-10 bytes gracias a @KritixiLithos por darme cuenta de que puedo rellenar todo lo que quiero en el lado derecho porque
error adicional será ignorado (sin cambio de byte) porque la variable extraída estaba fuera del bucle
-2 bytes porque ahora solo uso
len
2 veces, así que la reasignación toma 2 bytes adicionales-2 byte usando en
while';'not in o
lugar dewhile o[-1]!=';'
y usando eno=''
lugar deo='\0'
. Esto no solo ahorra 2 bytes, sino que también elimina el byte nulo inicial que técnicamente no era realmente válido.Explicación
fuente
try
desde lafind
devolución-1
si no se encuentra: TIOlen
a una variable, por ejemplo,L
para guardar 3 bytes y otros 4 cambiando la asignación multilínea a0
1 líneax=y=k=0
.Rubí,
274200187183Afeitó unos pocos caracteres más al soltar la matriz de impulso,
d
.Estoy muy orgulloso de este. ¡Esto fue divertido! Toma una serie de cadenas y devuelve la cadena adecuada.
Comentó a continuación.
fuente
PHP 7,
291260bytesfuente
JavaScript,
242236235231220 bytesPruébalo en línea!
fuente