В Twitch Plays Pokémon одним из самых раздражающих препятствий, с которыми можно столкнуться, является ледяная головоломка, где вы должны путешествовать из одного места в другое, скользя полностью в одном направлении, пока не столкнетесь ни со стеной, ни с валуном.
Ваша задача - создать программу, которая будет генерировать случайную сложную ледяную головоломку.
Ваша программа будет принимать три числа, M
, N
и P
, в качестве входных данных (с 10 <= M <= 30
, 15 <= N <= 40
и 0 <= P < 65536
):
12 18
и выведет:
M
ПоN
сетке , состоящей из.
иO
, представляющих лед и валуна соответственно.- Маркер положения, представляющий, откуда вводится головоломка. Это положение маркера состоит из буквы
L
,R
,T
илиB
, представляющие собой слева, справа, сверху и снизу, а затем число , представляющее положение (слева или сверху) на той стороне , чтобы ввести с. - Аналогичный маркер позиции, представляющий, из чего выходит головоломка.
- Кратчайшее решение головоломки, состоящий из последовательности
L
,R
,U
иD
соответственно.
Пример вывода:
..O...O...........
............O.....
..O...............
.......O..........
..................
...........O......
O..O...........O..
..........O.......
..O..........O....
........O.........
O....O.........O..
............O.....
R 4
B 5
LDLDRULD
(Note that this output is actually invalid because it is not actually long enough.)
Для ввода M
и N
, решение головоломки должно иметь как минимум min(M, N)
шаги и перемещаться как минимум на 2 (M + N)
все места. (Для справки, выше головоломка двигается в общей сложности 12 шагов, перемещение 69 мест.) Ваша головоломка генератор должен генерировать различный M
по N
головоломке с другим путем решения (то есть другая последовательность шагов для каждого раствора) для каждого семени P
.
- Обратите внимание, что требование другого пути решения состоит в том, чтобы избегать решений, которые пытаются систематически генерировать пути породы, как решение Клавдия здесь . Если есть две или три пары идентичных решений из-за причуд в случайности, это будет хорошо, если программа не намеренно пытается систематически генерировать головоломки с одинаковой последовательностью ходов.
Самый короткий код, чтобы сделать вышеупомянутые победы.
>
и<
(или любой другой символ) для входа и выхода? Загадки будут легче читать.LDLDRULD
который составляет всего 8 шаговОтветы:
Python,
672548 символов, более интересные загадкиНесмотря на то, что моя программа на Python идет строго по правилам, она превосходит эту, но я решил написать такую, которая в любом случае породила бы больше интересных головоломок. Вот:
Уровни отступа: пробел, табуляция, табуляция + пробел.
Образцы :
Он использует
P
в качестве начального числа, поэтому каждый из нихP
будет генерировать одну и ту же головоломку, и каждая изP
них с большой вероятностью будет отличаться:Он работает достаточно быстро до размеров,
M=25,N=40
но в прошлом он становится действительно медленным. Теоретически это должно работать,M=30, N=40
если вы позволите ему работать достаточно долго. Я написал здесь след вручную, потому что за ним трудно следить - программа просто выводит головоломку.Пояснение :
Программа зацикливается, генерируя случайную начальную позицию сверху, случайную конечную позицию внизу и случайную сетку с
12.5%
шансом на валун в любом заданном месте. Затем он решает головоломку с помощью поиска в ширину, и, если решение существует и больше, чемmin(H,W)
, оно печатает и выходит.источник
Ява - 2632
Хотя я восхищаюсь технической чистотой ответа Клавдия , я решил попробовать свои силы в создании немного более сложных головоломок;)
Основные шаги (довольно просто):
Я также отмечаю каждое пятно как «nogo», когда я скользлю. Если я окажусь в каком-то месте (или прямо перед тем, что означало бы, что там идет камень), это неверный шаг.
Итак, в основном идея состоит в том, чтобы случайным образом генерировать много карт и сохранять первую действительную. Я планирую сделать это умнее (возврат и т. Д.), Но сейчас он работает нормально. Это может также сократить некоторый избыточный код, мы увидим.
Как таковой, он генерирует маленькие карты (15x10) почти мгновенно, средние (30x20) карты за пару секунд, а большие (40x30) в произвольное количество времени от 20 секунд до 20 минут, в зависимости от начального числа. Он тестирует между 300k-500k карт в секунду на моей машине, в зависимости от размера.
Примечание: иногда карты не слишком сложны, просто потому, что в них только столько камней, сколько шагов, и если шаг не приведет вас к стене, в большинстве случаев есть только один вариант, если вы хотите ударить по настоящему камню. Я исправлю это позже, поместив «случайные» камни в безопасные места после прохождения всех этапов. Так как пятна nogo уже отмечены, это должно быть довольно просто. А пока просто наслаждайтесь этими примерами:
Вывод, показывающий разные размеры / семена:
Максимальный размер 40x30:
Golfed:
С переносами строк:
источник
while(o<3){...;o=...;}
бытьfor(;o<3;o=...){...;}
, сохраняя один байт?if(w%2<1)return new Point(f.x,f.y+i*d);else return new Point(f.x+i*d,f.y);
->return new Point(f.x+(w%2<1?0:i*d),f.y+(w%2<1?f.y:0));
.Python,
235206185176 символовИспользование :
Ввод осуществляется через стандартный ввод формы
[M, N, P]
.Вы сказали, что карты должны быть разными для каждого семени
P
... и они:И пример с другим размером:
Удовлетворяет всем поставленным объективным критериям:
P
ведет к другой загадкеN + N%2
меры, по крайней мере,N
2 (M + N)
местаПояснение :
Каждая строка создается путем повторения определенного времени строкового элемента
W
и ограничения длиныW
(я используюH
иW
вместоM
иN
).Первые две строки зависят от того,
P
чтобы каждая головоломка была уникальной. Обратите внимание, чтоP
вписывается в 16-разрядное целое число без знака. Я конвертируюP
в двоичный файл, используя.
для 0 иO
для 1:Первый элемент строки - это последние 15 битов,
t[1:]
а второй элемент строки - это 1-й битt[0]
. Я не могу поместить все это в одну строку, потому что минимальная ширина равна 15, что не подходит всем 16 битам, еслиP
> 32767. Таким образом, первые две строки однозначно представляют каждое из возможных значенийP
.Третий ряд представляет собой полную стену, поэтому значение
P
не влияет на решение.Затем следуйте фактическим элементам лабиринта. Эта строка печатает их все, повторяя их до колпачка. Результат, как вы видите выше:
Остальные просто выясняли, как решить динамически генерируемый лабиринт. Это зависит только от ширины лабиринта. Я отметил, что решения для данной ширины были:
и т.д. Следовательно, это просто
URDR
повторяется и обрезается в нужном местеW+W%2
.источник