Flexagonal flexagation 맨 위와 맨

프로그래머로서 우리를 유연하게 보는 것은 그리 흥미롭지 않습니다. 오늘 우리는 그것을 바꿉니다! 이 도전에서 당신은 hexaflexagons를 플렉스하고 플렉스 할 것입니다.

비디오 소개를 보려면 flexagons에서 viharts 비디오를 시청 하십시오.

플렉사 곤은 맨 위와 맨 아래가 아닌 다른면을 나타 내기 위해 구부릴 수있는 모양입니다. 우리는 6면을 가진 hexahexaflexagon을 만들고 있습니다. 종이 조각에서 hexahexaflexagon을 접는 방법은 아래 이미지를 참조하십시오.

hexahexaflexagon 구조

A스트립의 양쪽을 보여줍니다. 두 개의 흰색 삼각형이 서로 붙어 있습니다. 이것이 당신이 그것을 유연하게하는 방법입니다.

플렉사 곤을 구부리기

아래는 가능한 상태 및 관계의 다이어그램입니다.

다이어그램 v6

컬러 원은 첫 번째 이미지와 같은 숫자의 6 개의 삼각형을 나타냅니다. 각 원에는 두 가지 색상이 있습니다. 하단은 뒷면을 나타냅니다 (플렉사 곤을 뒤집을 위치를 볼 때 볼 수 있음).이 도전에서는 고려할 필요가 없습니다.

구부려서하는 4 개 가지 방법이 있습니다, 우리는 이러한 전화 : 백그라운드에서 회색 원은 당신이 어떤 주어진 상태에서 플렉사 곤 플렉스 수있는 방법을 나타냅니다 Left, Right, UpDown. 실제로 이러한 방향으로 구부러지지는 않지만 중요한 것은 일부는 서로 반대되는 것입니다.

당신이 센터에있는 경우 다른 센터를 사용 Left하고 Right갈 수 있습니다. 사용하는 센터에서 나가려면 UpDown. 당신이 중앙에 없다면 당신은 사용할 수 없습니다Left또는 Right.

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

도전

플렉사 곤의 18 개의 앞면과 18 개의 뒷면에 있어야 할 기능, 왼쪽, 오른쪽, 위, 아래의 굴곡 순서를 입력으로 사용하는 함수 나 프로그램을 만들고, 굴곡 후 8 개의 보이는 얼굴을 반환합니다.

정교한 예제 계산 :

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"

구현 예 : http://jdoodle.com/a/18A

입력 및 예상 출력 :

> hexaflexaperplexia flexagationdevices RRL
= efxeli

> loremipsumdolorsit hexaflexamexicania RUU
= riuort

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

> abcdefghijklmnopqr stuvwxyz1234567890 RRRRLLUDDUUUULDD
= uv1278

규칙

  • 합리적인 방법으로 입력 및 반환 출력을 할 수 있습니다
  • 입력이 불가능한 경우 정규 출력과 다른 방식으로 표시해야합니다.
  • 표준 허점 적용
  • 이것은입니다 Codegolf. 바이트 단위의 최단 코드가 이깁니다.


답변

하스켈 (Lambdabot) 270 234 바이트

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

용법:

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

[0,1,2,3] = [왼쪽, 오른쪽, 위, 아래]

바이트 수가 많은 @Damien에게 감사합니다!


답변