Latar Belakang
Anda bangun untuk menemukan diri Anda tersesat dalam labirin satu dimensi! Sebuah jin mistik (atau sesuatu) muncul dan menjelaskan bahwa pintu keluar ada di depan Anda, tetapi di antara Anda dan pintu keluar itu adalah serangkaian tantangan. Ketika Anda berjalan maju, Anda menyadari bahwa semua tantangan yang disebut hanyalah pintu terkunci. Anda pertama kali melihat pintu dengan lubang kunci berbentuk tee, dan tidak memiliki kunci seperti itu sendiri, menelusuri kembali langkah-langkah Anda, mencari kunci dengan T
bentuk.
Frustrasi, Anda menemukan sup alfabet kunci di tanah, tidak ada yang cocok dengan pintu yang Anda temui. Dengan sedikit kejeniusan (atau kebodohan), Anda memutuskan bahwa kunci bentuk huruf kecil t
mungkin bisa masuk ke dalam slot jika Anda cukup macet di sana. Ketika Anda mendekati pintu dengan t
kunci huruf kecil di tangan, T
lubang itu menyala hijau dan pintu itu larut di depan Anda.
Satu down, masih banyak lagi ...
Tantangan
Tujuan dari tantangan ini adalah untuk menandai berapa banyak langkah yang Anda perlukan untuk keluar dari labirin.
Input dari tantangan ini adalah labirin: satu string yang hanya berisi karakter [A-Za-z^$ ]
. Glosarium:
^
- Ruang mulai. Input akan berisi persis satu^
.$
- Pintu keluar (kebebasan!). Input akan berisi persis satu$
.[A-Z]
- Huruf kapital menandakan pintu. Anda hanya dapat melewati pintu ini jika Anda telah mengumpulkan kunci yang diperlukan.[a-z]
- Huruf kecil menandakan kunci. Anda mengumpulkan kunci-kunci ini dengan berjalan ke ruang yang berisi kunci.
Akan ada paling banyak satu dari setiap huruf kapital di input. Ini berarti jumlah total pintu akan antara 0-26 inklusif.
Setiap pintu yang terkunci [A-Z]
akan memiliki tepat satu kunci huruf kecil yang sesuai [a-z]
. Mungkin ada sejumlah spasi ( ) di input.
Semua pintu berada di sebelah kanan awal, dan di sebelah kiri pintu keluar. Dengan demikian tidak akan ada pintu yang berlebihan. Semua input akan dapat dipecahkan.
Output untuk tantangan ini adalah sejumlah, jumlah langkah yang diperlukan untuk keluar dari labirin.
Algoritma
Pendekatan metodis Anda untuk keluar dari tempat celaka ini adalah sebagai berikut:
- Mulai dari awal (
^
) dan bergerak maju (kanan) mengumpulkan semua kunci yang Anda temui. - Ketika Anda menemukan sebuah pintu, jika Anda memiliki kunci yang benar, Anda melanjutkan ke pintu. Jika Anda tidak memiliki kunci yang benar, Anda berjalan mundur (kiri) mengumpulkan kunci yang Anda temui sampai Anda menemukan kunci untuk pintu terbaru yang tidak dapat Anda buka.
- Setelah Anda mengumpulkan kunci untuk pintu merepotkan saat ini, Anda kembali ke kanan dan melanjutkan.
- Ulangi proses ini sampai Anda melangkah ke pintu keluar (
$
).
Pegolf yang berpengalaman akan memahami bahwa kode Anda tidak harus mengimplementasikan algoritma spesifik ini asalkan menghasilkan hasil yang sama seolah-olah Anda telah menjalankan algoritma ini.
Perhitungan
Setiap kali Anda melangkah dari satu kotak ke kotak lain, itu dianggap sebagai satu langkah. Mengubah 180º tidak menimbulkan langkah tambahan. Anda tidak dapat melangkah maju ke pintu tanpa kunci yang diperlukan. Anda harus melangkah ke kunci untuk mengambilnya, dan harus melangkah ke pintu keluar untuk menang. Setelah langkah pertama Anda, ruang mulai ( ^
) berperilaku seperti ruang biasa lainnya.
Contohnya
Dalam contoh-contoh ini saya telah meninggalkan ruang sebagai garis bawah untuk keterbacaan manusia.
Masukan adalah _a_^_A__$__
. Outputnya adalah 11
. Anda mengambil 1
langkah maju, perhatikan bahwa Anda tidak memiliki kunci untuk A
pintu, dan kemudian tentang wajah. Anda berjalan mundur sampai Anda menempati ruang yang berisi a
( 3
langkah mundur, sekarang 4
total). Anda kemudian berjalan maju sampai Anda menempati ruang yang berisi pintu keluar ( 7
langkah maju, 11
total).
Masukan adalah b__j^__a_AJB_$
. Hasilnya adalah 41
Anda melakukan dua perjalanan terpisah ke bagian belakang labirin, satu untuk mendapatkan j
kunci, dan yang berikutnya untuk mendapatkan b
kunci.
Masukan adalah __m__t_^__x_T_MX_$____
. Outputnya adalah 44
. Anda tidak akan melakukan perjalanan ekstra untuk mendapatkan x
kunci, karena Anda mengambilnya dari awal hingga awal T
.
Masukan adalah g_t_^G_T$
. Outputnya adalah 12
. Anda tidak dapat pindah ke G
ruang tanpa kunci, dan segera tentang-wajah. Anda cukup beruntung untuk mengambil t
kunci menuju g
kunci, dan dengan demikian membuka kedua pintu menuju kebebasan.
Masukan adalah _^_____$
. Outputnya adalah 6
. Itu mudah.
Pedoman I / O dan Kriteria Kemenangan
Aturan I / O standar berlaku. Ini adalah tantangan kode-golf .
A
dibA^aB$
tidak akan berlebihan baik. ;)Jawaban:
CJam, 45
Cobalah online
Penjelasan:
sumber
Pyth, 51 byte
jumlah jarak antara pintu dan kuncinya (dua kali lipat, untuk mengambil perjalanan pulang pergi), mengabaikan kunci "bersarang" dan jarak dari awal hingga akhir:
algorythm yang sama di python2.7:
sumber
Python 2,
155154134128 byteSunting: Terima kasih kepada @ user2357112 dan @loovjo atas komentar mereka yang membantu saya mencukur
2026 byte dari solusi saya!sumber
i
tidak perlu?i
melacak posisi pintu yang saat ini sedang diproses, dan diperlukan jika kuncinya belum diambil (yaitu jikak
- posisi kunci - kurang darif
- yang terjauh yang pernah kita lewati - maka kita perlu menambahkan2*(i-k-1)
langkah-langkah ke total kami (berjalan ke kiri untuk mendapatkan kunci, dan berjalan kembali ke pintu) ...?i
digantikan olehl.index(d)
pada baris kelima dan tugas dengan dihapus pada baris keempat?e
danf
terlihat berlebihan. Selain itu, Anda bisa menyimpan banyak karakter dengan menyimpanl.index
ke variabel.x
berlebihan juga. Tebak golf noob-iness saya menunjukkan. :) Terima kasih untuk bantuannya!C, 136 byte
sumber
PHP 5.3, 123 byte
Ini adalah posting pertama saya di Code Golf, semoga kualitas golf ini cukup tinggi untuk posting pertama. Pasti tantangan yang menyenangkan dan pertanyaan yang luar biasa!
Program ini dengan baik menyalahgunakan fakta bahwa PHP tidak perlu Anda untuk mendeklarasikan variabel apa pun sebelum Anda menggunakannya.
Itu juga ternyata menjadi beberapa byte lebih pendek dalam solusi akhir saya untuk mulai dari 0 dan mengatur ulang jumlah langkah ketika karakter awal ditemukan, daripada memulai pada '^'.
Ada tips yang pasti diterima!
sumber
JavaScript (ES6), 110 byte
Port of @ Rob's Pyth menjawab.
sumber
Python 2.7,
234199179sumber
AWK, 174 Bytes
Mungkin ada algoritma yang lebih ketat, tapi inilah yang saya hasilkan.
Perhatikan bahwa saya menggunakan
gawk
. Beberapa implementasiAWK
mungkin tidak memecah string dengan""
cara ini.sumber
C #, 309 byte
Versi tidak disatukan:
Tidak ada yang mewah di sini, hanya iterasi melalui string dan ubah arah berdasarkan karakter dan apakah kunci tersebut terkandung dalam string kunci.
m = string maze
k = string kunci
f = arah (benar maju dalam labirin)
b = kunci untuk mencari ketika mundur
c = placeholder untuk m [j] untuk menyimpan beberapa byte karena sering digunakan
j = indeks char dari string untuk dilihat
t = hitungan
Masih relatif baru dalam bermain golf, jadi jika Anda melihat suatu tempat saya dapat menurunkannya, beri tahu saya!
sumber