Flexagation flexagonale

9

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.

construction hexahexaflexagon

Amontre les deux côtés de la bande. Les deux triangles blancs sont collés ensemble. Voici comment vous le feriez:

fléchir le flexagon

Voici un diagramme des états possibles et de leurs relations:

Diagramme v6

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, Upet 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 Leftet Rightaller aux autres centres. Pour sortir du centre que vous utilisez Upet Down. Si vous n'êtes pas au centre, vous ne pouvez pas utiliserLeftou 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.
BlackCap
la source

Réponses:

2

Haskell (Lambdabot), 270 234 octets

(!)=((map(snd<$>).groupBy((.fst).(==).fst).sortOn fst).).zip.cycle
o n(a,b)|n>1||b<1=(mod(a+[-1,1,0,0]!!n)3,mod(b+[0,0,-1,1]!!n)3)
(x&y)d|(g,h)<-foldl(flip(.))id(o<$>d)(0,0)=([0,1,2]!x++[3,3,4,4,5,5]!y)!!([0,5,1,1,4,2,2,3,0]!!(3*g+h))

Usage:

> (&) "hexaflexaperplexia" "flexagationdevices" [1,3]
"exioic"

[0,1,2,3] = [gauche, droite, haut, bas]

Merci à @Damien pour beaucoup d'octets!

BlackCap
la source
1
À quoi ça sert |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
Damien
@Damien |b/=0=[]!!1lève juste une exception si vous essayez de faire un flex impossible
BlackCap
1
OK, vous pouvez le simplifier o 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
Damien