Flexagation fleksibel

9

Menjadi programmer, menonton kami fleksibel tidak terlalu menarik. Hari ini kita mengubahnya! Dalam tantangan ini Anda akan lex dan flex hexaflexagons.

Tentang

Untuk pengantar video, tonton video viharts di flexagons

Flexagon adalah bentuk yang dapat Anda tekuk untuk menunjukkan wajah selain yang atas dan bawah; kami membuat hexahexaflexagon, yang memiliki 6 wajah. Lihat gambar di bawah ini tentang cara melipat hexahexaflexagon dari selembar kertas.

konstruksi hexahexaflexagon

Amenunjukkan kedua sisi strip. Dua segitiga putih direkatkan. Inilah cara Anda melenturkannya:

melenturkan flexagon

Di bawah ini adalah diagram kemungkinan keadaan dan hubungannya:

Diagram v6

Lingkaran berwarna mewakili 6 segitiga dengan angka yang sama dari gambar pertama. Masing-masing circes memiliki dua warna - bagian paling bawah mewakili wajah belakang (apa yang akan Anda lihat jika Anda harus membalikkan flexagon Anda), yang tidak harus Anda pertimbangkan dalam tantangan ini.

Lingkaran abu-abu di latar mewakili bagaimana Anda dapat melenturkan flexagon Anda dalam keadaan tertentu: ada 4 cara yang berbeda untuk melenturkan itu, kita sebut ini Left, Right, Updan Down. Anda tidak benar-benar melenturkan arah ini, yang penting adalah bahwa beberapa saling bertentangan.
Jika Anda berada di pusat, Anda dapat menggunakan Leftdan Rightuntuk pergi ke pusat lainnya. Untuk keluar dari pusat yang Anda gunakan Updan Down. Jika Anda tidak berada di tengah, Anda tidak dapat menggunakanLeftatau Right.

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

Tantangan

Buat fungsi atau program yang mengambil input apa yang seharusnya ada pada 18 wajah depan dan 18 wajah belakang fleksagon, urutan flek kiri, kanan, atas dan bawah, dan kembalikan 8 wajah yang terlihat setelah fleks.

Contoh perhitungan yang rumit:

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"

Contoh implementasi: http://jdoodle.com/a/18A

Input dan output yang diharapkan:

> hexaflexaperplexia flexagationdevices RRL
= efxeli

> loremipsumdolorsit hexaflexamexicania RUU
= riuort

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

> abcdefghijklmnopqr stuvwxyz1234567890 RRRRLLUDDUUUULDD
= uv1278

Aturan

  • Anda dapat mengambil input dan mengembalikan output dengan cara yang masuk akal
  • Jika input tidak memungkinkan, Anda harus mengindikasikannya dengan cara yang berbeda dari output biasa
  • Celah standar berlaku
  • Ini Codegolf. Kode terpendek dalam byte menang.
BlackCap
sumber

Jawaban:

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))

Pemakaian:

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

[0,1,2,3] = [kiri, kanan, atas, bawah]

Terima kasih kepada @Damien untuk banyak byte!

BlackCap
sumber
1
Apa gunanya |b/=0=[]!!1? Anda dapat menyimpan beberapa byte dengan menulis ulang beberapa fungsi dengan gaya pointfree: \(a,_)(b,_)->a==b-> (.fst).(==).fst,(!)=(q.).zip.cycle
Damien
@ Damen |b/=0=[]!!1hanya melempar pengecualian jika Anda mencoba melakukan flex yang mustahil
BlackCap
1
OK, Anda bisa menyederhanakannya dengan o n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)ini akan melempar pengecualian pola Non-lengkap
Damien