Покоління лабіринтів [закрито]


41

Я знаю, що є (стара) нитка, схожа на цю ( тут ), але я хотів би перезавантажити її з деякими модифікаціями.

Мета: сформувати хаотичний шукає лабіринт , використовуючи алгоритм вашого вибору, то вихід в лабіринті графічний (друк відліки).

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

Редагувати: головна увага тут робиться на тому, щоб зробити якомога меншу реалізацію. Однак я хочу дозволити деякій свободі в рамках цього обмеження, щоб заохотити сором'язливість. Я навмисно залишив саме те, що "особливості" лабіринту є відкритим, але як груба інструкція, ви повинні спробувати упакувати найбільшу кількість удару в найменший лексичний долар.


4
Крім того, "Чим красивіше, тим краще" здається навряд чи відчутним (або просто не має значення) для виклику коду-гольфу. Можливо, конкурс на популярність стане кращим вибором, якщо вас цікавлять гарні результати.
Мартін Ендер

5
Так це дійсно код-гольф чи це скоріше популярність-змагання?
l0b0

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достатньо ...
чубакуено

Ах, дякую, що
Дендробіум

34

Математика, 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}]

Невикольований та приклад виведення:

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

Звичайно, лінії - це стіни. Ви мінотавр, який починається в центрі і йому потрібно вийти.


4
Це досить, і код короткий, але я б сказав, що це до "тривіального лабіринту" кінця спектру.
LarsH

2
Ти маєш рацію, що збільшення її не змінить дрібниці. Справа в тому, що розв’язання цього лабіринту є лінійним процесом: на кожному етапі ви можете швидко дізнатися, чи не ви зробили неправильний поворот, не потребуючи «повторного» повторювання в більш глибокі гілки. Відповіді Яна та Алефа, з іншого боку, є "справжніми" лабіринтами: їх неможливо вирішити лінійним способом. Оскільки тривіальні лабіринти не відволікають, я б спокусився спростувати цей, але мені не вистачає представника.
LarsH

1
@LarsH так, ми згодні з цим. Тому я сказав, що це найефективніший спосіб намалювати лабіринт, а не самий "ефективний". ;) Все-таки це може бути просто, але я не думаю, що він потрапляє в категорію з виключеними, наприклад, "порожні" або "1x1". Звичайно, на розсуд ОП дискваліфікувати цю заяву за її простоту, але поки він цього не зробить або не змінить тип виклику, я не бачу стимулу зробити його складнішим / цікавішим.
Мартін Ендер

1
@LarsH, якщо говорити, я не впевнений, що це пов'язано з їх алгоритмами або просто особливістю конкретних прикладів, які вони розмістили, але жоден з їх відповідей не потребував зворотного відстеження за глибиною "1" не один раз. Отже, хоча вони містять велику складність, все це є шляхами, які все одно не мають значення.
Мартін Ендер

1
Цей лабіринт, на мою думку, не є тривіальним, навіть якщо це легко (а круговий лабіринт внизу ще більш банальний). Я дуже хотів запобігти порожнім полотном / розміром-1 / тощо. "лабіринт" s.
imallett

33

С: 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 на допомогу! ЗОБРАЖЕННЯ
Стельовий Гекко

6
Зауважте, що мій намір полягав у тому, щоб шлях був усередині труб (як тут) .
imallett

1
@IanMallett Я думаю, що Ceiling Gecko знав про це, але заливка лівою стіною кольором дає вам (неоптимальний) шлях, що рухається вздовж лівої стіни, поки ви не знайдете вихід. ;)
Мартін Ендер

1
Мені буде цікаво побачити версію цього коду без гольфу, якщо у вас є час.
LarsH

4
Поки ви писали це, ви були лабіринтним кодером.
totymedli

24

Математика, 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- х графічних турів ( 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]

лабіринт2


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

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

Чи повинні лінії (краї графіки) бути лабіринтними стінами чи проходами? Я думав, що знаю, але зараз не впевнений.
LarsH

@LarsH Це уривки.
алефальфа

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

13

Баш, 53 байти

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

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

Вибірка зразка лабіринту


2
Одного разу я зрозумів це: yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash. Дивіться цей пост
gniourf_gniourf

5
Це засновано на алгоритмі, який не може гарантувати себе вирішуваним, тому, якому вже багато років.
Іся Медоуз

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>


Я не впевнений ... світле чи темне місце лабіринт? Якщо темно, то він має велику петлю, і ви можете просто залишитися назовні, обираючи будь-яку точку в якості точки входу / виходу. Якщо світло, то слід додати вихід / запис.
Paŭlo Ebermann

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: Я здогадуюсь, що косою рисою є стіни, і ми повинні візуалізувати її так, ніби між рядками та між стовпцями було пробіл. Отже, ліворуч внизу 2х2 символи утворюють повністю закриту діамантову (квадратну) форму.
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 байт, утворюючи растрову карту 8х8). Я включаю світлий піксель у всі чотири кути, щоб зупинити прямі пробіги від відключення. Побічний ефект цього полягає в тому, що в порожніх діамантах з’являється крапка. Всього 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 байт

Коли я коментував відповідь @ Брайана, коса риса розбиває квадрат на 2 темних трикутника, кожен з яких має рівно два входи / виходи. Це гарантує (тривіальний, нерозгалужений) шлях від будь-якої точки на краю лабіринту до якоїсь іншої точки на краю лабіринту. Багато з них дуже короткі, але завжди, здається, є кілька довгих. Звичайно, в середині лабіринту також є кілька петель.

Оскільки інші відповіді не згадували про це, я хотів би добре подивитися на світлі ділянки. Вони обмежені темними ділянками, тому, як наслідок твердження, зробленого вище, світла область, обмежена зовні N темними областями, торкається краю поля в N (рівно стільки ж) точок. Тому виникають досить великі світлові області, і вони утворюють цікаві розгалужені лабіринти.

У наведеному нижче прикладі ви можете бачити необроблений вихід (монохромний) з моєї програми. Нижче (за допомогою Windows Paint) я пофарбував дві найдовші темні області в синій колір. Тоді я пофарбував найбільшу світлу область в жовтий, а дві області обмежені синім кольором у червоний та зелений. Жовті, зелені (і навіть червоні) лабіринти досить цікаві та нетривіальні.

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

EDIT - Автоматичний вибір лабіринтів та вибір стартів / кінців

Для ще одного рядка (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

С: 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, можливо, буде зрозуміліше, що відбувається.
imallett

6

Я допоміг своїй дитині це зробити, трохи навчитися програмуванню: http://jsfiddle.net/fs2000/4KLUC/34/ як вам це подобається?


17
Якщо ви можете помістити свій код у допис, зробіть це. Також додайте заголовок, наприклад, #Language (s) - Bytecount. Якщо використовуються тільки ASCII символів в коді, ви можете отримати хороший ByteCount тут . Підсумок того, що робить ваш код, будь-які відомості, які ви мали, або будь-які розумні речі, які ви зробили, можуть стати приємним доповненням до вашого повідомлення. До речі, Дарт Вейдер дуже важко бачить деякі рядки. Нарешті, ласкаво просимо до 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 Недрукована область створює нерозгалужені лабіринти, як ви вказуєте. Однак (і я здивований, що ще ніхто цього не показав) надрукована область утворює цікаві, нетривіальні, розгалужені лабіринти (див. Мою відповідь). . Визначити початок і кінець на цих діагональних лабіринтах непросто.
Рівень р. Св.

@ 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 у блокноті ++ (мені довелося зменшити масштаб, щоб отримати ці всі, так що це дещо ... мало ):

100х100

Код з розривами рядків:

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.