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.
la source
[^^/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.Réponses:
Rubis,
306 298 251 204198Edit: Merci beaucoup à Ventero qui a beaucoup raccourci le code en appliquant des astuces incroyables!
Entrée et sortie
Le code représente une fonction ruby qui prend trois paramètres:
Il revient
1
(véridique) s'il y a une boucle, ounil
(faux) si la cargaison se repose.Les tests
Ici, il passe tous les tests de Martin: http://ideone.com/zPPZdR
Explication
Il n'y a aucune astuce intelligente dans le code; c'est une mise en œuvre assez simple des règles.
Dans le code ci-dessous,
move
est une fonction récursive qui effectue un mouvement selon les règles, et:Une version plus lisible est disponible ici .
Remarque: le code golfé a subi plusieurs modifications et n'est plus similaire à la version lisible.
la source
r
contient des entrées supplémentaires en plus des quatre directions,r[y>=0&&x>=0&&g[y]&&g[y][x]]+=1
devrait économiser quelques octets.Python 2, 207 octets
Saisissez la grille sous forme de liste de lignes, par exemple
suivi de la largeur et de la hauteur. Renvoie
0
ou enTrue
conséquence.Explication
la source
cmp
à une variable?D
à la clé de position devrait le faire.Julia -
394300246214 octetsRenvoie 1 si la cargaison fait une boucle et 0 si elle s'arrête. Ce n'est pas "strictement" vrai / faux, en ce que Julia n'autorise pas 0 et 1 dans des contextes booléens ... mais je considère les valeurs
x
quibool(x)==true
sont vraies etbool(x)==false
sont fausses.L'entrée
A
doit prendre la forme d'un tableau de caractères. Si vous copiez / collez la grille du convoyeur, vous devrez la mettre sous la forme appropriée. Pour vous éviter d'avoir à le manipuler manuellement, utilisez ce qui suit:Où évidemment,
(PASTE GRID HERE)
devrait être remplacé par la grille elle-même. Revérifiez les espaces à la fin de chaque ligne, pour vous assurer qu'il a réellement tous les espaces (il ne vérifie pas que toutes les lignes sont de longueur égale). Notez que cette ligne ne fait pas partie du code de solution réel, juste un morceau de code pratique pour faciliter l'utilisation du code de solution.Non golfé:
Remarque:
1-[19 8]i%82%3
a été choisi pour mapper les cinq caractères possibles aux paires de coordonnées appropriées par la méthode la plus efficace que j'ai pu trouver. C'est aussi la raison d'utiliser 5 pour remplir les espaces lors de la créationG
- c'est un caractère à un chiffre qui correspond à[0 0]
.Exemple d'utilisation:
la source
f(A,x,y)=
est plus court quef=(A,x,y)->
.f=
et en ferai une fonction anonyme lorsque j'aurai fini de jouer au golf.f()=
contre()->
.