Flexagacja flexagonalna

9

Będąc programistami, obserwowanie nas elastycznych nie jest zbyt interesujące. Dziś to zmieniamy! W tym wyzwaniu będziesz lekturze i wyginaniem heksafleksagonów.

O

W celu wprowadzenia wideo obejrzyj filmy wideo Viharts na temat fagotów

Fleksagon to kształt, który można wygiąć, aby odsłonić ściany inne niż górna i dolna; wykonujemy sześcioheksafleksagon, który ma 6 ścian. Zobacz zdjęcie poniżej, jak złożyć sześciokąt heksafleksagon z paska papieru.

konstrukcja heksaheksafleksagonowa

Apokazuje obie strony paska. Dwa białe trójkąty są ze sobą sklejone. Tak byś to zgiął:

zginanie flexagon

Poniżej znajduje się schemat możliwych stanów i ich zależności:

Schemat v6

Kolorowe koła reprezentują 6 trójkątów o tym samym numerze z pierwszego obrazu. Każdy z okręgów ma dwa kolory - dolny najbardziej reprezentuje tylną twarz (to, co zobaczyłbyś, gdybyś odwrócił fleksagon), czego nie musisz brać pod uwagę w tym wyzwaniu.

Szare okręgi w tle przedstawiają jak można wyginać swoje flexagon w danym stanie: istnieją 4 różne sposoby, aby go wygiąć, nazywamy te Left, Right, Upi Down. W rzeczywistości nie zginasz się w tych kierunkach, ważne jest to, że niektóre są naprzeciw siebie.
Jeśli jesteś w centrum, możesz użyć Lefti Rightprzejść do innych centralnych. Aby wyjść z centrum, używasz Upi Down. Jeśli nie jesteś w centrum, nie możesz z niego korzystaćLeftlub Right.

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

Wyzwanie

Utwórz funkcję lub program, który weźmie jako dane wejściowe to, co powinno być na 18 ścianach przednich i 18 ścianach tylnych fleksonu, sekwencję zgięć w lewo, w prawo, w górę iw dół i zwróć 8 widocznych ścian po zgięciach.

Opracuj przykładowe obliczenia:

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"

Przykładowa implementacja: http://jdoodle.com/a/18A

Dane wejściowe i oczekiwane wyniki:

> hexaflexaperplexia flexagationdevices RRL
= efxeli

> loremipsumdolorsit hexaflexamexicania RUU
= riuort

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

> abcdefghijklmnopqr stuvwxyz1234567890 RRRRLLUDDUUUULDD
= uv1278

Zasady

  • Możesz przyjmować dane wejściowe i zwracać dane wyjściowe w dowolny rozsądny sposób
  • Jeśli wejście jest niemożliwe, powinieneś to zaznaczyć w inny sposób niż zwykłe wyjście
  • Obowiązują standardowe luki
  • Jest Codegolf. Najkrótszy kod w bajtach wygrywa.
Gajówka
źródło

Odpowiedzi:

2

Haskell (Lambdabot), 270 234 bajtów

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

Stosowanie:

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

[0,1,2,3] = [lewo, prawo, góra, dół]

Dzięki @Damien za dużo bajtów!

Gajówka
źródło
1
Jaki jest pożytek |b/=0=[]!!1? Możesz zapisać kilka bajtów przepisując niektóre funkcje w stylu bezcelowym: \(a,_)(b,_)->a==b-> (.fst).(==).fst,(!)=(q.).zip.cycle
Damien
@Damien |b/=0=[]!!1rzuca wyjątek, jeśli spróbujesz wykonać niemożliwy flex
BlackCap
1
OK, możesz to uprościć, o n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)generując wyjątek Niewyczerpujące wzory
Damien