Kayıp piyon sorunu


14

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)ij

  • 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 , 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)

Yanıtlar:


5

Q: 199 Bayt

f:{m::x;n::{@/[+/-1 0 1_\:/:(x;m[y;;|!3]);0 2;(0W,),{x,0W}]};i:*<*|r:{&/n[x;y]}\[8#0;!7];  s:{-1+{*<x}'+n[y;z]}\[();(,8#0),-1_r;!7];j:i,{x+y x}\[i;|s];-1(@[8#"#";;:;]'[j;"X","/|\\"1+s'[|!7;-1_j]]);}

NOTLAR

  • Ticari olmayan kullanım için ücretsiz Q yorumlayıcısı (kx.com) (Windows, Linux, Mac sürümleri)
  • Bu çözüm Q'nun iç çekirdeğini (dahili olarak k4 olarak adlandırılır) kullanır, bu nedenle k uzantılı bir komut dosyası dosyasına veya k modunda etkileşimli yorumlayıcıya (ilk komut isteminde \ command) ihtiyacımız vardır. Aksine, dilin 'ayrıntılı' (okunaklı) sürümü q uzantılı komut dosyası gerektirir ve etkileşimli yorumlayıcıda varsayılan moddur.

ÖLÇEK

f ((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))

##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####

f ((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))

######X#
#####/##
####/###
#####\##
######\#
######|#
######|#
#######\

AÇIKLAMA

Halat amacıyla ikinci testi kabul ediyoruz (matris ((41 27 38; 12 83 32; ....)

Orijinal matrisi (kod düzeyinde m) dönüştürüyoruz: her koordinat için üçlüye sahip orijinal matriz yerine, sol, yukarı ve sağ deplasmanlar için matrisi tanımlarız. Sol matris 7x7 değerler (ilk sütunu düşürüyoruz), Yukarı matris 7x8 ve sağ matris 7x7 (son sütunu kapatıyoruz) içeriyor.

left                           up                         right
12 50 46 55 75 2  8       27 83 53 32 89 30 11 55     38 32 35 26 82 87 64
83 43 56 68 99 94 62      21 25 75 60 55 48 30 62     0  38 63 77 89 67 9 
24 96 71 75 93 23 49      18 47 45 6  63 56 31 34     40 61 72 48 98 51 30
62 32 68 62 4  97 91      47 79 28 61 39 17 85 18     42 72 44 55 57 49 6 
32 12 33 60 29 70 63      50 39 82 88 55 78 11 94     11 56 23 87 22 14 42
27 70 55 95 87 81 38      64 79 72 45 67 93 36 22     60 86 56 32 12 98 53
77 59 64 41 62 92 26      80 71 46 71 19 71 80 74     50 22 86 53 95 22 41

Son pozisyonu hesaplamak için minimum maliyet yolunu değerlendirmemiz gerekir. Başlangıç ​​maliyetinin 0 0 0 0 0 0 0 0 (ilk satırın her sütununa ulaşma maliyeti) olduğunu ve bir sonraki satırla yinelendiğini varsayıyoruz. Her sütun i'de üç değer hesaplıyoruz:

  • önceki i + 1 değerinin artı sol [i + 1] maliyeti. Maliyetin ilk bileşenini (eklenecek sütunları kaydırır ve ayırır) ve bileşeni bileşene toplarız

  • önceki i değeri artı artı [i] maliyeti. Bileşeni bileşene topluyoruz

  • önceki i-1 değerinin artı artı [i-1] maliyeti. Maliyetin son bileşenini (eklemek için sütunları kaydırır ve ayırır) ve bileşeni bileşene toplarız

Minimum değeri hesaplamak için, sonsuz ekli sonsuz ve doğru maliyeti ekleyerek sol maliyeti tamamlarız: sekiz bileşenden oluşan 3 vektörle, bileşene minimum bileşeni hesaplayın. Sonuç değer, yeni yinelemenin temel maliyetidir

İlk yineleme için değerler elde ederiz (Q'da 0W sonsuzdur)

0W 12 50 46 55 75 2  8
27 83 53 32 89 30 11 55
38 32 35 26 82 87 64 0W

ve her bir sütunun minimum değerini hesaplar

27 12 35 26 55 30 2 8

Tüm tekrarlardan sonra, her kareye ulaşmak için minimum maliyetimiz var (üstte 0, altta 7 varsayarak). Sadece son sütunla ilgileniyoruz, ancak tüm ara sonuçları ilustratif amaçlar için çiziyorum

0   0   0   0   0   0   0   0
27  12  35  26  55  30  2   8
27  37  78  82  110 78  11  70
45  61  123 88  173 129 34  104
87  123 151 143 212 133 40  122
98  155 163 176 234 147 51  185
158 182 219 208 246 234 87  207
208 204 265 261 265 256 128 233

Şimdi son sırada minimum değeri bulduk (sütun 6'da 128). Bu yolun sonu (çıkıştaki X karakteri).

Maliyet hesaplamasını tekrar tekrarlıyoruz, ancak şimdi her bir minimumdan elde ettiğimiz yönü ekliyoruz (minimum hesaplamak için kullanılan 3 değerin seçili değer olduğu).

\|/|\///
\\\\\/|/
\\\|//|/
\\|\//|/
\\|//|\/
\\//|\|/
\|/|/|\/

Satırları tersine çeviririz, 'X' konumunu konum 6'ya koyarız ve yalnızca sütun 6'da biten yolu koruruz (diğerleri # ile değiştirilir)

######X#
#####/##
####/###
#####\##
######\#
######|#
######|#
#######\

Iv'e hiç Q duymadı, ama böyle ayrıntılı bir yanıt için teşekkürler :)
gilad hoch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.