Flexagonal flexagation

9

Будучи программистами, наблюдать за нами не очень интересно. Сегодня мы это изменим! В этом испытании вы будете лексировать и сгибать гексафлексагон.

Около

Для ознакомления с видео посмотрите видеофильмы viharts на flexagons

Флексагон - это форма, которую вы можете изогнуть, чтобы показать грани, отличные от верхней и нижней; мы делаем шестигранный шестиугольник с шестью гранями. Смотрите изображение ниже о том, как сложить шестигранный шестиугольник из полоски бумаги.

строительство шестиугольника

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? Вы можете сохранить несколько байтов, переписав некоторые функции в стиле pointfree: \(a,_)(b,_)->a==b-> (.fst).(==).fst,(!)=(q.).zip.cycle
Damien
@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)этого исключения «Неисчерпывающие паттерны»
Дэмиен