Este desafío está inspirado libremente en el juego de Zachtronics Infinifactory .
Se le da una vista de arriba hacia abajo de una cuadrícula rectangular de transportadores, representados por >v<^
. Puede haber celdas sin transportadores, representadas por espacios. Aquí hay un ejemplo:
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Esta configuración está implícitamente rodeada por un número infinito de espacios.
Además, se le dan las dimensiones de una pieza rectangular de carga que se coloca en los transportadores en la esquina superior izquierda de la cuadrícula. Su tarea es determinar si la carga se detiene o si terminará moviéndose en un bucle.
Por supuesto, es probable que la carga cubra varios transportadores a la vez, así que aquí están las reglas para determinar la dirección de la carga en cada paso:
Los transportadores opuestos se cancelan entre sí. Entonces, si una carga de 3x2 cubre alguno de los siguientes parches (delineados con guiones y tuberías para mayor claridad), el resultado sería el mismo:
+---+ +---+ +---+ |>>^| | ^| |v^^| |^<<| |^ | |^^v| +---+ +---+ +---+
Lo mismo vale para estos:
+---+ +---+ +---+ |v^<| | | |><>| |>>>| |>> | |>><| +---+ +---+ +---+
Dado que la posición exacta de un transportador debajo de la carga es irrelevante, no importa qué pares cancele.
Esta cancelación se aplica antes que las otras reglas. Por lo tanto, para las otras reglas solo habrá transportadores en un máximo de dos direcciones.
- Si la carga no cubre ningún transportador (ya sea porque todos los transportadores se cancelan, porque cubre solo espacios o porque se movió completamente fuera de la red), se detiene.
Si la carga cubre más transportadores de una dirección que de la otra, la carga se mueve en esa dirección. Por ejemplo, si una carga de 3x2 cubrió el siguiente parche
>> ^>^
se movería hacia la derecha, porque hay más
>
que^
. Por otro lado, si cubría>>^ ^
esta regla no se aplicaría, porque hay un vínculo entre
>
y^
.Esto deja solo casos en los que hay un empate entre direcciones adyacentes (un empate entre direcciones opuestas se habría cancelado). En este caso, la carga sigue moviéndose a lo largo del eje en el que ya se está moviendo. Por ejemplo, si una carga 3x2 que se mueve hacia la derecha o hacia la izquierda ahora está cubriendo el parche
>>^ ^
se movería a la derecha. Si hubiera llegado a este parche moviéndose hacia arriba o hacia abajo, ahora se movería hacia arriba. Si este tipo de conflicto ocurre en el primer paso de la simulación, suponga que la carga se ha estado moviendo hacia la derecha.
Ejemplos detallados
Considere la rejilla del transportador en la parte superior y una carga de 3x2. La siguiente es una visualización paso a paso del proceso. Cada paso consiste en la cuadrícula, con la carga representada por #
, una pequeña caja que muestra los transportadores cubiertos por la carga, otra caja con los transportadores después de la cancelación y la regla que determina dónde se mueve la carga:
###vv < > <vv < > <vv < > <vv < > <vv < > <vv <
###^ >v v ###^ >v v v ^ >v v v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ ###v^^>vv^ ###v^^>vv^ ###^^>vv^ ###^>vv^ >###>vv^
^>^ v ^>^ v ### ^>^ v ###^>^ v ###>^ v ###^ v
> v<v >> > v<v >> > v<v >> > v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
|> <| | | | v | | v | | >| | >| | >v| | >v| |>v^| |> ^| |v^^| | ^^|
| v | | v | | >| | >| | | | | | | | | | ^| | | | ^>| | >|
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3 Rule 4 Rule 4 Rule 3
================================================================================
> <vv < > <### < > <vv <
v ###v v v ###v v v ###v v
>###>vv^ >v^^>vv^ >###>vv^
^>^ v ^>^ v ^>^ v
> v<v >> > v<v >> > v<v >>
>v v<^ >v v<^ >v v<^
+---+ +---+ +---+ +---+ +---+ +---+
|^ >| | >| |vv | | v | |^ >| | >|
|v^^| | ^^| |^ >| | >| |v^^| | ^^|
+---+ +---+ +---+ +---+ +---+ +---+
Rule 3 Rule 4 Rule 3
En este punto, la carga entra en un bucle entre los dos últimos cuadros.
Ahora considere una carga 2x3 en su lugar:
##<vv < >##vv < > <vv < > <vv < > <vv < > <vv <
## ^ >v v ##^ >v v ##^ >v v v ^ >v v v ^ >v v v ^ >v v
##>v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##v^^>vv^ ##^^>vv^ >v^^>vv^
^>^ v ^>^ v ## ^>^ v ## ^>^ v ##^>^ v ##^>^ v
> v<v >> > v<v >> > v<v >> >##v<v >> > ##<v >> > ##<v >>
>v v<^ >v v<^ >v v<^ >v v<^ >v v<^ ## v<^
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
|> | |> | | <| | | |v | |v | | >| | >| |>v| |>v| | | | |
| v| | v| |v | |v | | >| | >| | | | | | | | | | v| | v|
| | | | | >| | | | | | | | | | | | v| | v| |>v| |>v|
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
Rule 4 Rule 3 Rule 4 Rule 3 Rule 3 Rule 3
================================================================================
> <vv < > <vv < > <vv <
v ^ >v v v ^ >v v v ^ >v v
>v^^>vv^ >v^^>vv^ >v^^>vv^
^>^ v ^>^ v ^>^ v
> ##<v >> > v<v >> > v<v >>
## v<^ ## v<^ >v v<^
## ## ##
## ##
##
+--+ +--+ +--+ +--+ +--+ +--+
| v| | v| |>v| |>v| | | | |
|>v| |>v| | | | | | | | |
| | | | | | | | | | | |
+--+ +--+ +--+ +--+ +--+ +--+
Rule 3 Rule 4 Rule 2
En el último paso, la regla 2 se aplica porque la carga se ha salido de la red, por lo que se detiene y no habrá un bucle.
Reglas y suposiciones
Su entrada será la rejilla del transportador como se describió anteriormente junto con el ancho y la altura de la carga. Puede tomar estos tres parámetros en cualquier orden y formato convenientes. Para la cuadrícula, esto significa que puede leer una sola cadena con líneas separadas por líneas nuevas u otros caracteres, o una matriz de cadenas, o una matriz de matrices de caracteres, siempre que las celdas individuales de la cuadrícula sigan representadas por los caracteres >v<^
y espacios
Debe generar un valor verdadero si la configuración da como resultado un bucle de al menos dos cuadros o un valor falso si la carga se detendrá.
Puede suponer que la cuadrícula se rellenará con un rectángulo con espacios y que la carga inicialmente se ajustará a la cuadrícula.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
Los casos de prueba están agrupados por cuadrículas.
Grid (2x2):
>v
^<
Width Height Loop?
1 1 True
1 2 True
2 1 True
2 2 False
Grid (3x3):
> v
^ <
Width Height Loop?
1 1 False
1 2 False
1 3 False
2 1 False
2 2 True
2 3 True
3 1 False
3 2 True
3 3 False
Grid (4x3):
>^>v
v^v
^ <<
Width Height Loop?
2 2 False
Grid (6x5):
>v>v>v
^v^v^v
^v^v^v
^>^>^v
^<<<<<
Width Height Loop?
1 1 True
1 2 False
2 1 True
2 2 True
2 4 True
2 5 False
3 1 False
3 2 True
3 3 True
3 5 True
6 2 False
6 3 True
6 5 False
Grid (10x6):
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Width Height Loop?
1 1 False
2 3 False
2 6 False
3 2 True
5 4 False
6 1 True
10 6 False
Como un conjunto adicional de casos de prueba, considere que cualquier entrada donde la cuadrícula consista únicamente en espacios debe producir un resultado falso.
Revisé todos los casos de prueba manualmente, así que avíseme si cree que he cometido un error.
fuente
[^^/v<]
convierte en una cuadrícula de 2x2 con[[0,1] [0,1];[0,-1] [-1,0]]
? ¿O quiere decir que depende de nosotros si es STDIN, una entrada de cadena, una entrada de matriz de caracteres, etc., pero todavía tiene que tener la forma de ^, v,> y <?><^v
o un espacio. Lo aclararé.Respuestas:
Ruby,
306 298 251 204198Editar: ¡ Muchas gracias a Ventero que acortó mucho el código aplicando algunos trucos increíbles!
Entrada y salida
El código representa una función ruby que toma tres parámetros:
Regresa
1
(verdad) en caso de que haya un bucle, onil
(falso) en caso de que la carga descanse.Pruebas
Aquí está pasando todas las pruebas de Martin: http://ideone.com/zPPZdR
Explicación
No hay trucos ingeniosos en el código; Es una implementación bastante sencilla de las reglas.
En el siguiente código,
move
es una función recursiva que realiza un movimiento de acuerdo con las reglas y:Una versión más legible está disponible aquí .
Nota: el código de golf ha sufrido varias modificaciones y ya no es similar a la versión legible.
fuente
r
contiene entradas adicionales además de las cuatro direcciones,r[y>=0&&x>=0&&g[y]&&g[y][x]]+=1
debe guardar algunos bytes.Python 2, 207 bytes
Ingrese la cuadrícula como una lista de filas, por ej.
seguido por el ancho y la altura. Devoluciones
0
o enTrue
consecuencia.Explicación
fuente
cmp
a una variable?D
a la tecla de posición debería hacerlo.Julia -
394300246214 bytesDevuelve 1 si la carga se repite y 0 si se detiene. No es "estrictamente" verdad / falsedad, ya que Julia no permite 0 y 1 en contextos booleanos ... pero considero valores
x
para los quebool(x)==true
son verdaderos ybool(x)==false
falsos.La entrada
A
debe tener la forma de una matriz de caracteres. Si está copiando / pegando la cuadrícula del transportador, deberá colocarlo en la forma adecuada. Para evitar que tenga que manejarlo manualmente, use lo siguiente:Donde obviamente,
(PASTE GRID HERE)
debe reemplazarse con la propia cuadrícula. Verifique dos veces los espacios al final de cada línea, para asegurarse de que realmente tenga todos los espacios (no verifica para asegurarse de que todas las líneas tengan la misma longitud). Tenga en cuenta que esta línea no es parte del código de solución real, solo es un código conveniente para facilitar un poco el uso del código de solución.Sin golf:
Nota:
1-[19 8]i%82%3
ha sido elegido para asignar los cinco caracteres posibles a los pares de coordenadas apropiados por el método más eficiente que pude encontrar. Esta es también la razón para usar 5 para llenar los espacios al crearG
: es un carácter de un solo dígito al que se asigna[0 0]
.Ejemplo de uso:
fuente
f(A,x,y)=
es más corto quef=(A,x,y)->
.f=
y lo convertiré en una función anónima cuando termine de jugarlo.f()=
versus()->
.