Flexagonal flexagation


9

프로그래머로서 우리를 유연하게 보는 것은 그리 흥미롭지 않습니다. 오늘 우리는 그것을 바꿉니다! 이 도전에서 당신은 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. 바이트 단위의 최단 코드가 이깁니다.

답변:


2

하스켈 (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에게 감사합니다!


1
무엇을 사용하고 |b/=0=[]!!1있습니까? 당신은 pointfree 스타일에서 일부 기능을 다시 작성 몇 바이트를 저장할 수 있습니다 : \(a,_)(b,_)->a==b-> (.fst).(==).fst,(!)=(q.).zip.cycle
데미안

@Damien |b/=0=[]!!1은 불가능한 플렉스를 시도하면 예외를 던집니다
BlackCap

1
자, o n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)이것으로 단순화 할 수 있습니다. 철저하지 않은 패턴 예외가 발생합니다
Damien
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.