Une fourmi marche le long des bords (pas des faces) d'un cube en fil de fer. Chaque sommet qu’il rencontre le présente avec une fourche à partir de laquelle deux nouvelles arêtes se ramifient. La fourmi choisit quel chemin tourner - left
ou right
. Ces directions sont relatives à la fourmi, qui fait face au sommet et se trouve en dehors du cube. Votre but est de déterminer, à partir de la séquence de left
/ right
choix que la fourmi a pris, si elle se termine à la même position qu’elle a commencé.
Par exemple, si la fourmi tourne à gauche quatre fois ( left left left left
), elle aura traversé un carré dans le sens anti-horaire et terminé au même endroit où elle a commencé. Mais si ça marche left left left left right
, ça finira à un endroit différent du cube. De plus, si cela se produit left right right right left
, il se termine sur son bord de départ, mais face au sommet opposé, qui ne compte pas comme la même position.
Le chemin de la fourmi peut répéter des arêtes, y compris l'arête sur lequel elle a commencé, mais ce qui compte est l'endroit où il se termine après la séquence complète.
Ecrivez une fonction nommée qui prend la séquence de tours de la fourmi et indique si la fourmi est revenue à sa position de départ après la séquence. Assigner une fonction sans nom à une variable suffit à en faire une fonction nommée.
(Édition: si votre langue ne peut pas créer de fonction nommée, elle peut également implémenter la fonction avec des entrées et des sorties via STDIN / impression ou la pile. Si cela n'est pas possible, faites-en un extrait dans lequel l'entrée et la sortie sont enregistrées. variables.)
Contribution
Une séquence de left
/ right
décisions de longueur 0
à 31
inclusive, représentée dans un format de votre choix. Cela peut être une chaîne de lettres R
/ L
, une liste de nombres 1
/ -1
ou un tableau de booléens. Rien de plus ringard que de les avoir comme noms de méthode ou chaînes utiles pour votre code.
S'il vous plaît, postez les cas de test dans votre format s'il diffère des cas de test ci-dessous.
Sortie
True
/ False
, 0
/ 1
ou les analogues dans votre langue.
Critères gagnants
Le moins d'octets gagne. N'oubliez pas que vous devez donner une fonction nommée. Vous pouvez avoir du code en dehors de la fonction, mais ces octets comptent également. Votre fonction devrait se comporter correctement si elle est appelée plusieurs fois.
Cas de test
True
cas (un par ligne, le second est une liste vide):
1 1 1 1
-1 -1 -1 -1
1 -1 1 -1 1 -1
1 1 -1 -1 1 1 -1 -1
-1 1 1 -1 -1 1 1 -1
1 1 1 -1 -1 -1 -1 1
1 -1 -1 1 -1 -1
1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
-1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
False
cas (un par ligne):
1
1 1
1 1 1
-1 1
1 -1 -1 -1 1
1 -1 -1 1 1
-1 1 -1 1
1 1 1 1 -1
-1 -1 1 -1 1 -1 -1 1
1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1
Voici les mêmes cas de test avec L
'et R
'.
True
cas:
RRRR
LLLL
RLRLRL
RRLLRRLL
LRRLLRRL
RRRLLLLR
RLLRLL
RRRRLLLLRLLRLL
LLLRLLRRLRLRRRRRRRRRRRRRRRRR
False
cas:
R
RR
RRR
LR
RLLLR
RLLRR
LRLR
RRRRL
LLRLRLLR
RLRRRRLLLRRLLL
Défi de crédit supplémentaire
Même chose, mais avec un dodécaèdre plutôt qu'un cube. Voir Hunt the Wumpus pour des idées.
Réponses:
GolfScript, 24 caractères (19 pour le corps de la fonction uniquement)
Math FTW!
Testez cette solution en ligne.
Cette fonction prend en entrée un tableau binaire (0 pour gauche, 1 pour droite) et renvoie 1 pour vrai et 0 pour faux.
Conceptuellement, cela fonctionne en faisant pivoter le cube afin que la fourmi garde toujours la même position et la même orientation, et en vérifiant si le cube se retrouve finalement dans la même orientation que celle dans laquelle il avait commencé.
En particulier, nous pouvons représenter les virages gauche et droit sous la forme de deux cartes linéaires en trois dimensions, où un virage à gauche correspond à une rotation de 90 ° autour de l' axe x , c'est-à-dire la carte ( x , y , z ) → ( x , z , - y ), et un virage à droite correspond à une rotation de 90 ° autour de l’ axe des y , c’est-à-dire la carte ( x , y , z ) → ( z , y , - x ).
Au début de la fonction, nous définissons simplement un vecteur à trois éléments contenant les valeurs positives distinctes (1, 2, 3), lui appliquons la séquence de cartes de rotation et vérifions si le vecteur résultant est égal à celui initial.
(En fait, pour sauver quelques caractères, je transforme les coordonnées de sorte que le vecteur initial soit (0, 1, 2) et que les cartes soient ( x , y , z ) → ( x , z , −1− y ) et ( x , y , z ) → ( z , y , −1− x ), mais le résultat final est identique.)
Ps. Merci à fier haskeller d' avoir repéré le bogue dans la version d'origine de cette solution.
Perl, 58 caractères
Comme demandé dans les commentaires, voici la même solution portée à Perl. (Cette version utilise en fait les coordonnées non transformées, car la transformation n'enregistre aucun caractère en Perl.)
Testez cette solution en ligne.
Bonus: Une fourmi sur un dodécaèdre (GolfScript, 26 caractères)
Testez cette solution en ligne.
Comme la fonction ant-on-a-cube ci-dessus, cette fonction prend en entrée un tableau binaire (0 pour gauche, 1 pour droite) et renvoie 1 si la ant se termine à la même position et à la même orientation qu'au début, ou 0 autrement.
Cette solution utilise une représentation légèrement plus abstraite que la solution de cube ci-dessus. Plus précisément, il tire parti du fait que le groupe de symétrie de rotation du dodécaèdre est isomorphe au groupe alternatif A 5 , c'est-à-dire au groupe de permutations paires de cinq éléments. Ainsi, chaque rotation possible du dodécaèdre (qui mappe les arêtes sur les arêtes et les sommets sur les sommets) peut être représentée uniquement comme une permutation d’un tableau à cinq éléments, avec des rotations consécutives correspondant à l’application séquentielle des permutations correspondantes.
Il suffit donc de trouver deux permutations L et R pouvant représenter les rotations gauche et droite. Plus précisément, ces permutations doivent être de 5 cycles (pour que leur application soit renvoyées cinq fois à l'état initial), elles ne doivent pas être des puissances les unes des autres (c'est-à-dire R ≠ L n pour tout n ), et elles doivent satisfaire la relation. ( LR ) 5 = (1), où (1) désigne la permutation d'identité. (En réalité, ce critère indique que le chemin
LRLRLRLRLR
doit revenir à la position d'origine.)Fixation de la permutation L à un simple décalage de baril vers la gauche, c’est-à-dire une cartographie ( a , b , c , d , e ) → ( b , c , d , e , a ), puisqu’elle peut être implémentée dans GolfScript en seulement deux chars (
(+
), nous trouvons qu'il y a cinq choix possibles pour la permutation de R. Parmi ceux-ci, j'ai choisi la cartographie ( a , b , c , d , e ) → ( c , e , d ,b , a ), car il a également une implémentation GolfScript relativement compacte. (En fait, je le mets en œuvre en commençant par entrelacer les éléments avec2*2%
pour obtenir ( a , c , e , b , d ), puis en permutant les deux derniers éléments avec[~\]
et en appliquant enfin la permutation L de manière inconditionnelle pour déplacer un jusqu'à la fin.)Le lien de démonstration en ligne ci-dessus inclut certains cas de test de chemins valides sur un dodécaèdre qui retournent à l'origine, tels que:
la source
{[~@]-1%}*[~@]
ou){[~@]-1%}*-1%
remplacer votre{2*2%[~\]}*(+
Python, 68
Prend une liste de 1 et -1. Basé sur les rotations 3D: vérifie si le point (3,2,1) se termine à la même position après avoir appliqué une série de rotations. Il y a deux rotations possibles, correspondant à 1 et -1. Chacun se fait en permutant deux coordonnées et en changeant le signe de l'une d'entre elles. Les coordonnées exactes à changer et le signe à permuter ne sont pas importants.
EDIT: il s’agit essentiellement de la même solution que "Perl, 58".
la source
p
en une variable distincte.Mathematica
Inspiré par la solution de Ilmari Karonen. Le groupe de symétrie de rotation d'un cube est isomorphe à S 4 .
Cube, 51 octets
Prend une liste de
1
s et-1
s en entrée.Essayez-le en ligne!
Dodécaèdre, 55 octets
Prend une liste de
1
s et-1
s en entrée.Essayez-le en ligne!
la source
C (gcc) ,
118116107105 octets-2 octets grâce à ceilingcat
Essayez-le en ligne!
Supposons que nous donnions au cube les coordonnées suivantes:
Si nous commençons par le coin D, passer à C ou H peut être considéré comme une rotation du cube autour de nous. Se déplacer vers la droite signifierait une rotation dans le sens anti-horaire autour de l'axe Z, et vers la gauche signifierait une rotation dans le sens des aiguilles d'une montre autour de l'axe X. Ce sont les deux seules rotations dont nous devons nous préoccuper. Comme chaque rotation fait exactement 90 degrés, nous pouvons imaginer que les coins «glissent» le long des bords. Pour aller à droite, cela signifie A -> B, B -> C, C -> D, D -> A et E -> F de l'autre côté. Pour aller à gauche, on obtient plutôt A -> E, E - > H etc.
Étant donné que chaque coin ne glisse que le long d'un bord, cela signifie qu'une seule des dimensions de chaque point change pour chaque rotation. Lorsque B se déplace vers C, seule sa composante y change, et lorsque H se déplace vers D, seule sa composante z change, etc. De plus, puisque les coordonnées sont limitées à 0 et 1, nous pouvons considérer chaque point comme un nombre binaire, le bit approprié étant inversé lors du déplacement.
Nous pouvons voir que pour un mouvement à droite, A et C retournent leurs x, tandis que D et B retournent leurs y. Si nous changeons de perspective pour regarder de ce côté de la tête de cube et ignorons le composant z (qui ne change pas pour cette rotation de toute façon), nous obtenons:
Un motif se dégage: pour les points qui retournent leur x, x == y, alors que l'inverse est vrai pour les points qui retournent leur y. Ceci est valable pour l'autre type de rotation, mais avec z au lieu de x.
En d'autres termes:
Maintenant, nous pouvons facilement effectuer toutes les rotations et, à la fin, voir si le dernier D correspond à notre D. initial.
Stocker chaque point en tant que nombre unique est une donnée, mais en C, assigner un tableau de caractères est bien plus compact qu'un tableau int. Nous prenons soin de choisir des caractères dont les trois bits inférieurs correspondent à 000..111, ce qui permet d’ignorer simplement le reste des bits. Pour inverser les coordonnées, il suffit de procéder à une XOR avec le masque de bits approprié.
la source
Python - 110, 150
Prend une liste d'entiers avec
-1
pour tourner à gauche,1
pour tourner à droite.Cube, 110:
Tester:
Dodécaèdre, 150:
la source
Marbelous 188
Vol sans vergogne de l’algorithme d’ Ilmari Karonen dans le but de montrer une nouvelle langue.
Ce script attend une chaîne de 0x00 pour left et de 0x01 pour right sur stdin, suivie de 0x0A (nouvelle ligne). Il génère "0" pour un cas ayant échoué et "1" pour un succès.
exemple exécuté:
la source
Python 2 , 57 octets
Essayez-le en ligne!
Ceci utilise la représentation de permutation
où left et right (0 et 1) correspondent à une longueur de 4 cycles sur 4 éléments. Nous itérons sur l'entrée en appliquant la permutation indiquée et vérifions si le résultat est égal à la valeur initiale.
Nous commençons en
a,b,c,d
tant que liste à quatre éléments0,1,2,3
. Nous les compactons en un seul nombre base-4n=abcd
, avec la valeur initialen=27
correspondant à la0123
base 4. Nous instancions chacun la permutation de manière arithmétiquen
.Puisque les deux résultats commencent par
d
, nous pouvons fairen%4
pour extraired
, puisn%4*64
pour le déplacer dans la bonne positiond___
. Les autres chiffres sontabc
extraits sous forme den/4
. Nous devons les insérer dans les trois valeurs les plus basses.Pour la direction
x=0
, nous inséronsabc
tels quels et pour lesx=1
faire pivotercab
. La rotation peut être réalisé que*16%63
, ce qui prendabc
àabc00
lacab
. (Le%63
irait mal sura==b==c==3
, mais ces valeurs ne sont pas possibles.) Depuis que faire%63
est un non-op, l'expression dépendant de la direction*16**x%63
donneabc
oucab
au besoin.Python 2 , 55 octets
Essayez-le en ligne!
la source
Haskell,
104103999796/6764 caractèresJe pense que l'équivalent de droite / gauche serait un type de données Direction comme ceci:J'ai donc supposé dans ma réponse qu'ils étaient disponibles.edit: a effectivement réalisé que les booléens conduiraient à un code plus court. True représente un virage à gauche et False, un virage à droite (même si, techniquement, le code fonctionnerait de la même manière s'il était inversé; il est symétrique).
96 caractères:
g est une fonction qui, étant donné une liste de directions, rendrait la météo sans que la fourmi ne revienne à sa place.
explication de la représentation de la position: la position de la fourmi est codée sous la forme d'un tuple de trois entiers. le premier entier représente le sommet vers lequel se dirige la fourmi. le premier bit représente si le sommet est dans la moitié haut / bas, le second est la moitié gauche / droite et le troisième est la moitié arrière / avant. ceci est fait de sorte que le passage d'un sommet à un sommet voisin soit effectué en retournant un bit.
le deuxième entier est la quantité que le sommet de la fourmi changerait s'il allait à gauche. Par exemple, si la fourmi était au sommet 3 et que le second entier était 4, alors qu'après avoir tourné à gauche, le sommet serait 7. Notez que cette puissance sera toujours égale à 2, car un bit est inversé en déplaçant un sommet.
le troisième entier est le même, mais pour aller à droite; Je sais que cela peut être calculé par les deux premiers, mais je ne sais pas comment. si vous avez une idée, s'il vous plaît dites-moi.
quelque chose à noter est que, en tournant à gauche, le troisième entier reste le même et le second devient celui compris entre 1 2 et 4 qui n'est ni le second ni le troisième, qui se trouve être identique à 7 - deuxième entier - troisième entier.
J'ai choisi cette façon de représenter une position car (comme on vient de le dire dans le paragraphe précédent), il était trivial de calculer la position suivante.
explication des fonctions:
la fonction (%) est la fonction qui prend le sommet actuel et le montant pour le changer, et le change. il arrive au bit qui va changer et le retourne (de manière très numérique).
la fonction m est une fonction qui prend la position de la fourmi et de la direction, puis renvoie la nouvelle position en utilisant la note notée précédemment.
ensuite, la fonction m est combinée à l'aide de foldl (ce qui est un peu comme
reduce
en javascript, mais un peu plus expressif) pour créer la fonction g, la réponse à cette question.Haskell, 64 caractères
inspiré par la réponse de @ alphaalpha, voici sa version portée sur haskell:
edit:
Je me sens maintenant incroyablement stupide à cause de la réponse d'Imari Karonen. je vais peut-être porter sa réponse sur haskell.une autre édition: ne se sentait pas aussi stupide que sa réponseestétait mauvaisemodifier: commutation de fait à l' aide à l' utilisation des listes tuples comme
Ord
instance et le[ ... ]
sucre syntaxique rend plus courtela source
[0,1,2,3]
à une variable et l'utiliser à la fois en tant que saisie de l'expression et en tant que vérification du résultat?[0..3]
... Je ne sais pas pourquoi je ne l'avais pas remarqué plus tôt. Merci. mais maintenant ton tour ne marche pas. tant pis.Haskell , 53 octets
Essayez-le en ligne!
Même logique que ma réponse Python , même pensée
mod
etdiv
sont plus longues à écrire.Haskell , 58 octets
Essayez-le en ligne!
la source
APL (Dyalog Unicode) , 22 octets ( SBCS d'Adam )
Essayez-le en ligne!
H.PWiz a suggéré que l'inversion des étapes ne faisait aucune différence, ce qui donnait -2 octets.
Eh bien, c’est embarrassant, car il était censé être beaucoup plus court que GolfScript. Au moins j'ai essayé.
La fonction est nommée
f
et, dans les cas de test,1
représente un virage à gauche (boolean true) et0
représente un virage à droite (boolean false).⍬
représente la liste vide.la source
APL (Dyalog) , 21 octets
Essayez-le en ligne! (Utilisation de l'environnement de test de la réponse d'Erik the Outgolfer )
Je prends à gauche et à droite au fur
1
et à mesure2
. Ceci utilise les permutations suivantes deabcd
:J'applique les permutations correspondant à
1
et2
à⍳4 : 1 2 3 4
, et vérifie s'il est inchangéla source
Bash ,
71 à65 octetsEssayez-le en ligne!
Comme beaucoup de réponses précédentes, utilise une représentation du groupe de rotations du cube généré par 1234-> 4123 et 1234-> 4312. Utilise des chiffres au lieu de lettres pour pouvoir utiliser un opérateur ternaire avec une extension arithmétique. Attend son entrée en tant que 0 et 1 séparés par des espaces et les sorties via le code de sortie.
6 octets sauvés grâce au commentaire de @ manatwork!
la source
brainfuck , 119 octets, 137 octets
Cube, 119 octets
Essayez-le en ligne!
Dodécaèdre, 137 octets
Essayez-le en ligne!
Les seules différences entre les deux programmes sont la configuration et les permutations. La permutation de gauche utilisée ici est
DCAEB
, qui semblait être le conjugué le plus golfeux disponible.la source
Gelée , 14 octets
Essayez-le en ligne!
1
= virage à gauche,0
= virage à droite. Basé sur ma solution Dyalog.Malheureusement, Jelly n'a pas de fonctions nommées. Si je ne peux pas utiliser une entrée implicite et dois supposer que c'est dans une variable, cette version de même longueur fera:
Cela suppose que l’entrée est dans le registre (© / ®).
la source
Perl - 120, 214
Prend un tableau (liste) de booléens.
Cube (120):
Dodécaèdre (214):
la source