Ваша задача - создать случайную последовательность ходов, которую можно использовать для шифрования кубика Рубика. Такая схватка состоит из ровно 25 ходов. Каждый ход состоит из букв, UDRLFB
за которыми может следовать один из суффиксов '2
.
Это обозначение называется обозначением Singmaster. UDRLFB
представляет одну из 6 граней, а необязательный суффикс '2
представляет угол поворота. Эта информация ни в коем случае не является необходимой для решения задачи.
Чтобы гарантировать, что схватки имеют «хорошее качество», должны применяться следующие два правила:
Два последовательных хода не должны иметь одинаковую букву. Это запрещает последовательные шаги
UU
,DD
,RR
,LL
,FF
иBB
все их комбинации с использованием дополнительных суффиксов , какU2U
илиU'U'
.Эти пары ходов запрещены, потому что они могут быть легко уменьшены до 1 или 0 ходов.
U2U
имеет тот же эффект, чтоU'
иR'R
тот же эффект, что и.
Три последовательных хода не должны относиться к одной группе букв. Буквенные группы
UD
,RL
иFB
. Это правило дополнительно запрещает последовательные шагиUDU
,DUD
,RLR
,LRL
,FBF
,BFB
и все их комбинации с использованием дополнительных суффиксов , какU2DU
,RL'R
илиB2FB'
.Группы сортируют грани по их оси перемещения.
U
иD
находятся в одной группе, потому что оба вращаются вокруг одной оси. ПоэтомуU
движение не влияет на частиD
лица, иD
движение не влияет на частиU
лица. Следовательно, два хода могут быть обменены,UDU
имеет такой же эффектUUD
, что и может быть уменьшен доU2D
.
Вызов
Напишите скрипт или функцию, которая генерирует одну случайную схватку. Там нет ввода. Сценарий / функция должен печатать 25 ходов без разделения или разделенных одним пробелом или возвращать соответствующую строку.
Ваша программа должна быть в состоянии создать каждую схватку, которая удовлетворяет правилам выше. Конечно, предполагая, что генератор случайных чисел является истинно случайным, а не псевдослучайным.
Это код-гольф. Самый короткий код (в байтах ) выигрывает.
Примеры выходов:
Вызов скрипта / функции 3 раза должен напечатать / вернуть что-то вроде:
R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D
Если вы разделяете ходы пробелом каждый:
R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'
Обратите внимание, что все эти выходные данные состоят из 25 ходов, но имеют разную длину из-за необязательных суффиксов. Это не разрешено печатать пространство, когда либо 2
или '
являются использование в качестве суффикса. Вы должны распечатать L2UR2F'R'U2
или L2 U R2 F' R' U2
. L2U R2F'R'U2
не разрешено.
источник
UR 2
имели в виду не допускается? Я думаю, что этоU R2
должно быть разрешено, поскольку промежутки между ходами имеют смысл.L2U R2F'R'U2
.U
не имеет необязательного суффикса и поэтому не должен иметь пробела. Пробел не должен заменять дополнительный суффикс.U F2 L D2 R'...
, например? В этом случае нет лишнего пробела, который, по моему мнению, должен быть в порядке в соответствии с вашим правилом.Ответы:
CJam,
4745 байтЭто решение использует подход, который отличается от любого другого, опубликованного до сих пор. Он использует преимущества сжатого списка операций CJam для создания доступного списка перемещений и случайного выбора одного из них. Модификаторы просто генерируются независимо.
Попробуйте онлайн.
объяснение
источник
С, 129
Внутренний цикл генерирует значение
m
в диапазоне,1..5
которое при добавленииs
и взятии по модулю 6 гарантирует, что никакие два последовательных движения не будут на одной стороне куба. Старое значениеm
сохраняется в,n
и тестm*n==9
гарантирует, что значениеm
= 3 никогда не будет сгенерировано дважды в строке (поэтому противоположные грани нельзя выбрать два раза подряд; обратите внимание на порядок граней в строке.)Наименее значительная часть
r
используется для определения , какой суффикс ('
,2
или нуль) , чтобы использовать, воспользовавшись нулевым символом в конце"'2"
.Внешний цикл работает 26 раз. Первый раз,
U
никогда не может быть выбран, поэтомуprintf
подавляется для первой итерации.Разгруженный код в тестовой программе
Код ungolfed помещает пробел между каждым ходом для ясности (код в гольфе не делает, чтобы сохранить один байт.) Кроме того, код в гольф сохраняет точку с запятой, перемещая
printf
внутриfor
скобки.Типичный вывод
источник
Pyth,
6566Я никогда не играл в гольф на Pyth, может быть, написал программу или две. Это в основном @ решение steveverrill , переведенное на Pyth. Предложения по улучшению приветствуются.
Обновление: добавлен 1 байт, чтобы сделать схватки также начать с
U
. Может быть, решение C полагается на неопределенное поведение, чтобы заставить его работать ...Я считаю, что это должно быть сделано с меньшим количеством назначений, но это потребовало бы от меня много изменений в алгоритме. (Ну, может попробовать.)
Вот объяснение, основанное на коде C:
источник
Y
иZ
.Z
инициализируется 0, поэтому вы сохраняете первые 3 символа.n = m
(3-я строка объяснения), что должно означатьn = 0
первый раз, который в свою очередь долженY
был бы быть 0.Y
предварительно инициализирован с пустым списком[]
. И я не думаю, что значение имеетn
значение в первой итерации.U
.JavaScript (ES6) 175
178 204редактировать 3 байта меньше, 1 изменяя код и 2 изменяя способ подсчета байтов (не считая
F=
)Код, позволяющий избежать повторений, взят из @stevemiller. Его способ управления группами писем еще лучше, но я не собираюсь его красть.
Бонус: вы можете по желанию указать количество ходов.
Меньше гольфа
Тестовое задание
источник
Javascript - 112
источник
Java 8,
189183 байтаПорт @LevelRiverSt C ответа «s . Я попробовал некоторые вещи сам, но это было короче, чем у меня было ..
Попробуйте онлайн.
источник
Рубин ,
116 107 10595 байтовПопробуйте онлайн!
источник
Clojure, 223 байта
Это в значительной степени зависит от шаблона «sequence -> partition-by -> filter -> concat», он используется для фильтрации «недопустимых» последовательностей граней. Этот seq затем отображается на строку вместе со случайным постфиксом (включая пустую строку).
Исходная точка без швов:
источник