프로그래머로서 우리를 유연하게 보는 것은 그리 흥미롭지 않습니다. 오늘 우리는 그것을 바꿉니다! 이 도전에서 당신은 hexaflexagons를 플렉스하고 플렉스 할 것입니다.
약
비디오 소개를 보려면 flexagons에서 viharts 비디오를 시청 하십시오.
플렉사 곤은 맨 위와 맨 아래가 아닌 다른면을 나타 내기 위해 구부릴 수있는 모양입니다. 우리는 6면을 가진 hexahexaflexagon을 만들고 있습니다. 종이 조각에서 hexahexaflexagon을 접는 방법은 아래 이미지를 참조하십시오.
A
스트립의 양쪽을 보여줍니다. 두 개의 흰색 삼각형이 서로 붙어 있습니다. 이것이 당신이 그것을 유연하게하는 방법입니다.
아래는 가능한 상태 및 관계의 다이어그램입니다.
컬러 원은 첫 번째 이미지와 같은 숫자의 6 개의 삼각형을 나타냅니다. 각 원에는 두 가지 색상이 있습니다. 하단은 뒷면을 나타냅니다 (플렉사 곤을 뒤집을 위치를 볼 때 볼 수 있음).이 도전에서는 고려할 필요가 없습니다.
구부려서하는 4 개 가지 방법이 있습니다, 우리는 이러한 전화 : 백그라운드에서 회색 원은 당신이 어떤 주어진 상태에서 플렉사 곤 플렉스 수있는 방법을 나타냅니다 Left
, Right
, Up
와 Down
. 실제로 이러한 방향으로 구부러지지는 않지만 중요한 것은 일부는 서로 반대되는 것입니다.
당신이 센터에있는 경우 다른 센터를 사용 Left
하고 Right
갈 수 있습니다. 사용하는 센터에서 나가려면 Up
및 Down
. 당신이 중앙에 없다면 당신은 사용할 수 없습니다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에게 감사합니다!