Di Twitch Plays Pokémon , salah satu rintangan paling menyebalkan yang bisa dihadapi adalah teka-teki es, di mana Anda harus melakukan perjalanan dari satu tempat ke tempat lain dengan menggeser semua jalan ke satu arah sampai Anda menabrak dinding atau batu besar.
Tugas Anda adalah membangun sebuah program yang akan menghasilkan teka-teki es acak yang sulit.
Program Anda akan menerima tiga angka, M
, N
, dan P
, sebagai masukan (dengan 10 <= M <= 30
, 15 <= N <= 40
, dan 0 <= P < 65536
):
12 18
dan akan menampilkan:
- Sebuah kotak
M
dengan masing-masingN
terdiri dari.
danO
, mewakili es dan batu besar. - Penanda posisi yang menunjukkan dari mana puzzle itu masuk. Penanda posisi ini terdiri dari surat
L
,R
,T
, atauB
, mewakili kiri, kanan, atas, dan bawah, diikuti dengan angka yang mewakili posisi (dari kiri atau atas) di sisi itu akan masuk dari. - Penanda posisi serupa yang mewakili tempat keluarnya puzzle.
- Solusi terpendek untuk teka-teki, yang terdiri dari urutan
L
,R
,U
, danD
masing-masing.
Contoh output:
..O...O...........
............O.....
..O...............
.......O..........
..................
...........O......
O..O...........O..
..........O.......
..O..........O....
........O.........
O....O.........O..
............O.....
R 4
B 5
LDLDRULD
(Note that this output is actually invalid because it is not actually long enough.)
Untuk input M
dan N
, solusi untuk puzzle harus memiliki setidaknya min(M, N)
langkah dan memindahkan setidaknya 2 (M + N)
total ruang. (Untuk referensi, teka-teki di atas bergerak total 12 langkah, bergerak 69 ruang.) Generator puzzle Anda harus menghasilkan yang berbeda M
dengan N
teka-teki dengan jalan solusi yang berbeda (yaitu urutan yang berbeda dari langkah-langkah untuk setiap solusi) untuk masing-masing benih P
.
- Perhatikan bahwa persyaratan jalur solusi yang berbeda adalah untuk menghindari solusi yang mencoba menghasilkan jalur batu secara sistematis, seperti solusi Claudiu di sini . Jika ada dua atau tiga pasang solusi identik karena keanehan dalam keacakan, itu akan baik-baik saja, asalkan program tidak sengaja mencoba secara sistematis menghasilkan teka-teki dengan urutan gerakan yang sama.
Kode terpendek untuk melakukan hal di atas menang.
>
dan<
(atau karakter apa pun) untuk masuk dan keluar? Teka-teki akan lebih mudah dibaca.LDLDRULD
yang hanya 8 langkah panjangJawaban:
Python,
672548 karakter, teka-teki yang lebih menarikMeskipun mengikuti aturan ketat, program Python saya yang lain mengalahkan yang ini, saya memutuskan untuk menulis yang akan menghasilkan lebih banyak teka-teki yang menarik. Ini dia:
Level indentasi adalah spasi, tab, tab + spasi.
Sampel :
Ini digunakan
P
sebagai benih, sehingga masingP
- masing akan menghasilkan puzzle yang sama, dan masing-masing berbedaP
sangat mungkin berbeda:Ini bekerja cukup cepat hingga ukuran
M=25,N=40
tetapi melewati itu menjadi sangat lambat. Secara teori itu seharusnya bekerjaM=30, N=40
jika Anda membiarkannya berjalan cukup lama. Saya sudah menulis secara manual di sini karena sulit untuk diikuti - program hanya menampilkan puzzle.Penjelasan :
Program loop, menghasilkan posisi awal acak di atas, posisi akhir acak di bagian bawah, dan kotak acak dengan
12.5%
kesempatan untuk batu besar di tempat tertentu. Ini kemudian memecahkan teka-teki dengan pencarian pertama yang luas dan jika solusinya ada dan lebih besar darimin(H,W)
, ia mencetak dan keluar.sumber
Jawa - 2632
Sementara saya mengagumi kemurnian teknis jawaban Claudiu , saya memutuskan untuk mencoba membuat puzzle yang sedikit lebih sulit;)
Langkah-langkah dasar (sangat sederhana):
Saya juga menandai setiap tempat sebagai 'nogo' saat saya meluncur. Jika saya berakhir di tempat nogo (atau tepat di depan salah satu yang berarti ada batu di sana), itu adalah langkah yang tidak valid.
Jadi, pada dasarnya idenya adalah membuat banyak peta secara acak , dan menyimpan yang pertama yang valid. Saya berencana untuk membuat ini lebih pintar (mundur, dll), tetapi berfungsi dengan baik sekarang. Mungkin juga mengurangi beberapa kode yang berlebihan, kita akan lihat.
Seperti itu, ia menghasilkan peta kecil (15x10) hampir secara instan, sedang (30x20) peta dalam beberapa detik, dan besar (40x30) dalam beberapa waktu acak antara 20 detik dan 20 menit, tergantung pada biji. Ini menguji antara 300k-500k peta / detik pada mesin saya, tergantung pada ukuran.
Catatan: Kadang-kadang peta tidak terlalu keras, hanya karena hanya ada batu sebanyak langkah, dan kecuali langkah membawa Anda ke dinding, seringkali hanya ada satu pilihan jika Anda ingin menabrak batu yang sebenarnya. Saya akan memperbaikinya nanti dengan menempatkan batu "acak" di tempat yang aman setelah semua langkah diambil. Karena nogo spot sudah ditandai, itu seharusnya cukup sederhana. Untuk saat ini, nikmati saja contoh-contoh ini:
Output menunjukkan ukuran / biji yang berbeda:
Ukuran maksimal 40x30:
Golf:
Dengan jeda baris:
sumber
while(o<3){...;o=...;}
bisafor(;o<3;o=...){...;}
, menghemat satu byte?if(w%2<1)return new Point(f.x,f.y+i*d);else return new Point(f.x+i*d,f.y);
->return new Point(f.x+(w%2<1?0:i*d),f.y+(w%2<1?f.y:0));
.Python,
235206185176 karakterPenggunaan :
Masukan melalui stdin formulir
[M, N, P]
.Anda bilang peta harus berbeda untuk setiap seed
P
... dan mereka adalah:Dan contoh dengan ukuran yang berbeda:
Memenuhi semua kriteria objektif yang disediakan:
P
mengarah ke teka-teki yang berbedaN + N%2
langkah - langkah, setidaknyaN
2 (M + N)
total ruangPenjelasan :
Setiap baris dikonstruksi dengan mengulang
W
kali elemen string tertentu dan membatasi panjangnyaW
(saya menggunakanH
danW
bukannyaM
danN
).Dua baris pertama bergantung pada
P
untuk membuat setiap puzzle unik. Pada dasarnya, note yangP
cocok dengan integer unsigned 16-bit. Saya mengonversiP
ke biner, menggunakan.
untuk 0 danO
untuk 1:Elemen baris pertama adalah 15 bit terakhir
t[1:]
, sedangkan elemen baris kedua adalah bit 1t[0]
,. Saya tidak bisa meletakkan semuanya di satu baris karena lebar minimum adalah 15, yang tidak akan cocok dengan 16 bit jikaP
> 32767. Jadi, dua baris pertama secara unik mewakili masing-masing nilai yang mungkin dariP
.Baris ketiga adalah dinding penuh sehingga nilai
P
tidak mempengaruhi solusi.Kemudian ikuti elemen maze yang sebenarnya. Baris ini mencetak semuanya, mengulanginya hingga tutup. Hasilnya seperti yang Anda lihat di atas:
Sisanya hanya mencari tahu bagaimana menyelesaikan labirin yang dihasilkan secara dinamis. Ini hanya tergantung pada lebar labirin. Saya mencatat bahwa solusi, untuk lebar yang diberikan, adalah:
dll. Oleh karena itu hanya
URDR
diulang dan terputus di tempat yang tepatW+W%2
,.sumber