Uốn cong


9

Là lập trình viên, xem chúng tôi flex không thú vị lắm. Hôm nay chúng ta thay đổi điều đó! Trong thử thách này, bạn sẽ lex và flex hexaflexagons.

Trong khoảng

Để xem video giới thiệu, hãy xem (các) video viharts trên flexagons

Một hình khối là một hình dạng mà bạn có thể uốn cong để lộ các khuôn mặt khác với mặt trên và mặt dưới; chúng tôi đang tạo ra một hexahexaflexagon, có 6 mặt. Xem hình ảnh bên dưới về cách gấp hexahexaflexagon ra khỏi dải giấy.

xây dựng hexahexaflexagon

Acho thấy cả hai mặt của dải. Hai hình tam giác màu trắng được dán lại với nhau. Đây là cách bạn sẽ uốn nó:

uốn cong

Dưới đây là sơ đồ các trạng thái có thể và mối quan hệ của chúng:

Sơ đồ v6

Các vòng tròn màu đại diện cho 6 hình tam giác có cùng số từ hình ảnh đầu tiên. Mỗi circes có hai màu - phần dưới cùng đại diện cho mặt sau (những gì bạn sẽ thấy nếu bạn lật hình tròn của mình xung quanh), mà bạn không cần phải xem xét trong thử thách này.

Các vòng tròn màu xám ở chế độ nền đại diện như thế nào bạn có thể uốn cong flexagon của bạn trong bất cứ tiểu bang đưa ra: có 4 cách khác nhau để flex nó, chúng ta gọi là những Left, Right, UpDown. Bạn không thực sự uốn cong theo các hướng này, điều quan trọng là một số đối diện với nhau.
Nếu bạn ở trung tâm, bạn có thể sử dụng LeftRightđi đến những trung tâm khác. Để ra khỏi trung tâm bạn sử dụng UpDown. Nếu bạn không ở trung tâm, bạn không thể sử dụngLefthoặc Right.

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

Thử thách

Tạo một chức năng hoặc chương trình lấy đầu vào trên 18 mặt trước và 18 mặt sau của hình uốn cong, một chuỗi các mặt trái, phải, lên và xuống và trả lại 8 mặt có thể nhìn thấy sau các uốn cong.

Xây dựng ví dụ tính toán:

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"

Ví dụ triển khai: http://jdoodle.com/a/18A

Đầu vào và đầu ra dự kiến:

> hexaflexaperplexia flexagationdevices RRL
= efxeli

> loremipsumdolorsit hexaflexamexicania RUU
= riuort

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

> abcdefghijklmnopqr stuvwxyz1234567890 RRRRLLUDDUUUULDD
= uv1278

Quy tắc

  • Bạn có thể lấy đầu vào và trả lại đầu ra theo bất kỳ cách hợp lý nào
  • Nếu đầu vào là không thể, bạn nên chỉ ra một cách khác biệt với đầu ra thông thường
  • Áp dụng sơ hở tiêu chuẩn
  • Đây là Codegolf. Mã ngắn nhất trong byte thắng.

Câu trả lời:


2

Haskell (Lambdabot), 270 234 byte

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

Sử dụng:

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

[0,1,2,3] = [trái, phải, lên, xuống]

Cảm ơn @Damien vì rất nhiều byte!


1
Việc sử dụng là |b/=0=[]!!1gì? Bạn có thể lưu một vài byte viết lại một số chức năng theo kiểu không điểm: \(a,_)(b,_)->a==b-> (.fst).(==).fst,(!)=(q.).zip.cycle
Damien

@Damien |b/=0=[]!!1chỉ ném ra một ngoại lệ nếu bạn cố gắng thực hiện một động tác bất khả thi
BlackCap

1
OK, bạn có thể đơn giản hóa nó bằng cách o n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)này sẽ đưa ra một ngoại lệ mẫu không toàn diện
Damien
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.