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.
A
zeigt beide Seiten des Streifens. Die beiden weißen Dreiecke sind zusammengeklebt. So würden Sie es beugen:
Unten sehen Sie ein Diagramm möglicher Zustände und ihrer Beziehungen:
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
, Up
und 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 Left
und Right
zu den anderen Mitte gehen. Um aus dem Zentrum herauszukommen, benutzen Sie Up
und Down
. Wenn Sie nicht in der Mitte sind, können Sie nicht verwendenLeft
oder 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.
|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
|b/=0=[]!!1
nur eine Ausnahme aus, wenn Sie versuchen, einen unmöglichen Flex zu macheno 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