Saya tahu ada utas (lama) yang mirip dengan ini (di sini ), tetapi saya ingin mem-boot-ulangnya dengan beberapa modifikasi.
Tujuannya: menghasilkan labirin yang tampak acak menggunakan algoritme pilihan Anda, lalu mengeluarkan labirin secara grafis (jumlah pencetakan).
- Lebar dan tinggi ditentukan oleh Anda.
- Harus ada setidaknya satu jalur dari setidaknya satu pintu masuk ke setidaknya satu pintu keluar.
- Format labirin (cara Anda menampilkannya, tandai pintu masuk atau keluar) terserah Anda juga.
- Lebih cantik, semakin baik.
- Labirin sepele (mis. Labirin kosong, labirin kisi, labirin ukuran 1x1) tidak disarankan.
- Siklus dalam labirin diizinkan dan, didorong, jika hasilnya masuk akal.
- Penyalahgunaan bahasa didorong.
- Labirin harus terlihat cukup acak (tetapi algoritma yang sepenuhnya deterministik (misalnya kacau) yang menghasilkan ini juga baik-baik saja).
Sunting: fokus utama di sini adalah membuat implementasi sekecil mungkin. Namun, saya ingin memberikan beberapa kelonggaran dalam batasan itu untuk mendorong shininess. Saya sengaja meninggalkan "fitur" apa yang telah dibuka oleh labirin, tetapi sebagai pedoman kasar Anda harus mencoba mengemas jumlah bang yang paling banyak ke dalam uang yang paling tidak leksikal.
code-golf
popularity-contest
maze
Imallett
sumber
sumber
Jawaban:
C:
265253 Bytes(Membutuhkan terminal 65 karakter) Menghasilkan labirin 31x31 yang relatif acak dengan satu jalur terjamin dari pintu masuk ke pintu keluar.
Contoh output (dengan terminal simulasi 65 karakter):
sumber
int p,int c
.p,c
sudah cukup ...Mathematica,
144132 byteSejak awal, kita semua tahu cara paling efisien untuk menggambar labirin .
Output yang tidak digabungkan dan contoh:
Tentu saja, garis-garisnya adalah dinding. Anda adalah minotaur yang mulai di tengah dan harus keluar.
sumber
C: 364 Bytes
Catatan: di atas, saya menambahkan baris baru agar pas di halaman. Output yang diharapkan (pada terminal 80 karakter) (mulai catatan dan berakhir di kiri atas):
sumber
Mathematica,
134130 karakterFaktanya, kita dapat menggunakan algoritma ini untuk menghasilkan labirin dari grafik apa pun (tidak terarah).
Misalnya, hasilkan labirin dari grafik tur ksatria 8 * 8 (
KnightTourGraph[8,8]
):sumber
Bash, 53 byte
Ide yang mirip dengan kode C64. Menggunakan karakter Unicode sebagai garis miring karena terlihat jauh lebih bagus di terminal yang mendukung Unicode. Contoh keluaran pada Terminal OS X (font Menlo):
sumber
yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash
. Lihat posting iniJavaScript (ES6), 174
Ini adalah pembangun labirin yang saya gunakan dalam tantangan lain ini , hanya bermain golf. Ini adalah fungsi dengan 2 parameter: baris dan kolom. Labirin benar-benar terhubung tanpa loop, sehingga lokasi mana pun bisa menjadi titik awal atau akhir.
Contoh
Keluaran
Uji
sumber
ZX Basic - 54 karakter
Inilah labirin yang menunjukkan rute melaluinya (spasi antar garis)
dan potongan kecil dari saat saya pertama kali melakukan ini (beberapa tahun yang lalu), dan menghabiskan sedikit waktu melakukan grafis yang lebih baik.
sumber
BBC BASIC, 18 Bytes
Peningkatan panjang pada 23-byte versi C64 infinite loop oleh @nneonneo. VDU mengirimkan satu karakter ke pengontrol VDU: baik 2 + 1 * 45 = ASCII 47
/
atau 2 + 2 * 45 = ASCII 92\
BBC BASIC, 35 Bytes /
10795 Bytes35 byte hanya untuk baris terakhir, yang memberikan labirin 25 baris dalam tata letak 40 kolom. MODE1 memastikan bahwa tidak ada ruang ekstra yang tersisa di antara garis. Sisa dari program ini adalah opsional dan meningkatkan format. Pernyataan VDU23 mendefinisikan kembali font untuk karakter 47 dan 92 (8 byte yang membentuk bitmap 8x8). Saya menyertakan pixel cahaya di keempat sudut untuk menghentikan lari lurus agar tidak terjepit. Efek sampingnya adalah titik muncul di berlian kosong. Total 107 byte termasuk 2 baris baru.
Edit program ini dapat disingkat menjadi 95 byte dengan menyandikan beberapa kode VDU 8 bit menjadi 16 bit nilai endian kecil (dilambangkan dengan tanda titik koma alih-alih koma) dan mewakili pernyataan MODE sebagai pasangan kode VDU, sebagai berikut .
Keluaran
Menggunakan BBC Basic untuk Windows dari bbcbasic.co.uk
Baris terakhir saja, 35 byte
Seluruh program,
10795 byteSaat saya mengomentari jawaban @ Brian, garis miring membagi persegi menjadi 2 segitiga gelap, yang masing-masing memiliki tepat 2 pintu masuk / keluar. Ini menjamin jalur (sepele, tidak bercabang) dari titik mana pun di tepi labirin ke titik lain di tepi labirin. Banyak dari ini sangat pendek, tetapi selalu ada beberapa yang panjang. Tentu saja, di tengah-tengah labirin ada juga beberapa loop.
Karena jawaban lain belum menyebutkannya, saya ingin memperhatikan dengan baik area terang. Ini dibatasi oleh area gelap, oleh karena itu sebagai akibat wajar dari pernyataan yang dibuat di atas, area terang yang dibatasi secara eksternal oleh N area gelap menyentuh tepi bidang pada titik N (persis sama banyak). Oleh karena itu beberapa daerah cahaya yang cukup besar terjadi, dan ini membentuk labirin yang menarik dan bercabang.
Pada contoh di bawah ini, Anda dapat melihat output mentah (monokrom) dari program saya. Di bawah itu (menggunakan Windows Paint) saya telah mewarnai dua area gelap terpanjang dengan warna biru. Lalu aku mewarnai area cahaya terbesar dengan warna kuning, dan dua area yang dibatasi oleh warna biru merah dan hijau. Labirin kuning, hijau (dan bahkan merah) cukup menarik dan tidak suram.
EDIT - Memilih labirin secara otomatis dan pemilihan awal / akhir
Untuk satu baris lagi (59 karakter) program dapat secara otomatis memilih hingga 6 labirin dengan memilih kotak secara acak dan mengisi warna merah, hijau, kuning, biru, magenta, dan cyan. Itu tidak selalu menemukan 6 penuh, karena jika mengambil kuadrat acak yang sudah diwarnai tidak melakukan apa-apa.
Sisa kode di bawah ini memilih awal untuk setiap warna dengan memindai setiap kolom dari atas ke bawah dan kiri ke kanan, dan memilih kotak pertama yang ditemui. Ini mengambil akhir dengan memindai ke arah yang berlawanan.
Ini menghasilkan satu set labirin berwarna-warni yang saling terkait. Kadang-kadang mereka begitu terjalin sehingga labirin harus menyeberang di suatu tempat. Tapi tentu saja, mereka tidak melakukannya!
Kode dan hasil tambahan 59 + 187 = 246 karakter tambahan yang akan ditambahkan ke akhir program asli (untuk peningkatan di luar spesifikasi pertanyaan.)
sumber
C: 235 Bytes
Catatan: di atas, saya menambahkan baris baru agar pas di halaman. Output yang diharapkan (pada terminal 80 karakter):
Saya menyesal ini bukan labirin yang sangat sulit (pada kenyataannya, tidak diperlukan backtracking ke cincin bagian dalam (dan Anda harus dapat menemukan jalur dari perimeter ke pusat secara sepele). Namun, ia memiliki implementasi lingkaran Bresenham yang bagus. algoritma menggambar pada intinya.
sumber
i+=2
kei+=3
, mungkin lebih jelas apa yang terjadi.Saya membantu anak saya untuk melakukan ini, untuk belajar sedikit pemrograman: http://jsfiddle.net/fs2000/4KLUC/34/ bagaimana Anda menyukainya?
sumber
Commodore 64 BASIC - 38 byte
Ini bukan penemuan saya, saya hanya mengulangi program yang sangat indah dan singkat dari masa lalu. Bahkan, ada seluruh buku yang dinamai
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
merayakan potongan kode ini!Anda dapat melihat output di video YouTube ini ; inilah screencap:
Di sini, di pertanyaan StackOverflow ini adalah implementasi lebih lanjut dari program maze-generator ini. Implementasi terpendek dari program ini adalah program BASIC C64 23-byte berikut yang diposting oleh penulis pertanyaan itu:
di mana huruf kecil dimasukkan apa adanya, dan huruf besar dimasukkan menggunakan tombol Shift (ini memiliki penampilan yang berbeda pada layar C64 yang sebenarnya).
sumber
Jawa: 700
Inilah penambah dinding rekursif. Algoritme diuraikan di situs ini :
Pada dasarnya, ia membagi masing-masing persegi panjang menjadi dua dengan dinding (dan bagian), kemudian membelah mereka menjadi dua, dll. Ini menghasilkan labirin yang "sempurna" - satu tanpa siklus - yang memiliki jalur dari setiap titik ke setiap titik lainnya. Banyak jalan buntu, jadi itu bukan "sepele" dalam arti untuk labirin yang lebih besar.
Jadi, pintu masuk dan keluar bisa diputuskan dengan sewenang-wenang. Jika saya harus memilih satu, itu hanya akan mengatakan atas / kiri dan bawah / kanan.
Ini digambar dalam ascii lebar-ganda, jadi ide yang bagus untuk menyalurkan output ke file jika Anda melakukan salah satu dari ukuran apa pun. Inilah konsol 20x20:
Dan 100x100 di notepad ++ (saya harus memperkecil untuk mendapatkan semua, jadi agak ... kecil ):
Kode dengan jeda baris:
sumber
ZX Basic - 281 karakter
Ini lebih merupakan labirin yang "tepat", lebih sedikit golf, tetapi lebih simpang siur. Algoritma Binary maze disebut, setiap sel dapat memiliki jalan keluar turun atau kanan, tetapi tidak keduanya. (Sekarang termasuk Mulai ditandai "S" dan Akhir "E", untuk mencegah hanya lurus di satu sisi).
"::" adalah cara ZXB memasukkan karakter grafik Spectrum ke file teks, sama dengan karakter blok yang dijual.
sumber
C- 244
Berikut ini tampilannya:
Catatan: solusi ini terinspirasi oleh level game 8 yang tidak dipercaya : ke dalam hutan.
sumber