Згинання згинання


9

Будучи програмістами, спостерігати за тим, як ми гнучкі, не дуже цікаво. Сьогодні ми це змінюємо! У цьому виклику ви будете розгинати та розгинати шестигранники.

Про

Для вступу до відео дивіться відео з віхартом на флексографах

Флексогон - це форма, яку можна згинати, щоб виявити обличчя, окрім верхнього та нижнього; ми робимо шестигексафлексагон, який має 6 граней. Дивіться зображення нижче про те, як скласти шестигексафлексагон із смужки паперу.

конструкція шестигексафлексагона

Aзображено обидві сторони смужки. Два білих трикутника склеєні між собою. Ось як би ви його згинали:

згинання флексогону

Нижче наведена схема можливих станів та їх взаємозв'язків:

Діаграма v6

Кольорові кола представляють 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. Найкоротший код виграти в байтах.

Відповіді:


2

Haskell (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? Ви можете зберегти кілька байтів, переписуючи деякі функції у точковому стилі: \(a,_)(b,_)->a==b-> (.fst).(==).fst,(!)=(q.).zip.cycle
Дамієн

@Damien |b/=0=[]!!1просто кидає виняток, якщо ви намагаєтеся зробити неможливий
флекс

1
Гаразд, ви могли б спростити це, і o n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)це призведе до виключення вичерпних моделей
Демієн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.