Arka fon
Kendinizi tek boyutlu bir labirentte kaybolmuş olarak bulmak için uyanıksınız! Mistik bir cin (ya da başka bir şey) ortaya çıkar ve çıkışın önünüzde bulunduğunu açıklar, ancak siz ve çıkış arasındakiler bir dizi zorluktur. İlerledikçe, tüm bu zorlukların sadece kilitli kapılar olduğunu anlıyorsunuz . İlk önce tee şeklinde bir anahtar deliği olan bir kapı görüyorsunuz ve kendinizde böyle bir anahtar bulunmuyorsa, adımlarınızı takip edin, T
şekli olan bir anahtar arayın.
Sinirli, yerde hiçbiri rastladığınız kapıyla uyuşmayan, bir alfabe anahtar çorbası buluyorsunuz. Bir miktar deha (veya aptallık) darbesiyle, küçük harf t
şeklindeki anahtarın yeterince sıkıştığında yuvaya sığabileceğine karar verirsiniz . Küçük harfli t
anahtar elinizle kapıya yaklaşırken, T
delik yeşil yanar ve kapı önünüzde çözülür.
Birincisi, gidecek çok daha fazlası ...
Meydan okuma
Bu zorluğun amacı, labirentten kaç adım attığınızı işaretlemektir.
Bu zorluğun girişi labirenttir: sadece karakter içeren bir dize [A-Za-z^$ ]
. Sözlük:
^
- Başlangıç alanı. Giriş tam olarak bir tane içerecektir^
.$
- Çıkış (özgürlük!). Giriş tam olarak bir tane içerecektir$
.[A-Z]
- Büyük harfler kapıları belirtir. Bu kapıdan ancak gerekli anahtarı topladıysanız geçebilirsiniz.[a-z]
- Küçük harfler tuşları belirtir. Bu anahtarları, anahtarı içeren alana doğru yürüyerek toplarsınız.
Girdide her büyük harften en fazla biri olacaktır. Bu, toplam kapı sayısının 0-26 arasında olacağı anlamına gelir.
Her kilitli kapıda [A-Z]
tam olarak bir tane küçük harf tuşu bulunur [a-z]
. Girişte herhangi bir sayıda boşluk ( ) olabilir.
Tüm kapılar başlangıçta sağda ve çıkışta solda olacaktır. Böylece gereksiz kapılar olmayacak. Tüm girişler çözülebilir olacak.
Bu mücadelenin çıktısı, labirentten çıkmak için attığı adımların sayısı olacak.
Algoritma
Bu sefil yere çıkmak için yöntemsel yaklaşımınız şöyle:
- Baştan (
^
) başlayın ve karşılaştığınız tüm anahtarları toplayarak ileri (sağ) ilerleyin. - Bir kapıya rastladığınızda, doğru anahtara sahipseniz kapıya doğru ilerlersiniz. Doğru anahtara sahip değilseniz, açamadığınız en son kapının anahtarını bulana kadar rastladığınız anahtarları toplayarak geriye doğru (solda) yürürsünüz.
- Mevcut sorunlu kapının anahtarını topladığınızda, sağa dönün ve devam edin.
- Exit (
$
) adımına kadar bu işlemi tekrarlayın .
Deneyimli golfçüler, bu algoritmayı çalıştırdığınız ile aynı sonucu çıkardığı sürece kodunuzun bu özel algoritmayı uygulamak zorunda olmadığını anlayacaktır.
sayma
Bir kareden başka bir kareye adım attığınızda, bu bir adım olarak sayılır. 180º döndürmek, ek bir adım gerektirmez. İstenilen anahtar olmadan bir kapıya doğru ileri gidemezsiniz. Almak için bir anahtara basmalı ve kazanmak için çıkışa basmalısınız. İlk hamlenizden sonra, başlangıç alanı ( ^
) diğer normal boşluklar gibi davranır.
Örnekler
Bu örneklerde boşlukları insan tarafından okunabilirlik için alt çizgi olarak bıraktım.
Girdi olduğunu _a_^_A__$__
. Çıktı 11
. Sen almak 1
için hiçbir anahtara sahip olduğunu ileri adımı, haber A
kapı ve sonra yüzüne hakkında. İçinde kalan alanı kaplayana kadar geriye doğru yürüyorsunuz a
( 3
geriye doğru, şimdi 4
toplam). Daha sonra çıkışı içeren alanı kaplayana kadar ileri yürüyün ( 7
ileri, 11
toplam adımlar ).
Girdi olduğunu b__j^__a_AJB_$
. Çıktı, 41
labirentin arkasına, biri j
anahtarı, diğeri anahtarı almak için iki ayrı yolculuk yaparsınız b
.
Girdi olduğunu __m__t_^__x_T_MX_$____
. Çıktı 44
. x
Anahtarı almak için fazladan bir yolculuk yapmazsınız, çünkü baştan kapıya giderken yoldan çıkardığınız gibi T
.
Girdi olduğunu g_t_^G_T$
. Çıktı 12
. G
Bir anahtar olmadan ve hemen yüzün hemen etrafına gidemezsiniz . t
Anahtarı anahtara götürecek kadar şanslısın g
ve böylece özgürlüğün yolunda iki kapıyı da aç.
Girdi olduğunu _^_____$
. Çıktı 6
. Kolaydı.
G / Ç Kuralları ve Kazanma Kriteri
Standart I / O kuralları geçerlidir. Bu bir kod golf mücadelesi.
A
de bA^aB$
ya gereksiz olmaz. ;)