Ce défi est vaguement inspiré par le jeu Zachtronics Infinifactory .
Vous obtenez une vue de haut en bas d'une grille rectangulaire de convoyeurs, représentée par >v<^
. Il peut y avoir des cellules sans convoyeurs, représentées par des espaces. Voici un exemple:
> <vv <
v ^ >v v
>v^^>vv^
^>^ v
> v<v >>
>v v<^
Cette configuration est implicitement entourée d'un nombre infini d'espaces.
De plus, on vous donne les dimensions d'une cargaison rectangulaire qui est placée sur les convoyeurs dans le coin supérieur gauche de la grille. Votre tâche consiste à déterminer si la cargaison finit par s'arrêter ou si elle finira par se déplacer en boucle.
Bien sûr, la cargaison est susceptible de couvrir plusieurs convoyeurs à la fois, voici donc les règles pour déterminer la direction de la cargaison à chaque étape:
Les convoyeurs opposés s'annulent. Donc, si une cargaison 3x2 couvre l'un des correctifs suivants (délimités par des traits d'union et des tuyaux pour plus de clarté), le résultat serait le même:
+---+ +---+ +---+ |>>^| | ^| |v^^| |^<<| |^ | |^^v| +---+ +---+ +---+
Il en va de même pour ceux-ci:
+---+ +---+ +---+ |v^<| | | |><>| |>>>| |>> | |>><| +---+ +---+ +---+
Étant donné que la position exacte d'un convoyeur sous la cargaison n'est pas pertinente, peu importe les paires que vous annulez.
Cette annulation s'applique avant les autres règles. Par conséquent, pour les autres règles, il n'y aura que des convoyeurs dans au plus deux directions.
- Si la cargaison ne recouvre aucun convoyeur (soit parce que tous les convoyeurs annulent, parce qu'elle ne couvre que les espaces, soit parce qu'elle s'est complètement éloignée de la grille), elle s'arrête.
Si la cargaison couvre plus de convoyeurs dans une direction que dans l'autre, la cargaison se déplace dans cette direction. Par exemple, si une cargaison 3x2 couvrait le patch suivant
>> ^>^
il se déplacerait vers la droite, car il y en a plus
>
que^
. D'un autre côté, s'il couvrait>>^ ^
cette règle ne s'appliquerait pas, car il y a un lien entre
>
et^
.Cela ne laisse que les cas où il y a un lien entre des directions adjacentes (un lien entre des directions opposées aurait été annulé). Dans ce cas, la cargaison continue de se déplacer le long de l'axe dans lequel elle se déplace déjà. Par exemple, si une cargaison 3x2 se déplaçant à droite ou à gauche recouvre maintenant le patch
>>^ ^
il se déplacerait vers la droite. S'il était arrivé sur ce patch en montant ou en descendant, il se déplacerait maintenant à la place. Si ce type de conflit se produit à la toute première étape de la simulation, supposez que la cargaison se déplaçait vers la droite.
Exemples détaillés
Considérez la grille du convoyeur en haut et une cargaison 3x2. Ce qui suit est une visualisation étape par étape du processus. Chaque étape se compose de la grille, avec la cargaison représentée par #
, une petite boîte qui montre les convoyeurs couverts par la cargaison, une autre boîte avec les convoyeurs après annulation, et la règle qui détermine où la cargaison se déplace:
###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
À ce stade, la cargaison entre dans une boucle entre les deux dernières images.
Considérez maintenant un cargo 2x3 à la place:
##<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
Dans la dernière étape, la règle 2 s'applique parce que la cargaison a quitté la grille, donc elle s'arrête et il n'y aura pas de boucle.
Règles et hypothèses
Votre entrée sera la grille du convoyeur comme décrit ci-dessus ainsi que la largeur et la hauteur de la cargaison. Vous pouvez prendre ces trois paramètres dans n'importe quel ordre et format pratique. Pour la grille, cela signifie que vous pouvez lire une seule chaîne avec des lignes séparées par des sauts de ligne ou d'autres caractères, ou un tableau de chaînes, ou un tableau de tableaux de caractères, tant que les cellules de la grille individuelles sont toujours représentées par les caractères >v<^
et les espaces.
Vous devez sortir une valeur véridique si la configuration aboutit à une boucle d'au moins deux images ou une valeur falsifiée si la cargaison s'arrête .
Vous pouvez supposer que la grille sera remplie d'un rectangle avec des espaces et que la cargaison s'insérera initialement dans la grille.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
Il s'agit du code golf, donc la réponse la plus courte (en octets) l'emporte.
Cas de test
Les cas de test sont regroupés par grilles.
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
En tant qu'ensemble supplémentaire de cas de test, considérez que toute entrée où la grille se compose uniquement d'espaces doit donner un résultat falsifié.
J'ai vérifié tous les cas de test manuellement, alors faites-moi savoir si vous pensez que j'ai fait une erreur.
[^^/v<]
devient [[0,1] [0,1];[0,-1] [-1,0]]
? Ou voulez-vous dire que c'est à nous de décider si c'est STDIN, une entrée de chaîne, une entrée de tableau de caractères, etc., mais cela doit toujours être sous la forme de ^, v,> et <?
><^v
ou un espace. Je vais clarifier cela.