Labirent Üretimi [kapalı]


41

Buna ( burada ) benzer (eski) bir iş parçacığı olduğunu biliyorum , ancak bazı değişikliklerle yeniden başlatmak istiyorum.

Hedef: Seçtiğiniz bir algoritmayı kullanarak rastgele görünen bir labirent oluşturmak , daha sonra labirenti grafiksel olarak çıkarmak (baskı sayılır).

  • Genişlik ve yükseklik sizin tarafınızdan belirlenir.
  • En az bir girişten en az bir çıkışa en az bir yol bulunmalıdır.
  • Labirentin formatı (nasıl gösterdiğiniz, giriş (ler) i veya çıkışları işaretleyiniz) de size bağlıdır.
  • Daha güzel, daha iyi.
  • Önemsiz labirentler (örneğin boş labirentler, kafes labirentleri, 1x1 boyutundaki labirentler) önerilmez.
  • Labirentteki çevrimlere izin verilir ve sonuç makulsa teşvik edilir.
  • Dil istismarı teşvik edildi.
  • Labirent oldukça rastgele görünmelidir (ancak bunu üreten tamamen belirleyici (örneğin kaotik) bir algoritma).

Düzenleme: Buradaki ana odak noktası, mümkün olan en küçük uygulamayı yapmaktır. Bununla birlikte, bu kısıtlama içindeki bazı boşlukların parlaklığı teşvik etmesine izin vermek istiyorum. Labirentin açık uçlu olan "özelliklerinin" tam olarak ne olduğunu bilerek bıraktım, ancak kaba bir rehber olarak en fazla patlamayı en az leksik dolara sığdırmaya çalışmalısınız.


4
Ayrıca, "Güzel, daha iyi", kod-golf mücadelesinde oldukça somut (ya da sadece alakasız) görünüyor. Belki bir popülerlik yarışması, güzel sonuçlarla ilgileniyorsanız daha iyi seçimler olabilir.
Martin Ender

5
Bu yüzden gerçekten kod golf mu, yoksa popülerlik yarışması mı?
l0b0

2
Başka bir öneri olarak, hem kısa kodları hem de temiz labirentleri teşvik etmek istiyorsanız, kod zorluğu yaratabilir ve kazananın kod uzunluğunun ve puanlarının bir karışımı olan bir puanla seçileceğini beyan edebilirsiniz - Her bir cevap toplam puanını belirlemek size kalmalıdır, çünkü gönderideki mevcut oylama sayısını eklemek biraz işe yaramaz.
Martin Ender

3
Her bir cevabın, her bir labirentte neyin giriş ve çıkış olduğunu açıklamasının gerektiğini (ayrıca duvarın ne olduğu ve geçişin ne olduğunu) açıklamalıyız, böylece 2. mermiyi değerlendirebiliriz.
LarsH

2
@Geobits Çok fazla sakıncası olmaz, ancak bu yüzden benim kod uzunluğundan ve oylardan birleştirilmiş puanlama ile kod zorluğu yaratma önerim. Bu OP'nin ne istediğini tam olarak teşvik eder: ilginç labirentler için kısa kod.
Martin Ender

Yanıtlar:


10

C: 265 253 Bayt

#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 karakterlik terminal gerektirir) Girişten çıkışa garantili bir yolla nispeten rastgele 31x31 labirent oluşturur.

Örnek çıktı (simüle 65 karakterli terminal ile):

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

2
İhtiyacın bile yok int p,int c. p,cyeter ...
chubakueno

Ah, bunu işaret ettiğin için teşekkürler
Dendrobium

34

Mathematica, 144 132 bayt

Kuruluşundan bu yana, hepimiz bir labirent çizmenin en etkili yolunu biliyoruz .

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 ve örnek çıktı:

görüntü tanımını buraya girin

Tabii ki, çizgiler duvarlar. Merkezde başlayan ve çıkması gereken minotaur sizsiniz.


4
Bu çok güzel ve kod çok kısa, ama bunun spektrumun "önemsiz labirenti" sonuna doğru olduğunu söyleyebilirim.
LarsH

2
Onu daha büyük yapmanın önemsizliği değiştirmeyeceği konusunda haklısın. Mesele şu ki bu labirenti çözmek doğrusal bir süreçtir: her noktada, daha derinde dallara “tekrarlamak” zorunda kalmadan, yanlış dönüş yapıp yapmadığınızı hızlıca öğrenebilirsiniz. Ian ve aleph'in cevapları, diğer yandan, "gerçek" labirentlerdir: bu doğrusal şekilde çözülemezler. Önemsiz labirentlerin cesareti kırıldığı için, bunu reddetmek için cazip olacağım, ancak yeterli temsilcim yok.
LarsH

1
@LarsH evet, bu konuda hemfikiriz. Bu yüzden en "etkili" olanı değil labirent çekmenin en "verimli" yolu olduğunu söyledim. ;) Yine de basit olabilir, ancak "boş" veya "1x1" gibi kurallara aykırı olan bir kategoriye girdiğini sanmıyorum. Tabii ki, bu sunumu basitliği nedeniyle diskalifiye etmek OP'nin takdirine bağlı, ancak bunu yapmadığı veya zorluğun türünü değiştirdiği sürece, daha karmaşık / ilginç hale getirmek için bir teşvik görmüyorum.
Martin Ender

1
@LarsH söyleniyor, algoritmalarından mı yoksa sadece gönderdikleri belirli örneklerden mi kaynaklandığından emin değilim, ancak cevaplarından hiçbiri "1" den daha fazla derinlikten geriye gitmek zorunda kalmadı. Bu yüzden, çok fazla karmaşıklık içerdiklerinde, bunların hepsi zaten zaten alakasız olan yollarda.
Martin Ender

1
Bu labirent önemsiz değil, bence kolay olsa bile (ve aşağıdaki dairesel labirentim daha da önemsiz). Gerçekten sadece boş tuval / boyut-1 / vb'yi önlemek istedim. "labirent" ler.
imallett

33

C: 364 Bayt

#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);}

Not: Yukarıda, sayfaya sığması için yeni satırlar ekledim. Beklenen çıktı (80 karakterlik terminalde) (not sol üstte başlangıç ​​ve bitiş): görüntü tanımını buraya girin


8
@bwoebi MSPaint kurtarmaya! GÖRÜNTÜ
Tavan Gecko

6
Niyetimin yolun boruların içinde olmasıydı (burada olduğu gibi) .
imallett

1
@IanMallett Ceiling Gecko'nun bunun farkında olduğunu düşünüyorum, ancak sol duvarı bir renkle suyla doldurmak, çıkışı bulana kadar sol duvar boyunca izleyen (optimal olmayan) bir yol sağlar. ;)
Martin Ender

1
Vaktiniz varsa, bu kodun oynanmamış versiyonunu görmek isterim.
LarsH

4
Bunu yazarken bir labirent kodlayıcısıydınız.
totymedli

24

Mathematica, 134 130 karakter

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]

Labirent


Aslında, bu algoritmayı herhangi (yönlendirilmemiş) bir grafikten bir labirent oluşturmak için kullanabiliriz.

Örneğin, 8 * 8 şövalyenin tur grafiğinden ( KnightTourGraph[8,8]) bir labirent oluşturun :

knight'ın tur grafiği

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
Güzel labirent… ama bir çıkışa bağlı herhangi bir giriş göremiyorum…?
bwoebi

9
Bu fikrin, giriş olarak rasgele bir düğüm (örneğin sol üst) ve çıkış olarak başka (alt sağ) seçeceğine inanıyorum. Mathematica, tüm düğümlerin diğer düğümlerle bağlı olduğundan emin olur, ancak - özellikle ikinci labirentte - nasıl bağlandıklarını bulmak zor kısımdır.
EagleV_Attnam

Çizgilerin (grafik kenarları) labirent duvarlar mı yoksa geçişler mi olması gerekiyor? Bildiğimi sanıyordum ama şimdi emin değilim.
LarsH,

@LarsH Onlar pasaj vardır.
alephalpha

1
@LarsH Grafik bağlanmıştır, böylece biri giriş, diğeri çıkış olmak üzere iki isteğe bağlı düğüm alabilirsiniz.
alephalpha

13

Bash, 53 bayt

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

C64 koduna benzer bir fikir. Unicode karakterlerini eğik çizgi olarak kullanır, çünkü Unicode'u destekleyen bir terminalde daha iyi görünürler. OS X Terminalinde örnek çıktı (Menlo font):

Örnek labirent çıkışı


2
Bir keresinde bu out düşündüm: yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash. Bu
gönderiye

5
Bu, çözülebilir olmasını garanti edemeyen bir algoritmaya dayanmaktadır;
Isiah Meadows

9

JavaScript (ES6), 174

Bu, diğer golf mücadelesinde kullandığım labirent üreticisi . 2 parametreli bir fonksiyon: satırlar ve sütunlar. Labirent, hiçbir döngü ile tamamen bağlantılıdır, bu nedenle herhangi bir yer başlangıç ​​veya bitiş noktası olabilir.

(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}

Örnek

f(7,10)

Çıktı

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

Ölçek

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>


Emin değilim ... aydınlık mı karanlık alan mı labirent? Eğer karanlıksa, o zaman büyük bir halka vardır ve bir giriş / çıkış noktası olarak herhangi bir noktayı seçerken sadece dışarıda kalabilir. Işık yanıyorsa, çıkış / giriş eklemelisiniz.
Paŭlo Ebermann

1
@ PaŭloEbermann elbette ki ışık, karanlık alan ise duvarlar. Kendimi tekrarlamak: Labirent tamamen halkalarla bağlanmıştır, bu yüzden herhangi bir yer başlangıç ​​veya bitiş noktası olabilir
edc65

Vay canına, bu harika! Bazı baytları traşlayıp 133 bayta indirdik: twitter.com/aemkei/status/889587308894326785 Ancak tüm krediler size sunulmalıdır!
aemkei

'#' yerine @aemkei 8, o zaman kaçırdığıma inanamıyorum
edc65

8

ZX Basic - 54 karakter

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

Çıktı

İşte içinden geçen yolu gösteren labirent (çizgiler arasındaki boşluklar)

yol, yörünge

ve bunu ilk yaptığımdan (birkaç yıl önce) gelen küçük bir snippet ve daha iyi grafikler yapmak için biraz zaman harcadım.

daha iyi grafikler


2
Hm, arsız. ^^ Başlangıç ​​nedir ve orada sonu nedir? Eğik çizgiler yollar mı yoksa duvarlar mı? Ve geçebileceğim minimum boşluk boyutu nedir?
Martin Ender

2
"En az bir girişden en az bir çıkışa giden en az bir yol bulunmalıdır." Bu kriterin sağlandığına dair herhangi bir gösterge görmüyorum. Rastgele duvarlar mutlaka bir labirent oluşturmaz.
LarsH,

1
@ m.buettner: Eğik çizgilerin duvarlar olduğunu ve satırlar arasında ve sütunlar arasında sıfır boşluk varmış gibi görselleştirmemiz gerektiğini tahmin ediyorum. Böylece sol alt 2x2 karakterleri tamamen kapalı bir elmas (kare) şekli oluşturur.
LarsH

@LarsH evet öyle sanıyordum. Bu, OP'nin sorusuna, insanların ne başladığını ve bittiğini göstermesi gerektiği sorusuna başka bir noktaya değiniyor. Ayrıca, bu şema kavşaklar için bile izin vermiyor. Sadece bu kapalı karelere veya kıvrımlı yollara sahip olabilirsiniz (bu aynı zamanda kapalı döngüler olabilir).
Martin Ender

Geliştirilmiş grafikler için +1 ve rotayı gösterme. Çok fazla potansiyel giriş ve çıkış göz önüne alındığında, "en az bir girişten en az bir çıkışa kadar en az bir yola çıkma" olasılığı oldukça yüksek!
LarsH,

8

BBC TEMEL, 18 Bayt

23 byte C64 sonsuz döngü sürümünde @nneonneo tarafından uzunluktaki bir gelişme. VDU, VDU denetleyicisine tek bir karakter gönderir: 2 + 1 * 45 = ASCII 47 /veya 2 + 2 * 45 = ASCII 92\

  VDU2+RND(2)*45:RUN

BBC BASIC, 35 Bayt / 107 95 Bayt

35 bayt sadece 40 sütun düzeninde 25 satır labirent veren son satır içindir. MODE1, çizgiler arasında fazladan boşluk kalmamasını sağlar. Programın geri kalanı isteğe bağlıdır ve biçimlendirmeyi geliştirir. VDU23 deyimleri, 47 ve 92 karakterleri için yazı tipini yeniden tanımlıyor (8x8 bitmap oluşturan 8 bayt.). Düz koşuların sıkışmaması için dört köşenin hepsine hafif bir piksel ekliyorum. Bunun yan etkisi, boş elmaslarda bir nokta belirmesidir. 2 yeni satır da dahil olmak üzere toplam 107 bayt.

  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

Düzenleme bu program aşağıdaki gibi, (bir noktalı virgül ile gösterilen bunları virgül yerine sonra) küçük endian değerleri 16 içine 8 bitlik VDU kodlarının bir kodlama 95 byte bit kısaltılmış ve VDU kodlarının bir çift MOD deyimi temsil edilebilir .

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

Çıktı

Bbcbasic.co.uk adresinden Windows için BBC Basic'in kullanılması

Yalnızca son satır, 35 bayt

görüntü tanımını buraya girin

Tüm program, 107 95 bayt

@ Brian'ın cevabına yorum yaptığım gibi, eğik çizgi, her biri tam olarak 2 giriş / çıkış bulunan 2 karanlık üçgene ayrılıyor. Bu, labirentin kenarındaki herhangi bir noktadan, labirentin kenarındaki başka bir noktaya (önemsiz, dallanmamış) bir yolu garanti eder. Bunların çoğu çok kısa, ama her zaman bir kaç uzun olacak gibi görünüyor. Tabii ki, labirentin ortasında da bazı döngüler var.

Diğer cevaplardan bahsetmediğim gibi, ışık alanlarına iyi bir şekilde göz atmak istiyorum. Bunlar, koyu alanlar tarafından sınırlandırılmıştır, bu nedenle yukarıda yapılan ifadenin bir sonucu olarak, N karanlık alanlar tarafından harici olarak bağlanan bir ışık alanı, N (tam olarak) noktalarında alanın kenarına temas eder. Bu nedenle, bazı oldukça geniş ışık alanları ortaya çıkar ve bunlar ilginç, dallanmış labirentler oluşturur.

Aşağıdaki örnekte programımdan işlenmemiş çıktıyı (monokrom) görebilirsiniz. Bunun altında (Windows Paint kullanarak) en uzun iki karanlık alanı mavi renkle boyadım. Sonra en büyük ışık alanını sarıya boyadım ve iki alan mavi ile kırmızı ve yeşile döndü. Sarı, yeşil (ve hatta kırmızı) labirentine oldukça ilginç ve önemsiz.

görüntü tanımını buraya girin

EDIT - Otomatik labirent toplama ve start / bitiş seçimi

Bir satır daha (59 karakter) için, program kırmızı, yeşil, sarı, mavi, macenta ve camgöbeği renklerinde rastgele ve taşkın dolgulu kareler seçerek otomatik olarak 6 labirente kadar seçebilir. Her zaman tam bir 6 bulmaz, çünkü zaten renkli olan rastgele bir kare alırsa hiçbir şey yapmaz.

Aşağıdaki kodun geri kalanı, her sütunu yukarıdan aşağıya ve soldan sağa tarayarak ve karşılaştığı ilk kareyi alarak her renk için bir başlangıç ​​seçer. Ters yönde tarayarak bir son alır.

Bu renkli, iç içe geçmiş labirent dizisini oluşturur. Bazen öylesine iç içe geçiyorlar ki labirentlerin bir yerlerden geçmesi gerekiyor gibi görünüyor. Ama elbette, yapmazlar!

Ek kod ve çıkış 59 + 187 = 246 orijinal programın sonuna eklenecek ilave karakterler (soru spesifikasyonunun ötesinde geliştirme için)

  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)

görüntü tanımını buraya girin


7

C: 235 Bayt

#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++]);}

Not: Yukarıda, sayfaya sığması için yeni satırlar ekledim. Beklenen çıktı (80 karakterlik terminalde):görüntü tanımını buraya girin

Bunun çok zor bir labirent olmadığına pişmanım (aslında, iç halkalara hiçbir geri izleme gerekmiyor (ve çevreden merkeze önemsiz bir yol bulabilmelisiniz). özünde çizim algoritması.


Nereden geçip nerede geçemeyeceğinizi görmek biraz zor. Söylemeliyim ki, boruları tercih ettim;) (hem buna hem de dairesel gönderimime).
Martin Ender

@ m.buettner: Aslında aynı fikirdeyim. Eğer değiştirirseniz i+=2için i+=3, daha neler temizlemek olabilir.
imallett

6

Çocuğumun bunu yapmasına, biraz programlama öğrenmesine yardım ettim: http://jsfiddle.net/fs2000/4KLUC/34/ bunu beğendiniz mi?


17
Kodunuzu postaya sığdırabiliyorsanız, bunu yapın. Ayrıca, #Language (s) - Bytecount gibi bir başlık ekleyin. Kodunuzda yalnızca ASCII karakterleri kullandıysanız, buradan hoş bir bytecount alabilirsiniz . Kodunuzun ne yaptığına, sahip olabileceğiniz içgörülere veya yaptığınız zekice şeylerin bir özeti, gönderinize güzel bir katkı olabilir. Bu arada, Darth Vader bazı çizgileri görmeyi çok zorlaştırıyor. Sonunda Code Golf'a Hoşgeldiniz!
Rainbolt

Çocuklarınızla biraz programlama öğrendiniz ve ben de golf oynamayı öğrendim. Bu benim ilk golf oyunum ve sonuç hala oldukça uzun. Bayt sayısı: Orijinal: 55 + 6822 = 6877. Yeniden düzenlenmiş biraz : 39 + 3131 = 3170 Golf : 39 + 1593 = 1632
BartekChom

6

Commodore 64 BASIC - 38 bayt

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

Bu benim icadım değil, geçmiş zamanlardan beri çok güzel ve kısa bir programı tekrar ediyorum. Aslında, 10 PRINT CHR$(205.5+RND(1)); : GOTO 10bu kod parçasını kutlayan bir kitap var !

Çıktıyı bu YouTube videosunda görebilirsiniz ; İşte bir screencap:

YouTube ekran görüntüsü

İşte bu StackOverflow sorusu bu labirent-jeneratör programının daha fazla uygulamasıdır. Programın en kısa uygulaması, bu sorunun yazarı tarafından yayınlanan aşağıdaki 23 bayt C64 BASIC programıdır:

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

küçük harflerin olduğu gibi girildiği ve büyük harflerin Shift tuşunu kullanarak girildiği zaman (bunlar gerçek bir C64 ekranında farklı görünümlere sahiptir).


Bu tam olarak aynı Brian'ın başvurusu değil mi? (sadece biraz daha kısa) Ve Bash'in cevabı nedir? Öyleyse buradaki soru aynı zamanda, kavşaklar olmadan bir labirent hala bir labirent mi?
Martin Ender

nneonneo, bu harika fikrin doğru ve dürüst şekilde nitelendirilmesi için +1. @ m.buettner Baskısız alan sizin belirttiğiniz gibi dallanmamış labirent üretir. Bununla birlikte (ve henüz kimsenin bunu göstermediğine şaşırdım) basılan alan önemsiz, önemsiz, dallanmış labirentler oluşturuyor (cevabımı görün.) . Bu köşegen labirentlerinde başlangıç ​​ve bitişi tanımlamak kolay değildir.
Seviye Nehri St

@ m.buettner 1. x86 ikili değeri en küçük değerde sadece 10 bayttır. 2. Bu çok iyi bilenmiş bir algoritmadır ve hiç de orijinal değildir ve çözülebilir bir labirent oluşturması amaçlanmamıştır.
Isiah Meadows

5

Java: 700

İşte özyinelemeli bir duvar toplayıcı. Algoritma bu sitede belirtilmiştir :

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;}}

Temel olarak, her dikdörtgeni ikiye ayırır, duvarla (ve geçitle) ikiye böler, sonra bunları ikiye böler vb. Bol miktarda ölü biter, bu yüzden daha büyük labirentler için hiçbir şekilde "önemsiz" değildir.

Böylece, giriş ve çıkışa keyfi bir şekilde karar verilebilir. Birini seçmem gerekirse, sadece üst / sol ve alt / sağ diyecekler.

Çift genişlikte ascii'de çizilir, bu nedenle herhangi bir boyuttan birini yapıyorsanız, çıktıyı bir dosyaya aktarmak iyi bir fikirdir. İşte konsolda 20x20:

20x20

Ve 100x100'lük bir notepad ++ (hepsini almak için uzaklaştırmak zorunda kaldım, bu yüzden biraz ... küçük ):

100x100

Satır sonları içeren kod:

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 karakter

Bu "uygun" bir labirent, daha az golfçü, ama daha fazla mazier daha fazla. İkili labirent algoritması olarak adlandırılan her bir hücrenin aşağı veya sağa doğru giden bir çıkışı olabilir, ancak her ikisi de olmayabilir. (Şimdi sadece bir tarafa düz gitmeyi önlemek için "S" Başlat ve "E" olarak işaretlendi).

"::" ZXB'nin Spektrum grafik karakterlerini bir metin dosyasına girme biçimi, satılan bir blok karakterine eşittir.

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"

Labirent


2
Hayır, aslında başlangıç ​​ve bitişi değiştirmelisiniz (başlangıç ​​alt sağ, üst üst sol). Önemsiz olduğu için, kurallar nedeniyle, sonuna kadar ulaşmak için her zaman aşağı doğru inmek zorundasınız.
Martin Ender

1
Başlangıç ​​ve bitiş tersine çevrilmiş olsa bile, labirent, doğru yolun yalnızca yukarı ve sola hareket edeceği (belki de ilginç) özelliğine sahiptir. Ancak labirent artık önemsiz değil, çünkü iki yoldan birine gidebileceğiniz birçok nokta var.
Kevin - Monica

1

C- 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;}

İşte nasıl göründüğü:

Labirent

Not: Bu çözüm, güvenilmez oyun seviyesi 8: ormandan ilham alıyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.