Roguelike yol bulma
Göreviniz, aşağıda açıklanan elementlerin iki boyutlu bir dizisi verildiğinde, zindanı temsil eden, haydutun herhangi bir canavarı uyandırmadan toplayabileceği altın parçalarının miktarını temsil eden tek bir sayı çıktısını almak veya döndürmek olacaktır.
Dizinin elemanları aşağıdaki gibidir:
- Boş alanlar,
.
aramanızla veya bir boşlukla temsil edilir ; - Hilenin başlangıç pozisyonu elbette
@
; - Altın bir parça
$
; - Duvarlar
#
; - Canavarlar aşağıdaki regexp gelen karakterlerle temsil edilen:
[a-zA-Z*&]
.
Dizi yukarıda listelenmemiş herhangi bir karakter içermemelidir, bu nedenle duvar, boş alan, haydut veya altın bir parça olmayan bir şeyin canavar olduğunu varsayabilirsiniz.
Yol bulma kuralları:
- Bu haydut yalnızca boş hücreler veya altın içeren hücrelerden geçebilir;
- Bitişik veya çapraz olarak bitişik bir hücreye hareket etme sırası gelir;
- Altını almak anlıktır;
- Bu haydut, uyanmadan uyanmadan birden fazla tur atmak için bitişik veya çapraz olarak bir canavara bitişik kalamaz;
- Bu haydut, bir canavarın farkındalık alanına istediği kadar girebilir, canavar ancak haydut ardına iki ardışık dönüş geçirirse uyanır .
Giriş ve çıkış kuralları
Girdiyi iki boyutlu bir dizi, düz bir dizi, bir dize veya başka bir şey dahil olmak üzere herhangi bir makul formatta alabilirsiniz. Hayatınızı kolaylaştırırsa, dizinin boyutlarını da alabilirsiniz.
Hilenin başlangıçta bir canavara yakın olmayacağı garanti edilir.
Tam bir program veya işlev iyi.
puanlama
Bu kod golf , puan daha az iyi olmasından dolayı gönderiminizin bayt sayısıdır.
Test durumları
Burada boş alanlar için noktalar kullanarak okunabilirlik amaçları için kullanıyorum, eğer isterseniz boşluk kullanabilirsiniz (yukarıya bakın). Ayrıca, bunun haydutun her zaman sol üst köşede olmasının tam bir tesadüf olduğuna dikkat edin, kodunuz başka bir geçerli pozisyonda da işlemelidir.
1)
@..
.$.
... -> 1
Sadece bir akıl sağlığı testi.
2)
@....
...g$
..... -> 0
Yine bir akıl sağlığı testi.
3)
@....
...$g
..... -> 1
Hile soldan hareket ettirerek altını kapabilir.
4)
@....g..
.......$
........
.....h.. -> 1
Bu haydut canavarlar arasında zikzak yapabilir, asla her birinin yakınında bir tur atmaz.
5)
@....z..
.......$
.....b.. -> 0
Önceki test durumundan taktikleri burada çalışmıyor - canavar hassasiyeti alanları örtüşüyor.
6)
@$#.
###$
.... -> 1
Akıl sağlığı testi.
7)
@..#..
$.$g.$
...#.. -> 2
Aynen.
8)
@#.d#$
$...##
e.....
..$...
##..$b
.#..g$ -> 3
Buradaki altınların hepsinden yalnızca üç tanesine güvenli bir şekilde ulaşılabilir: başlangıç pozisyonuna yakın altın, bir pozisyona aşağı doğru hareket ettirilerek elde edilebilir. Sol üst köşeden kaçmak için, haydut iki kez çapraz olarak aşağıya doğru hareket etmek zorundadır. Ortadaki altın ise zorluk çıkarmaz. Dış altın korunan g
ve b
orta altının sağ tarafındaki sağdan köşeye çapraz ve sonra geri hareket ettirilerek elde edilebilir. Gerisi elde edilemez: sağ üst altın duvarlar tarafından engellenir ve sağ alt alt canavar duyarlılığı alanlarında iki tur gerektirir.
Aşağıdaki test vakaları cömertçe mbomb007 tarafından bağışlanmıştır.
9)
12345678
a @....g.D
b .......$
c ......#.
d .....h.. -> 1
Bu çok zor. Bir yoldur b4-b5-c6-b7-c8-b8(grab)
.
10)
12345678
a @....g.D
b .......$
c .......#
d .....h.. -> 1
Bir yoldur [bc]4-c5-b6-c7-b8(grab)
.
11)
12345678
a @....g.D
b ......#$
c .......#
d .....h.. -> 1
Fazladan duvar aslında hiçbir şeyi değiştirmez [bc]4-c5-b6-c7-b8(grab)
, hala bir çözümdür.
@
geçerli bir giriş mi?