Anda terjebak dalam labirin 5x5 ini - setiap kamar diberi label dari 1 hingga 25 dan pintu keluarnya ada di kamar 1.
Anda diberikan sebagai input ruangan tempat Anda berada sekarang. Tugas Anda adalah menampilkan urutan gerakan terpendek (utara, timur, selatan, barat) yang diperlukan untuk mencapai ruang 1.
Bergerak dapat menjadi output dalam format apa pun yang Anda inginkan (daftar, string, array ...) selama Anda menggunakan karakter n,w,e,s
.
Inilah semua kasus uji:
1 => empty string/list
2 => w
3 => ww
4 => swwnw
5 => wswwnw
6 => seenwnw
7 => nw
8 => wnw
9 => wwnw
10 => swwnwnw
11 => eenwnw
12 => enwnw
13 => nwnw
14 => wnwnw
15 => wwnwnw
16 => enenwnw
17 => nenwnw
18 => wnenwnw
19 => nwnwnw
20 => wnwnwnw
21 => nenenwnw
22 => enwnenwnw
23 => nwnenwnw
24 => wnwnenwnw
25 => nwnwnwnw
Jawaban terpendek dalam byte menang!
code-golf
kolmogorov-complexity
Arnaud
sumber
sumber
Jawaban:
Python 2 , 64 byte
Cobalah online!
Fungsi yang mencetak satu arah per baris, diakhiri dengan kesalahan.
Konstanta
0x1211252b5375
mengkodekan dalam basis 4 arah yangd
kita tempuh dari setiap nomor kamar sebagai angka 0 hingga 3. Digit ekstraksi>>2*n-4&3
juga dirancang untuk memberikan kesalahan pergeseran negatif saatn=1
, mengakhiri kode. Kami memperbarui nomor kamarn
melalui offset yang dihitung dari arahd
sebagaid*3+d%2-5
, yang memetakan:sumber
try
/except
) untuk dapat melanjutkan eksekusi setelah memanggil fungsi ini.Python 2 ,
9593 byteCobalah online!
Bisa mencukur
32 byte jika pelabelan kamar berindeks 0 diizinkan.sumber
05AB1E ,
3029 byte-1 byte berkat kebetulan ajaib dengan bilangan prima
Cobalah online!
sumber
1
untuk input1
, bukan string kosong (perbaikan mudah akan menambahkan memimpinõ?
). Terlepas dari itu, jawaban yang bagus!Ruby ,
7262 byteCobalah online!
Bagaimana?
Kuncinya di sini adalah dengan menggunakan 2 konstanta untuk membangun langkah berikutnya untuk setiap sel, kemudian memecahkan masalah secara rekursif.
2 konstanta 18139004 dan 4267088 adalah string biner yang memberikan arah langkah selanjutnya, dengan mengekstraksi bit tunggal dari keduanya untuk setiap sel, kita bisa mendapatkan:
Lebih mudah daripada bergeser dan menutupi satu nomor biner besar IMHO.
Ketika kami mendapatkan arahan, kami mengekstrak surat yang sesuai dari string "en sw":
Dan lanjutkan secara rekursif pada sel [n + x]
sumber
JavaScript (ES7),
6258 bytePort jawaban xnor .
Cobalah online!
sumber
Perl 5 (
-n
), 94 byte-5 byte terima kasih kepada Grimy
TIO
sumber
Perl 5 , 79 byte
Cobalah online!
sumber
JavaScript,
807371 byteDiadaptasi dari solusi Python Chas jadi tolong
+1
dia juga.Cobalah secara Online!
1 byte disimpan berkat Arnauld .
sumber
Arang ,
4340 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Berdasarkan jawaban @ ChasBrown dan @ xnor. Penjelasan:
Masukkan ruangan.
Atur variabel loop
i
ke satu kurang dari nomor kamar dan ulangi saat itu bukan nol.Ekstrak arah dari string yang dikompresi
0113130113220112010102010
. (Yang terdepan0
hanyalah angka pengisi.)Cetak arahnya.
Gunakan rumus @ xnor untuk menghitung nomor kamar baru.
sumber
Jelly ,
3029 byteCobalah online!
Tautan monadik mengambil sel awal dan mengembalikan string dengan arah.
Saya suka fakta bahwa kamus Jelly memiliki kata seperti 'Kennesaw' (sebuah kota di barat laut Atlanta, Georgia), digunakan di sini karena mengindeks ke dalamnya dengan
[5, 1, -5, -1] + 1
memberinesw
!Penjelasan
sumber
PHP , 110 byte
Sebuah solusi yang bukan port jawaban Chas Brown atau xnor jawaban yang bagus . Saya tahu ini lebih lama tetapi saya ingin memiliki solusi yang berbeda!
Cobalah online!
Saya telah membuat string pemetaan yang memiliki 2 karakter untuk setiap sel di papan tulis. Karakter pertama untuk setiap sel adalah gerakan (n / e / s / w) atau
0
dan karakter ASCII kode 30 mod kedua akan mengembalikan nomor sel lain yang harus kita ikuti langkahnya dalam mode rekursif sampai kita keluar dari sel (cell < 2
).Misalnya untuk input 8:
8
adalah:w%
w
dan melanjutkan dengan gerakan untuk sel%
%
adalah 37 yang mod 30 akan menjadi 7, jadi sel berikutnya yang harus diikuti adalah7
.7
adalah:n
(karakter terakhir adalah spasi, kode ASCII = 32)n
dan melanjutkan dengan gerakan untuk sel 32 mod 30 yang2
.2
adalah:w<
(karakter terakhir kode ASCII = 60)w
dan melanjutkan dengan gerakan untuk sel 60 mod 30 yang0
.2
, loop berhenti!wnw
PHP , 75 byte
Versi ini ditulis oleh Grimy , 35 byte lebih pendek dari jawaban asli saya karena dia lebih pintar! Komentar Grimy: "4 * 25 <256, jadi Anda hanya perlu 1 byte per sel, bukan 2"
Cobalah online!
PHP , 71 byte
Port jawaban Arnauld ini yang merupakan port jawaban xnor , tetapi sebagai loop bukan fungsi rekursif, karena ternyata lebih pendek dalam PHP.
Cobalah online!
sumber
C (dentang) , 81 byte
Cobalah online!
Berkat saran @ Tommylee2k -8! + panggilan rekursif
C (dentang) , 90 byte
Cobalah online!
Mirip dengan semua solusi yang tidak dikompresi.
sumber
v;f(p){for(;p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v="00wwswsnwwseenwwenwnwnenwn"[p]);}
05AB1E ,
4543 bytePort of @ChasBrown menjawab Python 2 .
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Lihat ini 05AB1E ujung tambang (semua empat bagian) untuk memahami mengapa
.•DUo¢ê`Ω÷‰₂¡)R€ûK•
adalah"a wwswsnwwseenwwenwnwnenwn"
;Ž₁9
adalah22449
;Ž₁9₂в
adalah[1,7,5,11]
; dan'€Ã
adalah"news"
.sumber
western
lebih baik. ; pBash , 120 byte
Cobalah online!
Saya bermain-main sebentar dengan mencoba mengemas string sebagai camilan, tetapi decoding akan membutuhkan lebih banyak karakter daripada jumlah yang disimpan.
Bagaimana itu bekerja:
String $ S memegang karakter tunggal (n, w, s, e) untuk setiap kamar yang menunjukkan arah mana yang harus diambil untuk memindahkan satu ruangan menuju pintu keluar, melewatkan kamar 0 dan 1.
String $ N memiliki delta untuk ditambahkan / dikurangi dari nomor kamar saat ini untuk setiap perubahan arah (n: -5, w: -1, s: +5, e: +1)
Mulai dengan $ i sama dengan nomor kamar yang diberikan pada baris perintah ($ 1). Tetapkan karakter pada indeks $ i dalam string $ S ke $ d. Ambil nilai delta dari $ N untuk arah untuk dibawa ke ruangan berikutnya, tetapkan ke $ j.
Cetak arah selanjutnya untuk menerima $ d.
Tambahkan / kurangi delta dalam $ j ke / dari $ i.
Ulangi sampai kami meninggalkan kamar # 2 (sementara $ i> 1).
sumber
Stax , 31 byte
Jalankan dan debug itu
sumber
Kotlin , 112 byte
Cobalah online!
sumber