Будучи программистами, наблюдать за нами не очень интересно. Сегодня мы это изменим! В этом испытании вы будете лексировать и сгибать гексафлексагон.
Около
Для ознакомления с видео посмотрите видеофильмы viharts на flexagons
Флексагон - это форма, которую вы можете изогнуть, чтобы показать грани, отличные от верхней и нижней; мы делаем шестигранный шестиугольник с шестью гранями. Смотрите изображение ниже о том, как сложить шестигранный шестиугольник из полоски бумаги.
A
показывает обе стороны полосы. Два белых треугольника склеены. Вот как вы бы это согнули:
Ниже приведена схема возможных состояний и их взаимосвязей:
Цветные круги представляют 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
. Самый короткий код в байтах побеждает.
источник
|b/=0=[]!!1
? Вы можете сохранить несколько байтов, переписав некоторые функции в стиле pointfree:\(a,_)(b,_)->a==b
->(.fst).(==).fst
,(!)=(q.).zip.cycle
|b/=0=[]!!1
просто выдает исключение, если вы пытаетесь сделать невозможноеo n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)
этого исключения «Неисчерпывающие паттерны»