Kann der König den Bauern fangen?


26

Bei einer Eingabe von vier Ganzzahlen x 1 , y 1 , x 2 und y 2 wird ausgegeben, ob ein weißer König im Schach (mit Koordinaten ( x 1 , y 1 )) einen schwarzen Bauern (mit Koordinaten ( x 2 , y 1 ) fangen könnte 2 )) und fange es, wenn sich der Bauer bewegt, um so schnell wie möglich zu einer Dame aufzusteigen.

Die Koordinaten der Tafel lauten wie folgt:

       first coordinate (x)
             12345678

           1 .#.#.#.#
           2 #.#.#.#.
           3 .#.#.#.#
  second   4 #.#.#.#.
coordinate 5 .#.#.#.#
    (y)    6 #.#.#.#.
           7 .#.#.#.#
           8 #.#.#.#.

Angenommen, es ist weiß, um sich zu bewegen (der König ist am Zug), und beide Spieler spielen optimal (der König bewegt sich so schnell wie möglich, um den Bauern zu fangen, und der Bauer bewegt sich so schnell wie möglich, um zu befördern). Die Eingabekoordinaten sind immer unterschiedlich, und der Bauer beginnt niemals mit einer y-Koordinate von 8.

Der König bewegt sich in jeder Runde um ein Feld in eine beliebige Richtung (er kann sich diagonal bewegen), und der Bauer kann sich nur ein Feld vorwärts bewegen (seine y-Koordinate verringern), es sei denn, er befindet sich an seiner Anfangsposition (mit unserem Koordinatensystem, y-Koordinate von) 7), in diesem Fall kann es sich um zwei Felder vorwärts bewegen.

Die Eingabe kann als durch Leerzeichen / Komma getrennte Zeichenfolge, ein Array von Zeichenfolgen / Ganzzahlen oder vier Funktions- / Befehlszeilen- / usw.-Argumente erfolgen. Die Koordinaten können in der Reihenfolge angegeben werden, die für Sie am bequemsten ist (also ist es in Ordnung, Eingaben wie [y 2 , y 1 , x 1 , y 2 ] zu akzeptieren , solange sie konsistent sind). Die Ausgabe muss ein wahrer oder falscher Wert sein .

Da es sich um , der kürzeste Code in Bytes gewinnt.

Wahrheitstestfälle :

5 3 3 2

6 1 1 7

3 3 3 2

4 1 4 7

7 7 1 7

1 8 1 7

Falsche Testfälle :

6 4 3 2

8 8 1 7

3 4 3 2


Können wir die Reihenfolge der Koordinaten wählen oder muss es sein x1 y1 x2 y2?
Dennis

11
Ich schlage den Testfall vor 1 8 1 7, in dem der König zwei Felder ziehen kann, bevor der Bauer fängt. Ich denke, alle Antworten verstehen es jetzt falsch. Diese Situation macht das Problem sehr viel schwieriger.
Xnor

1
@Neil, weil die Konvertierung in Zahlen nur langweilig ist und nichts hinzufügt
edc65

1
@Neil Es gibt hier bereits viele Posts mit algebraischer Notation, und ich wollte mich auf die eigentliche Herausforderung konzentrieren.
Türklinke

2
@kaine Der Bauer stellt keine signifikante Bedrohung für den König dar, es sei denn, der König kann es nicht annehmen oder vor dem von ihm beworbenen Zug. Der König muss nicht in Schach ziehen, weil es immer einen ebenso guten Zug gibt, den er machen kann.
Neil

Antworten:


3

Gelee , 33 Bytes

‘»Ɠ_2<®
Ɠ©<7
:5+Ɠ>7$¤<1.4
Ɠ_ƓA2£Ŀ

Dieses Programm liest die Koordinaten x2\nx1\ny2\ny1ab STDIN. Probieren Sie es online!

Nicht konkurrierende Version

Leider hatte der Jelly-Interpreter einen Fehler, als diese Frage gestellt wurde. Dieser Fehler verhinderte, dass mehr als zwei Befehlszeilenargumente akzeptiert wurden. Die neueste Version von Jelly kann die angegebene Aufgabe in 23 Bytes lösen .

⁶>7×5
_A+⁵>6$¤+¢’»⁶_2<⁵

Probieren Sie es online!


18

Python 2, 53 40

lambda x,y,p,q:y-2<q>=abs(x-p)+q/7+y/8*5

Der König hat Koordinaten (x, y)und den Bauern (p, q).

Es gibt drei signifikante Fälle:

  1. Der Bauer befindet sich auf Rang 7 und der König auf Rang 8. Um den Bauern zu erobern, muss sich der König in derselben oder einer benachbarten Akte befinden.

    Ergebnis: q = 7 ⋀ y = 8 → |x - p| ≤ 1

  2. Der Bauer ist auf Rang 7. Um den Bauern zu erobern, muss sich der König innerhalb von sechs Akten befinden.

    Ergebnis: q = 7 → |x - p| ≤ 6

  3. Der Bauer ist auf einem niedrigeren Rang. Um den Bauern zu erobern, muss der König in der Lage sein, das Aktionsfeld höchstens einen Zug nach dem Bauern zu erreichen.

    Ergebnis: q < 7 → |x - p| ≤ q ⋀ y - 1 ≤ q

Meine Lösung ist nur, diese Bedingungen herunterzuspielen. Hoffentlich gibt es diesmal keine Fehler.


2
Wie wäre es Schneiden der absmit max(y-1,x-p,p-x)?
Xnor

Sollte nicht f(1,8,1,7)sein, Truedass der König den Bauern sofort fängt? Ich denke, es gibt eine Feinheit, bei der die Bauernreihe 7 nicht wie die Reihe 6 behandelt werden kann, wenn der König sofort fängt.
Xnor

@xnor Ich denke, es ist jetzt behoben (auf eine schlecht golfene Weise).
Grc

1
Wenn Sie die letzte Bedingung umgekehrt haben, können Sie das Leerzeichen zwischen orund entfernen -2.
Xsot

@xsot danke für den Tipp. Ich habe meine Herangehensweise geändert und jetzt ein bisschen mehr nach unten gebracht.
Grc

2

Prolog, 48 42 Bytes

Code:

p(X,Y,P,Q):-Y-2<Q,Q>=abs(X-P)+Q//7+Y//8*5.

Beispiele:

p(1,8,1,7).
true

p(3,4,3,2).
false

Keine schlechte Herausforderung für Prolog im Vergleich zu den meisten anderen.

Bearbeiten: 6 Bytes durch Umschalten auf die in grcs Python 2-Antwort verwendete Formel gespeichert .
Leider kann Prolog Vergleiche nicht wie in Python verketten und die Ganzzahldivision ist 1 Byte länger als die Gleitkommadivision.

Probieren Sie es hier online aus


0

JavaScript (ES6), 52

(x,y,u,t,d=x>u?x-u:u-x)=>(d>=y?d:y-1)<=(d<2|t<7?t:6)

Ich hoffe, Bytes ohne Math.abs, Math.min, Math.max gespeichert zu haben

Der Bauer in der siebten Reihe kann entkommen, indem er 2 Felder bewegt, wenn sich der König nicht in einer nahen Spalte befindet - deshalb wird geprüft, dbevor 7 durch 6 ersetzt wird.

Testfall zur Ausführung in der Konsole:

;[f(5,3,3,2),f(6,1,1,7),f(3,3,3,2),f(1,8,1,7),f(6,4,3,2),f(8,8,1,7),f(3,4,3,2)]

Ergebnis: [true, true, true, true, false, false, false]


0

Ruby, 50 Bytes

def f(a,b,c,d)(a-c).abs<=(d==7?6-b/8*5:d)&&b-d<2;end

Argumente sind (König x, König y, Bauer x, Bauer y), alle ganzen Zahlen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.