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
di bA^aB$
tidak akan berlebihan baik. ;)