Цель этого задания - создать кратчайший код (в символах), который успешно выполняет следующие действия:
Технические характеристики :
- Должен создать
5x5x5 labyrinth
с точно1 possible solution
(не больше, не меньше) Лабиринт должен быть созданДолжно быть в состоянии генерировать каждое существующее решение, если оно будет работать годамиrandomly
start
Иfinish
должны быть помещены в*opposite corners
- Карта
output
должна быть в одном из следующих форматов:
Вариант выходного формата 1 strings, printed or alerted
:
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx/
xxxxx,xxxxx,xxxxx,xxxxx,xxxxx
Вариант формата вывода 2 arrays
:
[[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx],
[xxxxx,xxxxx,xxxxx,xxxxx,xxxxx]]
Выходные заметки:
Используйте
0
дляempty
и1
дляsquares
Линии разрыва НЕ нужны
Вы сами решаете, что к
index
чему, но не забудьте объяснить это хорошо
* Вот пример того, что я имею в виду под противоположными углами:
Пояснения :
- Может НЕ двигаться в
diagonal
- Может НЕ проходить дважды по тому же пути
- Имея
inaccessible areas
разрешено - Вы можете
go up/down
более одного уровня подряд
Подсказки:
- Не рассматривайте их как стены, вместо этого рассматривайте их как
5x5x5
стопку квадратов, которые некоторые из них отсутствуют, и вы можете пройти через пропущенные
code-golf
maze
generation
ajax333221
источник
источник
Ответы:
C ++C,около 1000670643395297248 символовПример вывода:
Как это работает:
программа использует Brownian Motion для генерации решений.Начальная точка установлена. Затем случайная точка выбираетсяи многократно перемещается случайным образом,пока она не коснется одной и только одной точки в начальной ветви. Затем точка устанавливается, и, если она также касается конечной точки, программа завершается и отображается матрица. Поскольку ни одна точка не может соединить две ветви, через лабиринт проходит только один путь. Программа использует функцию randи целочисленный аргумент командной строки в качестве начального числа,поэтому при наличии достаточной функции rand должна быть возможность в конечном итоге сгенерировать все действительные лабиринты (однако этот алгоритм не будет создавать неподключенные области, поэтому он не будет генерировать все возможные лабиринты).Броуновское движение было отброшено, поскольку оно оказалось ненужным, и его удаление значительно упрощает код. Я думаю, что это сделало лабиринты приятнее, хотя. Точно так же аргумент затравки был отброшен, поскольку требование генератора случайных чисел без сохранения состояния имеет для меня больший смысл, чем начальная 128-разрядная начальная точка.
Программа может застрять в бесконечном цикле, поскольку это возможно в ситуациях, когда любая точка, добавленная к ветвям, создаст несколько путей. Это поправимо, но я думаю, что это достаточно редко, чтобы не беспокоиться о коде гольфа.
Я добавил новые строки и отступы в отображаемый код для удобства чтения.
источник
JavaScript,
874816788686682668637 символовобразец вывода:
этот работает, начиная с точки [0,0,0] и случайным образом добавляя присоединение еще одного 0 рядом с 0 везде, где это разрешено (разрешено == новый 0 не находится рядом с любыми другими 0, кроме инициатора), пока не останется больше возможные дополнения.
если любой новый 0 находится рядом с точкой выхода (x * y * z == 48), тогда мы открываем выход.
golfed
оригинал
источник
Mathematica: настоящий лабиринт (827 символов)
Первоначально я создал путь от {1,1,1} до {5,5,5}, но поскольку не было возможных неправильных поворотов, я ввел вилки или «точки принятия решения» (вершины степени> 2), где нужно было бы решить, в какую сторону идти. В результате получается настоящий лабиринт или лабиринт.
«Слепые переулки» решить гораздо сложнее, чем найти простой прямой путь. Самым сложным было устранить циклы на пути, позволяя циклам отклоняться от пути решения.
Следующие две строки кода используются только для визуализации нарисованных графиков, поэтому код не учитывается, так как он не используется в решении.
Используемый код:
Образец вывода
{{"oxooo", "xxooo", "xoxxo", "xoxxo", "xxoox"}, {"ooxoo", "xoooo", "ooxox", "oooxx", "xooxx"}, {"oooxx", "ooxxo", "ooxox", "xoxoo", "xxxoo"}, {"oxxxx", "oooox", "xooox", "xoxxx", "oooxx"}, {"xxxxx", "ooxox", "oooox "," xoxoo "," oooxo "}}
Под капотом
На рисунке ниже показан лабиринт или лабиринт, который соответствует решению,
({{"ooxoo",...}}
показанному выше:Вот тот самый лабиринт, вставленный в 5х5х5
GridGraph
. Нумерованные вершины - это узлы на кратчайшем пути из лабиринта. Обратите внимание на разветвления или точки принятия решений на 34, 64 и 114. Я включу код, используемый для визуализации графика, даже если он не является частью решения:И этот график показывает только решение лабиринта:
Наконец, некоторые определения, которые могут помочь при чтении кода:
Оригинальное решение (432 знака, Произведен путь, но не настоящий лабиринт или лабиринт)
Представьте себе большой твердый куб 5x5x5, состоящий из отдельных единичных кубов. Следующее начинается без единичных кубов в {1,1,1} и {5,5,5}, так как мы знаем, что они должны быть частью решения. Затем он удаляет случайные кубы, пока не появится беспрепятственный путь от {1,1,1} до {5,5,5}.
«Лабиринт» - это кратчайший путь (если возможно более одного) из кубов, которые были удалены.
Пример:
Технически это еще не настоящий лабиринт, поскольку нет неправильных поворотов, которые можно совершить. Но я подумал, что это интересно с самого начала, поскольку он опирается на теорию графов.
Рутина на самом деле делает лабиринт, но я заткнул все пустые места, которые могли вызвать циклы. Если я найду способ удалить циклы, я включу этот код здесь.
источник
FindShortestPath
.