Поколение лабиринта [закрыто]


41

Я знаю, что есть (старый) поток, похожий на этот ( здесь ), но я бы хотел перезагрузить его с некоторыми изменениями.

Цель: сформировать хаотический ищет лабиринт , используя алгоритм вашего выбора, то выход в лабиринте графический (печать отсчеты).

  • Ширина и высота определяются вами.
  • Должен быть хотя бы один путь от хотя бы одного входа до хотя бы одного выхода.
  • Формат лабиринта (как вы его отображаете, отмечаете вход (ы) или выход (ы)) также зависит от вас.
  • Чем красивее, тем лучше.
  • Тривиальные лабиринты (например, пустые лабиринты, решетчатые лабиринты, лабиринты размером 1х1) не приветствуются.
  • Циклы в лабиринте разрешены и приветствуются, если результат является разумным.
  • Злоупотребление языком поощряется.
  • Лабиринт должен выглядеть достаточно случайным (но вполне детерминированный (например, хаотичный) алгоритм, который генерирует это тоже хорошо).

Редактировать: основное внимание здесь уделяется созданию наименьшей возможной реализации. Тем не менее, я хочу допустить некоторую свободу действий в этом ограничении для поощрения блеска. Я сознательно оставил именно то, что «отличает» лабиринт от открытого, но в качестве приблизительного ориентира вы должны попытаться упаковать наибольшее количество ударов в наименее лексический доллар.


4
Кроме того, «Чем красивее, тем лучше» кажется едва ли ощутимым (или просто неуместным) для игры в гольф. Может быть, лучшим выбором будет конкурс на популярность, если вы заинтересованы в хороших результатах.
Мартин Эндер

5
Так это действительно код-гольф или скорее конкурс популярности?
10

2
В качестве другого предложения, если вы хотите стимулировать как короткие коды, так и аккуратные лабиринты, вы можете сделать это вызовом для кода и объявить, что победитель будет выбран по какому-либо баллу, который представляет собой смесь длины кода и числа голосов - хотя это будет Определите общий балл каждого ответа, потому что включать текущее количество голосов в посте немного бесполезно.
Мартин Эндер

3
Я думаю, что каждый ответ должен объяснить, что составляет входы и выходы в каждом лабиринте (а также, что такое стена и что такое проход), чтобы мы могли оценить 2-ую пулю.
LarsH

2
@Geobits Я бы не стал возражать, но, следовательно, мое предложение действительно сделать это вызовом кода с комбинированной оценкой по длине кода и голосам. Это точно вдохновило бы то, что хочет ОП: короткий код для интересных лабиринтов.
Мартин Эндер,

Ответы:


10

C: 265 253 байта

#define f(v)for(v=0;v<k;++v)
#define d(q,n)case q:r(c+n,c+2*n);
z[4225],i,j,k=65;r(p,c){if(!z[c]){z[p]=z[c]=1;f(p)switch(rand()%4){d(0,-k)d(1,k)d(2,-1)d(3,1)}}}main(){f(i)z[i]=z[i+4160]=z[i*k]=z[i*k+64]=z[4157]=1;r(67,132);f(i)f(j)putchar(33-z[i*k+j]);}

(Требуется терминал из 65 символов) Создает относительно случайный лабиринт 31x31 с одним гарантированным путем от входа до выхода.

Пример вывода (с симулированным 65-символьным терминалом):

 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
 !     !       !   !       !     !           !             !   ! 
 !!!!! !!! !!! ! !!! ! !!! ! !!! !!!!!!! !!! !!!!!!!!! !!! ! ! ! 
 !   !   !   ! !     ! ! ! ! ! ! !       !   !         !   ! ! ! 
 ! !!!!! !!! ! !!!!!!! ! ! ! ! ! ! !!!!!!! !!! ! !!!!!!! !!! ! ! 
 !     !     !         ! !   !   !     !   !   ! !     !   ! ! ! 
 ! !!! !!!!!!!!!!!!!!!!! !!!!! !!! !!! !!! ! ! !!! !!! !!! !!! ! 
 !   !         !     !   !     !     !   ! ! ! !     !   !   ! ! 
 !!!!!!!!!!! ! ! !!! !!! ! !!!!!!!!!!!!! ! !!! ! !!!!!!! !!! ! ! 
 !           !   !       ! !             !   !     !     !     ! 
 ! !!!!!!! !!!!!!! !!!!!!! ! !!!!!!!!!!!!!!! !!!!!!! !!!!!!!!!!! 
 ! !     ! !   !     !   ! !           !   !       ! !         ! 
 ! !!! ! ! ! ! !!!!!!! ! ! ! !!!!!!!!! ! ! !!!!!!! ! ! !!!!!!! ! 
 !   ! !   ! !       ! !   ! !         ! !       ! ! !   !   ! ! 
 !!! ! !!!!! !!!!!!! ! !!!!!!! !!!!!!!!! !!! !!!!! ! !!! ! !!! ! 
 !   !   ! ! !       !   !     !   !     ! !           ! !   ! ! 
 ! !!!!! ! ! ! !!!!!!!!! ! !!!!! !!! !!!!! !!!!!!!!!!! ! ! ! ! ! 
 ! !       ! !   !   !   ! !       ! !       !   !     ! ! ! ! ! 
 ! !!!!!!!!! !!! ! ! ! !!! !!!!!!! ! !!!!!!! ! ! !!!!!!! !!! ! ! 
 !             !   ! !   !       ! !     !   ! !             ! ! 
 !!!!!!!!!!!!!!!!!!! !!! !!!!!!! ! !!!!! ! !!! !!!!!!!!!!!!!!! ! 
 !               !   !   !       !         !   !     !   !     ! 
 ! !!!!!!!!!!!!! ! ! ! !!! !!!!!!! !!!!!!!!! !!! !!! !!! ! !!! ! 
 ! !   !       !   ! ! ! !     ! ! ! !     !     !   !   !   ! ! 
 ! ! ! !!!!! !!!!!!! ! ! ! !!! ! ! ! ! !!! !!!!!!! !!! !!!!! !!! 
 !   ! !   !       ! ! !     ! !     ! ! !     !   !       !   ! 
 !!!!! ! ! !!! !!! ! ! !!!!!!! !!!!!!! ! ! !!! ! !!!!!!!!! !!! ! 
 !     ! !   !   !   !       !       ! ! ! !   !   !         ! ! 
 ! !!!!! !!! !!! !!!!!!!!!!! !!!!!!! ! ! ! !!!!!!! ! !!!!!!! ! ! 
 !         ! !           !   !       ! ! !     !   ! !       ! ! 
 !!!!!!!!!!! !!!!!!!!!!! ! !!! !!!!!!! ! !!!!! ! !!! !!!!!!!!! ! 
 !         !     !     ! ! !       !   !     ! !     !         ! 
 ! !!!!!!! !!!!! ! !!! !!! !!!!!!! ! !!!!! ! ! !!!!! ! !!!!!!!!! 
 ! !     !     !   ! !   !       ! !       ! !       !         ! 
 ! ! !!! !!!!! ! !!! !!! !!!!!!! ! !!!!!!!!! !!!!!!!!!!!!!!!!! ! 
 !     !     ! !   !   ! !     ! !       !   ! !     !         ! 
 !!!!!!!!!!! ! !!! !!! ! ! ! !!! ! ! !!!!! !!! ! !!! ! !!!!!!! ! 
 !           ! !       !   ! !   ! !       !   ! ! ! !     !   ! 
 ! !!!!!!!!!!! !!!!!!!!!!!!! ! !!! !!!!!!!!!!! ! ! ! ! !!! ! !!! 
 !       !   !             ! ! ! !   !         ! !   !   ! ! ! ! 
 !!!!!!! !!! !!!!!!!!!!!!! ! ! ! !!! ! !!!!!!! ! !!! !!!!! ! ! ! 
 !       !         !     ! ! ! !   !   !     ! !   !       !   ! 
 ! !!!!!!! !!!!!!! ! !!!!! ! ! !!! !!!!!!! ! ! !!! !!!!!!!!!!!!! 
 !   !         ! !   !       ! !           ! !   !             ! 
 ! ! ! !!!!!!! ! ! !!! !!!!!!! ! !!!!!!!!!!! ! !!!!!!!!!!!!!!! ! 
 ! ! ! !     ! !   !   ! !     !   !   !     ! !               ! 
 ! ! !!! !!! ! !!!!! !!! ! !!!!! ! ! ! !!!!!!! ! !!!!!!!!!!!!! ! 
 ! !   !   ! !   !       !   !   !   !         ! !         !   ! 
 !!!!! !!! ! !!! ! !!!!!!!!! !!!!!!! !!!!!!!!!!! !!!!! !!!!! !!! 
 !     !   !   !   !       !       !       !   !     !       ! ! 
 ! !!!!! !!!!! !!!!! !!!!! !!!!!!! !!!!!!!!! ! !!!!! !!!!!!! ! ! 
 !           !     ! !   !   !   !           !   !   !     !   ! 
 ! !!!!!!!!! !!!!! ! !!! ! !!! ! !!!!!!!!!!!!!!! ! !!! !!! !!! ! 
 ! !     !       ! !     !     !     !         ! !       !   ! ! 
 !!! !!! !!!!!!!!! !!!!! !!!!!!!!! ! !!!!!!! !!! ! !!!!!!!!! ! ! 
 !   !     !   !   !   ! !       ! !         !   ! !         ! ! 
 ! !!!!!!! ! ! ! ! !!! ! !!!!!!! ! !!!!!!!!! ! !!!!! !!!!!!!!! ! 
 !       !   !   ! !   !         !   ! !   ! ! !     !       ! ! 
 ! !!!!! !!!!!!!!! ! !!!!!!!!!!! !!! ! ! ! ! ! ! !!!!! !!!!! ! ! 
 ! !     !           !         ! ! ! !   !   ! !   !   !     ! ! 
 ! ! !!!!!!!!!!!!!!!!! !!! !!!!! ! ! !!!!!!!!! !!! ! !!!!!!!!! ! 
 ! !                     !         !               !           ! 
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! 

2
Тебе даже не нужно int p,int c. p,cдостаточно ...
chubakueno

Ах, спасибо за указание на это
Dendrobium

34

Mathematica, 144 132 байта

С самого начала все мы знаем самый эффективный способ рисовать лабиринт .

c=0;Graphics@Most[Join@@{Circle[{0,0},i,{a=c-(r=Random[](d=2Pi-1/i)&)[],a+d}],Line[{{i},{i+1}}.{{Cos[c=a+r[]],Sin@c}}]}~Table~{i,9}]

Ungolfed и пример вывода:

введите описание изображения здесь

Конечно, линии - это стены. Вы минотавр, который начинается в центре и должен выйти.


4
Это красиво, и код короткий, но я бы сказал, что это ближе к «тривиальному лабиринту» конца спектра.
LarsH

2
Вы правы, что увеличение его размера не изменит тривиальности. Дело в том, что решение этого лабиринта является линейным процессом: на каждом этапе вы можете быстро выяснить, сделали ли вы неправильный поворот, без необходимости «углубляться» в более глубокие ветви. Ответы Яна и Алефа, с другой стороны, являются «настоящими» лабиринтами: они не могут быть решены таким линейным способом. Поскольку банальные лабиринты не поощряются, я бы соблазнился понизить этот, но мне не хватает представителя.
LarsH

1
@LarsH Да, мы согласны с этим. Вот почему я сказал, что это самый «эффективный» способ рисования лабиринта, а не самый «эффективный». ;) Тем не менее, это может быть просто, но я не думаю, что это попадает в категорию с исключенными, такими как «пусто» или «1x1». Конечно, на усмотрение ОП дисквалифицировать это представление за его простоту, но пока он этого не делает или не меняет тип задания, я не вижу стимула сделать его более сложным / интересным.
Мартин Эндер

1
@LarsH, как говорится, я не уверен, что это из-за их алгоритмов или просто из-за особенностей конкретных примеров, которые они опубликовали, но ни один из их ответов не требовал возврата за глубину «1» более одного раза. Так что, хотя они и содержат много сложностей, они все равно не имеют отношения к путям.
Мартин Эндер

1
Этот лабиринт, на мой взгляд, не тривиален, даже если он прост (а мой круговой лабиринт ниже еще более тривиален). Я действительно просто хотел предотвратить пустое полотно / размер-1 / и т. Д. "лабиринт" s.
imallett

33

C: 364 байта

#define I int
m[1600],i=0,r;f(I x,I y,I l){m[80*y+x]|=l;I d[]={x-1,y,2,1,x+1,y,1,2,x,y-1,8,4,x,y+1,4,8},
s[]={5,5,5,5},j=0;for(;j<4;){L:r=rand()%4;for(I k=0;k<4;)if(s[k++]==r)goto L;s[j]=r;I*p=d+
4*s[j++],X=p[0],Y=p[1];if(!(X<0|X>79|Y<0|Y>19|m[80*Y+X])){f(X,Y,p[2]);m[80*y+x]|=p[3];}}}
main(){f(0,0,4);m[9]|=4;for(;i<1600;)putchar("#5FMP<HJR;IK:9LN"[m[i++]]+128);}

Примечание: в приведенном выше тексте я добавил новые строки, чтобы они поместились на странице. Ожидаемый результат (на 80-символьном терминале) (обратите внимание на начало и конец слева вверху): введите описание изображения здесь


8
@bwoebi MSPaint на помощь! ИЗОБРАЖЕНИЕ
Ceiling Gecko

6
Обратите внимание, что мое намерение состояло в том, чтобы путь был внутри труб (как здесь) .
imallett

1
@IanMallett Я думаю, что Ceiling Gecko знал об этом, но заливая левую стену цветом, вы получаете (неоптимальный) путь вдоль левой стены, пока не найдете выход. ;)
Мартин Эндер

1
Мне было бы интересно увидеть версию этого кода без игры в гольф, если у вас будет время.
LarsH

4
Пока ты писал это, ты был лабиринтом.
totymedli

24

Mathematica, 134 130 символов

Graph[Range@273,Reap[Do[c@n/._c:>#0[Sow[#<->n];n],{n,RandomSample@AdjacencyList[g=GridGraph@{13,21},c@#=#]}]&@1][[2,1]],Options@g]

лабиринт


Фактически, мы можем использовать этот алгоритм для создания лабиринта из любого (неориентированного) графа.

Например, сгенерируйте лабиринт из графа тура коня 8 * 8 ( KnightTourGraph[8,8]):

Рыцарский тур

Graph[Range@64,Reap[Do[c@n/._c:>#0[Sow[#<->n];n],{n,RandomSample@AdjacencyList[g=KnightTourGraph[8,8],c@#=#]}]&@1][[2,1]],Options@g]

maze2


7
Хороший лабиринт ... но я не вижу никакого входа, который связан с выходом ...?
bwoebi

9
Я считаю, что идея состоит в том, чтобы выбрать случайный узел (скажем, вверху слева) в качестве входа, а другой (внизу справа) в качестве выхода. Mathematica следит за тем, чтобы все узлы были связаны со всеми остальными узлами, но, особенно во втором лабиринте, выяснить, как они связаны, сложнее всего.
EagleV_Attnam

Предполагается, что линии (ребра графа) - это стены лабиринта или проходы? Я думал, что знаю, но теперь я не уверен.
LarsH

@LarsH Это отрывки.
alephalpha

1
@LarsH График связан, так что вы можете просто взять два произвольных узла, один как вход, а другой как выход.
алефальфа

13

Баш, 53 байта

w=(╱ ╲);while true;do echo -n ${w[RANDOM%2]};done

Аналогичная идея с кодом C64. В качестве косой черты используются символы Юникода, потому что они выглядят намного лучше в терминале, который поддерживает Юникод. Пример вывода на OS X Terminal (шрифт Menlo):

Пример лабиринта


2
Я однажды понял это yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash. Смотрите это сообщение
gniourf_gniourf

5
Это основано на алгоритме, который не может гарантировать себя разрешимым, которому много лет.
Isiah Meadows

9

JavaScript (ES6), 174

Это строитель лабиринта, который я использовал в этом другом испытании , просто игра в гольф. Это функция с 2 параметрами: строки и столбцы. Лабиринт полностью связан без петель, поэтому любая точка может быть начальной или конечной точкой.

(r,c,o=2*c+2,i=2*r*o+o,z=[],F=(p,i=Math.random()*4)=>[o,1,-o,-1].map((s,j,d)=>z[s=p+2*d[j+i&3]]>0&&(z[s]=z[(p+s)/2]=' ',F(s))))=>{for(;i--;)z[i]=i%o?8:`\n`;F(o+2);return''+z}

пример

f(7,10)

Выход

,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
,8, , , ,8, , , , , ,8, , , , , , , , , ,8,
,8, ,8, ,8,8,8, ,8, ,8,8,8,8,8,8,8, ,8, ,8,
,8, , , ,8, , , ,8, , , ,8, , , , , ,8, ,8,
,8, ,8,8,8, ,8,8,8,8,8, ,8, ,8,8,8,8,8, ,8,
,8, ,8, , , , , ,8, ,8, ,8, ,8, , , , , ,8,
,8, ,8, ,8,8,8, ,8, ,8, ,8, ,8, ,8,8,8,8,8,
,8, ,8, ,8, , , ,8, , , , , ,8, ,8, , , ,8,
,8, ,8, ,8, ,8,8,8,8,8,8,8,8,8, ,8, ,8,8,8,
,8, ,8, ,8, , , , , , , ,8, , , ,8, , , ,8,
,8, ,8, ,8,8,8,8,8,8,8, ,8,8,8, ,8,8,8, ,8,
,8, ,8, , , , , , , ,8, , , ,8, , , , , ,8,
,8, ,8,8,8,8,8,8,8,8,8,8,8, ,8,8,8,8,8, ,8,
,8, , , , , , , , , , , , , ,8, , , , , ,8,
,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8

Тест

f=
(r,c,o=2*c+2,i=2*r*o+o,z=[],F=(p,i=Math.random()*4)=>[o,1,-o,-1].map((s,j,d)=>z[s=p+2*d[j+i&3]]>0&&(z[s]=z[(p+s)/2]=' ',F(s))))=>{for(;i--;)z[i]=i%o?8:`\n`;F(o+2);return''+z}
    
function update() {    
  O.textContent='';
  [r,c]=I.value.match(/\d+/g)
  O.textContent=f(r,c)
}  

update()
pre { line-height: 0.8em }
Rows,Columns <input id=I oninput='update()' value='8,12'>
<pre id=O></pre>


Я не уверен ... свет или темная область лабиринт? Если темно, то у него большая петля, и можно просто оставаться снаружи, выбирая любую точку в качестве точки входа / выхода. Если горит, то вам следует добавить выход / запись.
Пауло Эберманн

1
@ PaŭloEbermann это свет, конечно, темная область - стены. Повторяю: лабиринт полностью связан без петель, поэтому любая точка может быть начальной или конечной точкой
edc65

Вау, это потрясающе! Побрили несколько байтов и уменьшили его до 133 байтов: twitter.com/aemkei/status/889587308894326785 Но все кредиты должны достаться тебе!
aemkei

@aemkei 8 вместо '#', я не могу поверить, что пропустил это время
edc65

8

ZX Basic - 54 символа

a$="/\":for i=1 to 24*32:print a$(1+int(rnd*2));:next

Выход

Вот лабиринт, показывающий маршрут через него (пробелы между строками)

путь

и небольшой фрагмент, когда я впервые сделал это (несколько лет назад), и потратил немного времени на улучшение графики.

лучшая графика


2
Хм, дерзкий. ^^ Какое начало и какой там конец? И косые ли дорожки или стены? И какой минимальный размер пропуска я могу пройти?
Мартин Эндер

2
«Должен быть хотя бы один путь от хотя бы одного входа до хотя бы одного выхода». Я не вижу никаких признаков того, что этот критерий соблюден. Случайные стены не обязательно создают лабиринт.
LarsH

1
@ m.buettner: Я предполагаю, что косые черты - это стены, и мы должны визуализировать их так, как если бы между строками и столбцами было нулевое пространство. Таким образом, нижние левые символы 2x2 образуют полностью замкнутую ромбовидную (квадратную) форму.
LarsH

@LarsH да, я так и думал. Это еще раз подчеркивает вашу точку зрения на вопрос ОП: люди должны указывать, что такое начало и конец. Кроме того, эта схема даже не допускает перекрестков. Вы можете иметь только те замкнутые квадраты или извилистые пути (которые также могут быть замкнутыми циклами).
Мартин Эндер

+1 за улучшенную графику и отображение маршрута. Я предполагаю, что при наличии такого большого количества потенциальных входов и выходов вероятность того, что «хотя бы один путь от хотя бы одного входа до хотя бы одного выхода» довольно высока!
LarsH

8

BBC BASIC, 18 байт

Увеличение длины в 23-байтовой версии C64 с бесконечным циклом от @nneonneo. VDU отправляет на контроллер VDU один символ: либо 2 + 1 * 45 = ASCII 47/ либо 2 + 2 * 45 = ASCII 92\

  VDU2+RND(2)*45:RUN

BBC BASIC, 35 байт / 107 95 байт

35 байтов только для последней строки, которая дает лабиринт из 25 строк в макете 40 столбцов. MODE1 гарантирует, что между строками не останется лишнего пространства. Остальная часть программы является необязательной и улучшает форматирование. Операторы VDU23 переопределяют шрифт для символов 47 и 92 (8 байтов, формирующих растровое изображение 8x8). Я включаю светлый пиксель во всех четырех углах, чтобы препятствовать прямолинейному прохождению. Побочным эффектом этого является то, что точка появляется в пустых бриллиантах. Всего 107 байт, включая 2 новых строки.

  VDU23,47,131,7,14,28,56,112,224,193
  VDU23,92,193,224,112,56,28,14,7,131
  MODE9FORa=0TO999VDU2+RND(2)*45:NEXT

Редактирование этой программы может быть сокращено до 95 байтов путем кодирования некоторых из 8-битных кодов VDU в 16-битные значения с прямым порядком байтов (обозначенные точкой с запятой после них вместо запятой) и представления оператора MODE в виде пары кодов VDU следующим образом ,

VDU23,47,1923;7182;28728;49632;23,92,57537;14448;3612;33543;22,9:FORa=0TO999VDU2+RND(2)*45:NEXT

Выход

Использование BBC Basic для Windows от bbcbasic.co.uk

Только последняя строка, 35 байт

введите описание изображения здесь

Всего программ, 107 95 байт

Как я прокомментировал ответ @ Brian, косая черта разбивает квадрат на 2 темных треугольника, каждый из которых имеет ровно 2 входа / выхода. Это гарантирует (тривиальный, неразветвленный) путь от любой точки на краю лабиринта до некоторой другой точки на краю лабиринта. Многие из них очень короткие, но всегда есть несколько длинных. Конечно, в середине лабиринта есть также несколько петель.

Поскольку другие ответы не упоминали об этом, я хотел бы хорошо взглянуть на светлые области. Они ограничены темными областями, поэтому, как следствие вышеприведенного заявления, светлая область, ограниченная внешними N темными областями, касается края поля в N (ровно столько же) точках. Поэтому возникают довольно большие светлые области, которые образуют интересные разветвленные лабиринты.

В приведенном ниже примере вы можете увидеть необработанный вывод (монохромный) из моей программы. Ниже (используя Windows Paint) я закрасил две самые длинные темные области синим цветом. Затем я закрасил самую большую светлую область желтым, а две области были ограничены синим красным и зеленым. Желтые, зеленые (и даже красные) лабиринты довольно интересны и нетривиальны.

введите описание изображения здесь

РЕДАКТИРОВАТЬ - Автоматический выбор лабиринтов и выбор начала / конца

Для еще одной строки (59 символов) программа может автоматически выбирать до 6 лабиринтов, выбирая квадраты случайным образом и заливая цвета красным, зеленым, желтым, синим, пурпурным и голубым. Он не всегда находит целые 6, потому что, если он выбирает случайный квадрат, который уже был окрашен, он ничего не делает.

Оставшаяся часть кода ниже выбирает начало для каждого цвета путем сканирования каждого столбца сверху вниз и слева направо и выбора первого квадрата, с которым он сталкивается. Он выбирает конец, сканируя в противоположном направлении.

Это производит набор красочных, переплетенных лабиринтов. Иногда они настолько переплетаются, что кажется, что лабиринты должны где-то пересекаться. Но, конечно, они не делают!

Дополнительный код и вывод 59 + 187 = 246 дополнительных символов, которые будут добавлены в конец исходной программы (для усовершенствования, не зависящего от спецификации).

  GCOL135FORa=1TO6GCOLa FILLRND(40)*32-16,RND(25)*32+208:NEXT   :REM set background to grey so fill can identify. For each colour 1 to 6, pick a point in the centre of a character and flood fill (characters are logically 32x32 although they are physically only 8x8 pixels.)
  f=126:g=126                                                   :REM flags 1111110 to indicate which starts and ends have not been allocated yet
  FORx=0TO39FORy=0TO24                                          :REM maze is 40x25. There is some blank space at the bottom of the screen (32 rows total)
  p=POINT(x*32+16,1008-y*32)                                    :REM check start point. Text origin is at top of screen, Graphics origin is at bottom, 1280x1024 logical. therefore y offset is 1024-32/2=1008.
  IFf AND2^p f=f-2^p:VDU31,x,y,17,p,79                          :REM if start for colour P has not been allocated yet, allocate it now. VDU31,X,Y go to that square. VDU 17,p select text colour. VDU 79 print an "O"                 
  p=POINT(1264-x*32,240+y*32)                                   :REM check end point
  IFg AND2^p g=g-2^p:VDU31,39-x,24-y,17,p,79                    :REM if end for colour P has not been allocated yet, allocate it now.
  NEXT:NEXT
  VDU31;26                                                      :REM get the cursor off the board. Move to (0,26). Semicolon used instead of comma here indicating that 31 is a 16 bit small endian value, equivalent to VDU31,0,26 or PRINTTAB(0,26)

введите описание изображения здесь


7

C: 235 байт

#define P(X,Y)M[(Y+40)*80+X+40]=rand()%49/6;
#define B(X,Y)P(X,Y)P(Y,X)
M[6400],r,i;main(){for(i=0;i<40;i+=2){int x=i,y=0,e=1-x;while(x>=y)
{B(x,y)B(-x,y)B(-x,-y)B(x,-y)++y;e+=e<0?2*y+1:2*(y-x--);}}for(i=0;
i<6400;)putchar(64>>!M[i++]);}

Примечание: в приведенном выше тексте я добавил новые строки, чтобы они поместились на странице. Ожидаемый результат (на 80-символьном терминале):введите описание изображения здесь

Я сожалею, что это не очень сложный лабиринт (на самом деле, не требуется возврата к внутренним кольцам (и вы должны быть в состоянии найти путь от периметра к центру тривиально). Тем не менее, он имеет хорошую реализацию круга Брезенхэма алгоритм рисования по своей сути.


Трудно понять, где вы можете пройти, а где нет. Я должен сказать, что я предпочел трубы;) (и этому, и моему круговому представлению).
Мартин Эндер

@ m.buettner: Я действительно согласен. Если вы измените i+=2к i+=3, это могло бы быть более ясно , что происходит.
Ималлетт

6

Я помог моему ребенку сделать это, научиться немного программированию: http://jsfiddle.net/fs2000/4KLUC/34/ как тебе это нравится?


17
Если вы можете поместить свой код в пост, сделайте это. Также добавьте заголовок, такой как #Language (s) - Bytecount. Если вы использовали только символы ASCII в своем коде, вы можете получить хороший счет здесь . Краткое изложение того, что делает ваш код, какие-либо идеи, которые вы могли иметь, или любые умные вещи, которые вы сделали, могут быть хорошим дополнением к вашему сообщению. Кстати, Дарту Вейдеру очень трудно увидеть некоторые из этих строк. Наконец, добро пожаловать в Code Golf!
Rainbolt

Вы научились немного программировать со своими детьми, а я немного научился играть в гольф. Это моя первая игра в гольф, и результат все еще довольно длинный. Количество байт: Оригинал: 55 + 6822 = 6877. Немного реорганизовано : 39 + 3131 = 3170 Гольф : 39 + 1593 = 1632
BartekChom

6

Commodore 64 BASIC - 38 байт

10 PRINT CHR$(205.5+RND(1)); : GOTO 10

Это не мое изобретение, я просто повторяю очень красивую и короткую программу из прошедших дней. Фактически, есть целая книга, названная в 10 PRINT CHR$(205.5+RND(1)); : GOTO 10честь этого куска кода!

Вы можете увидеть вывод этого видео на YouTube ; вот снимок экрана:

Скриншот YouTube

Здесь в этом вопросе StackOverflow больше реализации этой программы-генератора лабиринта. Самая короткая реализация программы - следующая 23-байтовая программа C64 BASIC, опубликованная автором этого вопроса:

1?cH(109.5+rN(1));:gO1

где строчные буквы вводятся как есть, а заглавные буквы вводятся с помощью клавиши Shift (они появляются на экране C64 по-разному).


Разве это не то же самое представление Брайана? (чуть короче) И каков твой ответ Баша? Тогда возникает вопрос: а лабиринт без перекрестков остается лабиринтом?
Мартин Эндер

nneonneo, +1 за правильное и честное приписывание этой замечательной идеи. @ m.buettner В непечатной области, как вы указали, появляются неразветвленные лабиринты. Однако (и я удивлен, что еще никто не показал это), печатная область образует некоторые интересные, нетривиальные, разветвленные лабиринты (см. Мой ответ.) Я также поддерживаю ваш лабиринт, так как он имеет наилучшее определение начала и конца. , Определить начало и конец этих диагональных лабиринтов нелегко.
Уровень Река St

@ m.buettner 1. Размер двоичного файла x86 составляет всего 10 байт. 2. Это хорошо отточенный алгоритм, и он вовсе не оригинален и не предназначен для создания разрешимого лабиринта.
Isiah Meadows

5

Ява: 700

Вот рекурсивный сумматор Алгоритм изложен на этом сайте :

public class Z{int i,j,u=20,v=u,g[][]=new int[v][u];public static void main(String[]a){new Z().d(0,0,20,20,0).p();}int q(int m){return(int)(Math.random()*m);}<T>void z(T m){System.out.print(m);}void p(){for(i=0;i++<u*2;z("_"));for(i=0;i<v;i++){z("\n|");for(j=0;j<u;j++){boolean b=i+2>v,s=g[i][j]%2>0||b;z(s?"_":" ");z(g[i][j]>1||j+2>u?"|":s&(j+1<u&&g[i][j+1]%2>0||b)?"_":" ");}}}Z d(int x,int y,int w,int h,int o){int a=x,b=y,c=a,d=b,e,f;boolean t=o<1;if(t){b+=q(h-2);c+=q(w);}else{a+=q(w-2);d+=q(h);}for(i=t?w:h;i-->0;j=t?a++:b++)if(a!=c&&b!=d)g[b][a]|=t?1:2;e=t?w:a-x+1;f=t?b-y+1:h;if(e>2&&f>2)d(x,y,e,f,e<f?0:1);e=t?w:x+w-a-1;f=t?y+h-b-1:h;if(e>2&&f>2)d(t?x:a+1,t?b+1:y,e,f,e<f?0:1);return this;}}

По сути, он разбивает каждый прямоугольник на две части со стеной (и проходом), затем разделяет их на две части и т. Д. Он создает «идеальный» лабиринт - один без циклов - который имеет путь из каждой точки в любую другую точку. Множество тупиков, так что это не «тривиально» для больших лабиринтов.

Итак, вход и выход могут быть решены произвольно. Если мне нужно выбрать один, он просто скажет сверху / слева и снизу / справа.

Он рисуется в формате двойной ширины ascii, поэтому рекомендуется передавать данные в файл, если вы делаете один любой размер. Вот 20x20 в консоли:

20х20

И 100x100 в блокноте ++ (мне пришлось уменьшить масштаб, чтобы получить все, так что это несколько ... маленький ):

100x100

Код с переносами строк:

public class Z{
    int i,j,u=20,v=u,g[][]=new int[v][u];
    public static void main(String[]a){
        new Z().d(0,0,20,20,0).p();
    }

    int q(int m){return(int)(Math.random()*m);}
    <T>void z(T m){System.out.print(m);}

    void p(){
        for(i=0;i++<u*2;z("_"));
        for(i=0;i<v;i++){
            z("\n|");
            for(j=0;j<u;j++){
                boolean b=i+2>v,s=g[i][j]%2>0||b;
                z(s?"_":" ");
                z(g[i][j]>1||j+2>u?"|":s&(j+1<u&&g[i][j+1]%2>0||b)?"_":" ");
            }
        }
    }

    Z d(int x,int y,int w,int h,int o){
        int a=x,b=y,c=a,d=b,e,f;
        boolean t=o<1;
        if(t){
            b+=q(h-2);
            c+=q(w);
            }
        else{
            a+=q(w-2);
            d+=q(h);
        }

        for(i=t?w:h;i-->0;j=t?a++:b++)
            if(a!=c&&b!=d)
                g[b][a]|=t?1:2;

        e=t?w:a-x+1;f=t?b-y+1:h;
        if(e>2&&f>2)d(x,y,e,f,e<f?0:1);
        e=t?w:x+w-a-1;f=t?y+h-b-1:h;
        if(e>2&&f>2)d(t?x:a+1,t?b+1:y,e,f,e<f?0:1);
        return this;
    }
}

2

ZX Basic - 281 символ

Это скорее «правильный» лабиринт, менее гольфистский, но более лабиринтный. Так называемый алгоритм двоичного лабиринта, каждая ячейка может иметь выход вниз или вправо, но не оба. (Теперь включает помеченные «Начало» S и «E», чтобы не идти прямо вдоль одной стороны).

"::" - это способ ZXB для ввода графических символов Spectrum в текстовый файл, приравнивается к проданному символу блока.

randomize:border 1:paper 1:ink 6:cls
for x=0 to 30 step 2
 for y=0 to 20 step 2
  r=1+int(rnd*2)
  if x=30 and r=1 then 
   r=2
  end if
  if y=20 and r=2 then
   r=1
  end if
  print at y,x;"\::"
  print at y+(r=2),x+(r=1);"\::"
 next
next
print inverse 1;at 0,0;"S";at 20,31;"E"

Лабиринт


2
Нет, я действительно имел в виду, что вы должны поменять местами начало и конец (начало внизу справа, конец вверху слева). Поскольку это стоит тривиально, потому что из-за правил вам просто нужно идти вниз и вправо все время, чтобы достичь конца.
Мартин Эндер

1
Даже если начало и конец поменялись местами, лабиринт обладает (возможно, интересным) свойством того, что правильный путь будет двигаться только вверх и влево. Лабиринт уже не тривиален, потому что есть много моментов, в которых вы можете пойти одним из двух способов.
Кевин - Восстановить Монику

1

С-244

#include <unistd.h>
#include <windows.h>
int main(i,j,rv,rs){srand( time(0));for (i = 0; i < 80; i++)for (j = 0; j <50 ; j++){rv = rand() %10;rs = rand() %100;if(rs < 10 || rs  > 90)continue;if(rv<4){gotoxy(i,j);printf("%c", '#');}}return 0;}

Вот как это выглядит:

Лабиринт

Примечание: это решение вдохновлено ненадежной игрой 8-го уровня: в лес.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.