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.
[^^/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é.