Die Rache des schwarzen Bauern

8

Zielsetzung

Der schwarze Bauer will sich rächen. Planen Sie den letzten Angriff.

Regeln

Der schwarze Bauer ( L) beginnt in der oberen Reihe und bewegt sich nach unten in die untere Reihe. Maximieren Sie die Punkte und geben Sie den Pfad mit an X. Bauern ( P) sind 1, Bischöfe ( B) und Ritter ( N) 3, Türme ( R) 5 und Königinnen ( Q) 9. Die Eingabe enthält keine Könige.

Wenn es mehr als einen Pfad mit der maximalen Anzahl von Punkten gibt, geben Sie einen dieser Pfade aus. Es wird keine Situationen geben, in denen der Bauer die unterste Reihe nicht erreichen kann.

Beispiele

Eingang:

----L---
-----P--
------P-
--R--P-Q
----P-P-
---P-P-P
--P-N---
-P------

Ausgabe:

----L---
-----X--
------X-
--R--P-X
----P-X-
---P-X-P
--P-X---
-P--X---

Eingang:

--L-----
-P------
P-------
-P------
P--Q----
-P------
P-------
-P------

Ausgabe:

--L-----
-PX-----
P-X-----
-PX-----
P--X----
-P-X----
P--X----
-P-X----
Absinth
quelle
Was soll passieren, wenn der Bauer die unterste Reihe nicht erreichen kann?
Reto Koradi
Eigentlich sagt der Text nie , dass es hat die untere Reihe zu erreichen. Ist das die Absicht? Sagen wir im zweiten Beispiel, wäre es gültig, dass der Pfad in der 5. Reihe anhält, nachdem der Bauer die Königin gefangen hat?
Reto Koradi
@ RetoKoradi Huh. Daran habe ich eigentlich nicht gedacht. Ja, der Bauer sollte die unterste Reihe erreichen. Sie können davon ausgehen, dass Fälle, in denen der Bauer die unterste Reihe nicht erreichen kann, in der Eingabe nicht vorkommen.
Absinth
1
Und wenn es die untere Reihe erreicht, wird es als Königin befördert und tötet alle anderen ...
Coredump
Was ist mit El Passant?

Antworten:

2

Python, 332

def s(m,l,p):
 if not m:return 1
 b=m[0]+'-';z=filter(lambda i:(b[i]=='-')==(i==l),[l,l-1,l+1])
 if not z:return 0
 g=lambda i:s(m[1:],i,0)+[0,1,3,3,5,9]['-PBNRQ'.index(b[i])];i=max(z,key=g)
 if p:print m[0][:i]+'X'+m[0][i+1:];s(m[1:],i,p)
 return g(i)
import sys
t=sys.stdin.read().split('\n')
print t[0]
s(t[1:],t[0].index('L'),1)
Pappkarton
quelle
2

Ruby 260 258 255 241 236 222

->b{s=->l,w=p{c,*x=l.map &:dup
v=[1,3,3,5,9,0]['PBNRQ'.index(c[y=w||c.index(?L)])||5]
w&&c[y]=?X
(n=x[0])?(m=[]
[y-1,y,y+1].map{|z|(z==y)^(n[z]>?.)&&m<<s[x,z]}
q,r=m.max_by{|m|m ?m[0]:0}
q&&[q+v,c+r]):[v,c]}
s[b.lines][1]}

Dieses Programm definiert eine Funktion ( s), die bei einigen Board-Zeilen den besten Pfad als Zeichenfolge und den Wert in Punkten dieses Pfads zurückgibt. sist rekursiv, bewertet also bei jedem Schritt alle Möglichkeiten und gibt die beste zurück.

Hier ist eine Online-Version mit Tests: http://ideone.com/6eMtm4

Die lesbare Version finden Sie hier: http://ideone.com/eoXUtp

Alle Schritte, die ich unternommen habe, um die Größe des Codes zu reduzieren, finden Sie hier .

Cristian Lupascu
quelle