Я знаю, что есть (старый) поток, похожий на этот ( здесь ), но я бы хотел перезагрузить его с некоторыми изменениями.
Цель: сформировать хаотический ищет лабиринт , используя алгоритм вашего выбора, то выход в лабиринте графический (печать отсчеты).
- Ширина и высота определяются вами.
- Должен быть хотя бы один путь от хотя бы одного входа до хотя бы одного выхода.
- Формат лабиринта (как вы его отображаете, отмечаете вход (ы) или выход (ы)) также зависит от вас.
- Чем красивее, тем лучше.
- Тривиальные лабиринты (например, пустые лабиринты, решетчатые лабиринты, лабиринты размером 1х1) не приветствуются.
- Циклы в лабиринте разрешены и приветствуются, если результат является разумным.
- Злоупотребление языком поощряется.
- Лабиринт должен выглядеть достаточно случайным (но вполне детерминированный (например, хаотичный) алгоритм, который генерирует это тоже хорошо).
Редактировать: основное внимание здесь уделяется созданию наименьшей возможной реализации. Тем не менее, я хочу допустить некоторую свободу действий в этом ограничении для поощрения блеска. Я сознательно оставил именно то, что «отличает» лабиринт от открытого, но в качестве приблизительного ориентира вы должны попытаться упаковать наибольшее количество ударов в наименее лексический доллар.
code-golf
popularity-contest
maze
imallett
источник
источник
Ответы:
C:
265253 байта(Требуется терминал из 65 символов) Создает относительно случайный лабиринт 31x31 с одним гарантированным путем от входа до выхода.
Пример вывода (с симулированным 65-символьным терминалом):
источник
int p,int c
.p,c
достаточно ...Mathematica,
144132 байтаС самого начала все мы знаем самый эффективный способ рисовать лабиринт .
Ungolfed и пример вывода:
Конечно, линии - это стены. Вы минотавр, который начинается в центре и должен выйти.
источник
C: 364 байта
Примечание: в приведенном выше тексте я добавил новые строки, чтобы они поместились на странице. Ожидаемый результат (на 80-символьном терминале) (обратите внимание на начало и конец слева вверху):
источник
Mathematica,
134130 символовФактически, мы можем использовать этот алгоритм для создания лабиринта из любого (неориентированного) графа.
Например, сгенерируйте лабиринт из графа тура коня 8 * 8 (
KnightTourGraph[8,8]
):источник
Баш, 53 байта
Аналогичная идея с кодом C64. В качестве косой черты используются символы Юникода, потому что они выглядят намного лучше в терминале, который поддерживает Юникод. Пример вывода на OS X Terminal (шрифт Menlo):
источник
yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash
. Смотрите это сообщениеJavaScript (ES6), 174
Это строитель лабиринта, который я использовал в этом другом испытании , просто игра в гольф. Это функция с 2 параметрами: строки и столбцы. Лабиринт полностью связан без петель, поэтому любая точка может быть начальной или конечной точкой.
пример
Выход
Тест
источник
ZX Basic - 54 символа
Вот лабиринт, показывающий маршрут через него (пробелы между строками)
и небольшой фрагмент, когда я впервые сделал это (несколько лет назад), и потратил немного времени на улучшение графики.
источник
BBC BASIC, 18 байт
Увеличение длины в 23-байтовой версии C64 с бесконечным циклом от @nneonneo. VDU отправляет на контроллер VDU один символ: либо 2 + 1 * 45 = ASCII 47
/
либо 2 + 2 * 45 = ASCII 92\
BBC BASIC, 35 байт /
10795 байт35 байтов только для последней строки, которая дает лабиринт из 25 строк в макете 40 столбцов. MODE1 гарантирует, что между строками не останется лишнего пространства. Остальная часть программы является необязательной и улучшает форматирование. Операторы VDU23 переопределяют шрифт для символов 47 и 92 (8 байтов, формирующих растровое изображение 8x8). Я включаю светлый пиксель во всех четырех углах, чтобы препятствовать прямолинейному прохождению. Побочным эффектом этого является то, что точка появляется в пустых бриллиантах. Всего 107 байт, включая 2 новых строки.
Редактирование этой программы может быть сокращено до 95 байтов путем кодирования некоторых из 8-битных кодов VDU в 16-битные значения с прямым порядком байтов (обозначенные точкой с запятой после них вместо запятой) и представления оператора MODE в виде пары кодов VDU следующим образом ,
Выход
Использование BBC Basic для Windows от bbcbasic.co.uk
Только последняя строка, 35 байт
Всего программ,
10795 байтКак я прокомментировал ответ @ Brian, косая черта разбивает квадрат на 2 темных треугольника, каждый из которых имеет ровно 2 входа / выхода. Это гарантирует (тривиальный, неразветвленный) путь от любой точки на краю лабиринта до некоторой другой точки на краю лабиринта. Многие из них очень короткие, но всегда есть несколько длинных. Конечно, в середине лабиринта есть также несколько петель.
Поскольку другие ответы не упоминали об этом, я хотел бы хорошо взглянуть на светлые области. Они ограничены темными областями, поэтому, как следствие вышеприведенного заявления, светлая область, ограниченная внешними N темными областями, касается края поля в N (ровно столько же) точках. Поэтому возникают довольно большие светлые области, которые образуют интересные разветвленные лабиринты.
В приведенном ниже примере вы можете увидеть необработанный вывод (монохромный) из моей программы. Ниже (используя Windows Paint) я закрасил две самые длинные темные области синим цветом. Затем я закрасил самую большую светлую область желтым, а две области были ограничены синим красным и зеленым. Желтые, зеленые (и даже красные) лабиринты довольно интересны и нетривиальны.
РЕДАКТИРОВАТЬ - Автоматический выбор лабиринтов и выбор начала / конца
Для еще одной строки (59 символов) программа может автоматически выбирать до 6 лабиринтов, выбирая квадраты случайным образом и заливая цвета красным, зеленым, желтым, синим, пурпурным и голубым. Он не всегда находит целые 6, потому что, если он выбирает случайный квадрат, который уже был окрашен, он ничего не делает.
Оставшаяся часть кода ниже выбирает начало для каждого цвета путем сканирования каждого столбца сверху вниз и слева направо и выбора первого квадрата, с которым он сталкивается. Он выбирает конец, сканируя в противоположном направлении.
Это производит набор красочных, переплетенных лабиринтов. Иногда они настолько переплетаются, что кажется, что лабиринты должны где-то пересекаться. Но, конечно, они не делают!
Дополнительный код и вывод 59 + 187 = 246 дополнительных символов, которые будут добавлены в конец исходной программы (для усовершенствования, не зависящего от спецификации).
источник
C: 235 байт
Примечание: в приведенном выше тексте я добавил новые строки, чтобы они поместились на странице. Ожидаемый результат (на 80-символьном терминале):
Я сожалею, что это не очень сложный лабиринт (на самом деле, не требуется возврата к внутренним кольцам (и вы должны быть в состоянии найти путь от периметра к центру тривиально). Тем не менее, он имеет хорошую реализацию круга Брезенхэма алгоритм рисования по своей сути.
источник
i+=2
кi+=3
, это могло бы быть более ясно , что происходит.Я помог моему ребенку сделать это, научиться немного программированию: http://jsfiddle.net/fs2000/4KLUC/34/ как тебе это нравится?
источник
Commodore 64 BASIC - 38 байт
Это не мое изобретение, я просто повторяю очень красивую и короткую программу из прошедших дней. Фактически, есть целая книга, названная в
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
честь этого куска кода!Вы можете увидеть вывод этого видео на YouTube ; вот снимок экрана:
Здесь в этом вопросе StackOverflow больше реализации этой программы-генератора лабиринта. Самая короткая реализация программы - следующая 23-байтовая программа C64 BASIC, опубликованная автором этого вопроса:
где строчные буквы вводятся как есть, а заглавные буквы вводятся с помощью клавиши Shift (они появляются на экране C64 по-разному).
источник
Ява: 700
Вот рекурсивный сумматор Алгоритм изложен на этом сайте :
По сути, он разбивает каждый прямоугольник на две части со стеной (и проходом), затем разделяет их на две части и т. Д. Он создает «идеальный» лабиринт - один без циклов - который имеет путь из каждой точки в любую другую точку. Множество тупиков, так что это не «тривиально» для больших лабиринтов.
Итак, вход и выход могут быть решены произвольно. Если мне нужно выбрать один, он просто скажет сверху / слева и снизу / справа.
Он рисуется в формате двойной ширины ascii, поэтому рекомендуется передавать данные в файл, если вы делаете один любой размер. Вот 20x20 в консоли:
И 100x100 в блокноте ++ (мне пришлось уменьшить масштаб, чтобы получить все, так что это несколько ... маленький ):
Код с переносами строк:
источник
ZX Basic - 281 символ
Это скорее «правильный» лабиринт, менее гольфистский, но более лабиринтный. Так называемый алгоритм двоичного лабиринта, каждая ячейка может иметь выход вниз или вправо, но не оба. (Теперь включает помеченные «Начало» S и «E», чтобы не идти прямо вдоль одной стороны).
"::" - это способ ZXB для ввода графических символов Spectrum в текстовый файл, приравнивается к проданному символу блока.
источник
С-244
Вот как это выглядит:
Примечание: это решение вдохновлено ненадежной игрой 8-го уровня: в лес.
источник