En tant que programmeurs, nous regarder flex n'est pas très intéressant. Aujourd'hui, nous changeons cela! Dans ce défi, vous lexerez et fléchirez des hexaflexagones.
À propos de
Pour une introduction vidéo, regardez les vidéos de viharts sur les flexagons
Un flexagon est une forme que vous pouvez fléchir pour révéler des visages autres que le haut et le bas; nous faisons un hexahexaflexagone, qui a 6 faces. Voir l'image ci-dessous pour savoir comment plier un hexahexaflexagone sur une bande de papier.
A
montre les deux côtés de la bande. Les deux triangles blancs sont collés ensemble. Voici comment vous le feriez:
Voici un diagramme des états possibles et de leurs relations:
Les cercles colorés représentent les 6 triangles avec le même numéro de la première image. Chacun des cercles a deux couleurs - le bas représente le plus la face arrière (ce que vous verriez si vous retourniez votre flexagon), que vous n'avez pas à prendre en compte dans ce défi.
Les cercles gris en arrière - plan représentent la façon dont vous pouvez fléchir votre flexagone dans un état donné: il y a 4 façons différentes de le fléchir, nous appelons ces Left
, Right
, Up
et Down
. Vous ne fléchissez pas réellement dans ces directions, l'important est que certains sont opposés les uns aux autres.
Si vous êtes au centre, vous pouvez utiliser Left
et Right
aller aux autres centres. Pour sortir du centre que vous utilisez Up
et Down
. Si vous n'êtes pas au centre, vous ne pouvez pas utiliserLeft
ou Right
.
Left/Down = clockwise
Right/Up = anti-clockwise
Défi
Créez une fonction ou un programme qui prend en entrée ce qui devrait être sur les 18 faces avant et les 18 faces arrière d'un flexagon, une séquence de flexions gauche, droite, haut et bas, et renvoie les 8 faces visibles après les flexions.
Exemple de calcul élaboré:
flex "hexaflexaperplexia"
"flexagationdevices"
[Right, Right, Left]
Divide a strip of paper into 18 triangles:
1/2\3/1\2/3\1/2\3/1\2/3\1/2\3/1\2/3 Front
4/4\5/5\6/6\4/4\5/5\6/6\4/4\5/5\6/6 Back
Write "hexaflexaperplexia" on the front of the paper strip:
1/2\3/1\2/3\1/2\3/1\2/3\1/2\3/1\2/3
hexaflexaperplexia
123123123123123123
h a e p p x Face 1, Initially the front face
e f x e l i Face 2, Initially the back face
x l a r e a Face 3, Initially hidden
Write "flexagationdevices" on the back of the paperstrip:
4/4\5/5\6/6\4/4\5/5\6/6\4/4\5/5\6/6
flexagationdevices
445566445566445566
fl at ev Face 4, up from 3
ex io ic Face 5, up from 2
ag nd es Face 6, up from 1
Flex it [Right, Right, Left]
The initial visible face is 1: "haeppx"
flexing Right ..
The current visible face is 2: "efxeli"
flexing Right ..
The current visible face is 3: "xlarea"
flexing Left ..
The current visible face is 2: "efxeli"
flexed [Right, Right, Left]!
outputting "efxeli"
Exemple d'implémentation: http://jdoodle.com/a/18A
Entrée et sortie attendue:
> hexaflexaperplexia flexagationdevices RRL
= efxeli
> loremipsumdolorsit hexaflexamexicania RUU
= riuort
> abcdefghijklmnopqr stuvwxyz1234567890 UL
= I can't flex that way :(
> abcdefghijklmnopqr stuvwxyz1234567890 RRRRLLUDDUUUULDD
= uv1278
Règles
- Vous pouvez prendre des entrées et renvoyer des sorties de toute manière raisonnable
- Si l'entrée est impossible, vous devez l'indiquer d'une manière différente de la sortie régulière
- Des échappatoires standard s'appliquent
- C'est ça
Codegolf
. Le code le plus court en octets gagne.
|b/=0=[]!!1
? Vous pouvez enregistrer quelques octets en réécrivant certaines fonctions dans un style sans point:\(a,_)(b,_)->a==b
->(.fst).(==).fst
,(!)=(q.).zip.cycle
|b/=0=[]!!1
lève juste une exception si vous essayez de faire un flex impossibleo n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)
en lançant une exception de modèles non exhaustifs