Flexagonale Flexagation

9

Als Programmierer ist es nicht sehr interessant, uns beim Flexen zuzusehen. Heute ändern wir das! In dieser Herausforderung werden Sie Hexaflexagone lexen und biegen.

Über

Sehen Sie sich für eine Videoeinführung Viharts-Videos auf Flexagons an

Ein Flexagon ist eine Form, die Sie biegen können, um andere Gesichter als das obere und das untere freizulegen. Wir machen ein Hexahexaflexagon, das 6 Gesichter hat. In der Abbildung unten sehen Sie, wie Sie ein Hexahexaflexagon aus einem Papierstreifen falten.

Hexahexaflexagon-Konstruktion

Azeigt beide Seiten des Streifens. Die beiden weißen Dreiecke sind zusammengeklebt. So würden Sie es beugen:

Flexagon beugen

Unten sehen Sie ein Diagramm möglicher Zustände und ihrer Beziehungen:

Diagramm v6

Die farbigen Kreise repräsentieren die 6 Dreiecke mit der gleichen Nummer aus dem ersten Bild. Jeder der Kreise hat zwei Farben - die unterste repräsentiert die Rückseite (was Sie sehen würden, wenn Sie Ihr Flexagon umdrehen würden), die Sie bei dieser Herausforderung nicht berücksichtigen müssen.

Die grauen Kreise im Hintergrund repräsentieren , wie Sie Ihre flexagon in einem bestimmten Zustand biegen können: Es gibt 4 verschiedene Möglichkeiten , es zu biegen, so nennen wir diese Left, Right, Upund Down. Sie biegen nicht wirklich in diese Richtungen, das Wichtige ist, dass einige einander entgegengesetzt sind.
Wenn Sie in der Mitte sind, können Sie verwenden Leftund Rightzu den anderen Mitte gehen. Um aus dem Zentrum herauszukommen, benutzen Sie Upund Down. Wenn Sie nicht in der Mitte sind, können Sie nicht verwendenLeftoder Right.

Left/Down = clockwise
Right/Up  = anti-clockwise

Herausforderung

Erstellen Sie eine Funktion oder ein Programm, das als Eingabe verwendet, was auf den 18 Vorder- und 18 Rückseiten eines Flexagons sein soll, eine Folge von Links-, Rechts-, Auf- und Ab-Flexen, und geben Sie die 8 sichtbaren Flächen nach den Flexen zurück.

Aufwändige Beispielberechnung:

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"

Beispielimplementierung: http://jdoodle.com/a/18A

Eingabe und erwartete Ausgabe:

> hexaflexaperplexia flexagationdevices RRL
= efxeli

> loremipsumdolorsit hexaflexamexicania RUU
= riuort

> abcdefghijklmnopqr stuvwxyz1234567890 UL
= I can't flex that way :(

> abcdefghijklmnopqr stuvwxyz1234567890 RRRRLLUDDUUUULDD
= uv1278

Regeln

  • Sie können die Eingabe auf jede vernünftige Weise vornehmen und zurückgeben
  • Wenn die Eingabe nicht möglich ist, sollten Sie dies auf eine Weise angeben, die sich von der regulären Ausgabe unterscheidet
  • Es gelten Standardlücken
  • Das ist Codegolf. Der kürzeste Code in Bytes gewinnt.
BlackCap
quelle

Antworten:

2

Haskell (Lambdabot), 270 234 Bytes

(!)=((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))

Verwendungszweck:

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

[0,1,2,3] = [links, rechts, oben, unten]

Danke an @Damien für viele Bytes!

BlackCap
quelle
1
Was nützt das |b/=0=[]!!1? Sie können ein paar Bytes sparen, indem Sie einige Funktionen im punktfreien Stil umschreiben: \(a,_)(b,_)->a==b-> (.fst).(==).fst,(!)=(q.).zip.cycle
Damien
@ Damien löst |b/=0=[]!!1nur eine Ausnahme aus, wenn Sie versuchen, einen unmöglichen Flex zu machen
BlackCap
1
OK, Sie könnten es vereinfachen, indem Sie o n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)eine nicht erschöpfende Musterausnahme auslösen
Damien