Kayıp piyon sorunu
Satranç oyunu sona erdikten sonra, düşman hatlarının arkasında hayatta kalan bir piyon kaldı. eve geri dönmenin en kısa yolunu bulmasına yardım edelim.
Orijinal problem, bir nXn "satranç" tahtasını ve f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
ağırlıkların bir fonksiyonunu tanımlar . amaç, alt satırdaki bazı karelerden, üst satırdaki olası diğer hareketlerin olduğu en iyi yolu bulmaktır: sola, yukarı, sağa ve tahtadan çıkamayabilirsiniz.
Dinamik programlama kullanarak O (n ^ 2) 'de problemi çözmek kolaydır, ancak bu kodgolftur ve çalışma süresi karmaşıklığı gibi işe yaramaz şeyleri umursamıyoruz ...
Sorun
girdi: tam boyutlu bir 7x8X3 (#linePasses X #rowSize X #movesPerPass) içeren normal bir satranç tahtasına karşılık gelen 3 boyutlu bir dizi (veya stdin yoluyla veya işlev argümanı olarak seçtiğiniz başka bir koleksiyon) negatif olmayan tamsayılar. hamle mal dan bazı pozisyon satır dizini ve vardır, kolon endeksidir:(i,j)
i
j
a[i][j][0]
maliyet seyahat etmek için kare yukarı sola(i+1,j-1)
grafiksel veya:\
.a[i][j][1]
kare(i+1,j)
veya grafik olarak seyahat maliyeti|
.a[i][j][2]
- yukarı doğru kare(i+1,j+1)
veya grafik olarak seyahat maliyeti/
.
toplamı büyük olan bir yol içermeyeceğini varsayabilirsiniz MAX_INT
.
çıktı: en iyi (en kısa, yani minimum ağırlık toplamı) yolu gösteren 8X8 ascii çıkışı (1'den fazla en iyi sonuç varsa, istediğiniz keyfi bir yol gösterebilirsiniz). yol aşağıdan yukarıya doğru çizilir, burada her satırda piyonun yoldaki konumuna karşılık gelen karakter, yapmak üzere olduğu karakterdir. örneğin piyon 3. sütundan (2. sütuna) sola hareket etmek üzereyse, şunları çizmelisiniz:
#?######
##\#####
bir ?
sonraki adımla değiştirilmelidir. son konum olarak çizilmelidir X
.
Örnekler
giriş:
[
[[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]]
]
çıktı:
##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####
giriş:
[
[[41,27,38],[12,83,32],[50,53,35],[46,32,26],[55,89,82],[75,30,87],[2,11,64],[8,55,22]],
[[56,21,0],[83,25,38],[43,75,63],[56,60,77],[68,55,89],[99,48,67],[94,30,9],[62,62,58]],
[[23,18,40],[24,47,61],[96,45,72],[71,6,48],[75,63,98],[93,56,51],[23,31,30],[49,34,99]],
[[20,47,42],[62,79,72],[32,28,44],[68,61,55],[62,39,57],[4,17,49],[97,85,6],[91,18,12]],
[[51,50,11],[32,39,56],[12,82,23],[33,88,87],[60,55,22],[29,78,14],[70,11,42],[63,94,67]],
[[75,64,60],[27,79,86],[70,72,56],[55,45,32],[95,67,12],[87,93,98],[81,36,53],[38,22,93]],
[[31,80,50],[77,71,22],[59,46,86],[64,71,53],[41,19,95],[62,71,22],[92,80,41],[26,74,29]]
]
çıktı:
######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
Bu kod golf , bu yüzden en kısa kod kazanır.
adil oyna. boşluk yok ...
DÜZENLE:
Iv'e golf oynamayan skalede düz ileriye doğru bir çözüm yazdırabilirsiniz . On-line scala kodu ile oynayabileceğiniz bir site de var: scalakata (sadece gist'i scalakata'ya kopyalayıp yapıştırın ve oynat düğmesine basın)