Czy król może złapać pionka?

26

Biorąc pod uwagę wejście czterech liczb całkowitych x 1 , y 1 , x 2 i y 2 , wypisz, czy biały król w szachach (o współrzędnych ( x 1 , y 1 )) może złapać czarnego pionka (o współrzędnych ( x 2 , y 2 )) i złap go, jeśli pionek porusza się, aby jak najszybciej awansować do królowej.

Współrzędne tablicy są następujące:

       first coordinate (x)
             12345678

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

Załóż, że ruch jest biały (tura króla) i że obaj gracze grają optymalnie (król porusza się tak szybko, jak to możliwe, aby złapać pionka, a pionek porusza się tak szybko, jak to możliwe, aby awansować). Współrzędne wejściowe zawsze będą wyraźne, a pionek nigdy nie rozpocznie się od współrzędnej y wynoszącej 8.

Król porusza się o jedno pole w dowolnym kierunku w każdej turze (może poruszać się po przekątnej), a pionek może poruszać się tylko o jedno pole do przodu (zmniejszając współrzędną y), chyba że znajduje się w początkowej pozycji (w naszym układzie współrzędnych współrzędna y 7), w którym to przypadku może przesunąć się o dwa pola do przodu.

Dane wejściowe można podać jako ciąg oddzielony spacjami / przecinkami, tablicę ciągów / liczb całkowitych lub cztery argumenty funkcji / wiersza poleceń / itd. Współrzędne można podać w dowolnej kolejności, która jest najbardziej dogodna / golfy (więc zaakceptowanie danych wejściowych jako [y 2 , y 1 , x 1 , y 2 ] jest w porządku, o ile jest spójne). Wynik musi być wartością prawdy lub fałszu .

Ponieważ jest to , wygrywa najkrótszy kod w bajtach.

Prawdziwe przypadki testowe :

5 3 3 2

6 1 1 7

3 3 3 2

4 1 4 7

7 7 1 7

1 8 1 7

Przypadki testowe Falsy :

6 4 3 2

8 8 1 7

3 4 3 2

Klamka
źródło
Czy możemy wybrać kolejność współrzędnych, czy musi to być x1 y1 x2 y2?
Dennis
11
Sugeruję przypadek testowy 1 8 1 7, w którym król chwyta, zanim pionek może poruszyć się o dwa pola. Myślę, że wszystkie odpowiedzi są teraz błędne. Ta sytuacja sprawia, że ​​problem jest znacznie trudniejszy.
xnor
1
@Neil, ponieważ konwersja na liczby jest po prostu nudna i nic nie dodaje
edc65
1
@Neil Jest już wiele postów dotyczących notacji algebraicznej i chciałem skupić się na prawdziwym wyzwaniu.
Klamka
2
@kaine Pionek nie stanowi znaczącego zagrożenia dla króla, chyba że król nie może go przyjąć lub przed promowanym przez niego ruchem. Król nie musi się sprawdzać, ponieważ zawsze może wykonać równie dobry ruch.
Neil

Odpowiedzi:

3

Galaretka , 33 bajty

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

Ten program odczytuje współrzędne x2\nx1\ny2\ny1od STDIN. Wypróbuj online!

Wersja niekonkurująca

Niestety interpreter Jelly miał błąd, gdy pytanie zostało opublikowane. Wspomniany błąd uniemożliwił zaakceptowanie więcej niż dwóch argumentów wiersza poleceń. Najnowsza wersja Galaretki może rozwiązać dane zadanie w 23 bajtach .

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

Wypróbuj online!

Dennis
źródło
18

Python 2, 53 40

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

Król ma współrzędne (x, y)i pionka (p, q).

Istnieją trzy znaczące przypadki:

  1. Pionek ma rangę 7, a król rangę 8. Aby schwytać pionka, król musi znajdować się w tym samym pliku lub obok niego.

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

  2. Pionek ma rangę 7. Aby schwytać pionka, król musi znajdować się w sześciu plikach.

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

  3. Pionek ma niższą rangę. Aby schwytać pionka, król musi być w stanie dotrzeć do pola awansu co najwyżej jeden ruch za pionkiem.

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

Moim rozwiązaniem są tylko te warunki. Mam nadzieję, że tym razem nie ma błędów.

grc
źródło
2
Co powiesz na obcięcie absz max(y-1,x-p,p-x)?
xnor
Nie powinno f(1,8,1,7)być tak, Trueponieważ król natychmiast chwyta pionka? Wydaje mi się, że istnieje subtelność, w której pionek 7 nie może być traktowany jak rząd 6, jeśli król natychmiast złapie.
xnor
@ xnor Myślę, że teraz jest to naprawione (w złym stylu).
grc
1
Jeśli odwróciłeś ostatni warunek, możesz usunąć spację między ora -2.
xsot
@xsot dzięki za wskazówkę. Zmieniłem swoje podejście i teraz trochę go obniżyłem.
grc
2

Prolog, 48 42 bajtów

Kod:

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

Przykłady:

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

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

Niezłe wyzwanie dla Prologa w porównaniu do większości.

Edycja: Zapisano 6 bajtów, przechodząc do formuły użytej w odpowiedzi Grcona na Python 2 .
Niestety Prolog nie może łączyć porównań, ponieważ Python może, a dzielenie liczb całkowitych jest o 1 bajt dłuższe niż dzielenie zmiennoprzecinkowe.

Wypróbuj online tutaj

Emigna
źródło
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)

Mam nadzieję, że zapisałem bajty, które nie używają Math.abs, Math.min, Math.max

Pionek w siódmym rzędzie może uciec poruszając się o 2 pola, jeśli i tylko wtedy, gdy króla nie ma w pobliżu kolumny - dlatego dprzed zamianą 7 na 6 następuje sprawdzenie .

Przypadek testowy do uruchomienia w konsoli:

;[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)]

Wynik: [true, true, true, true, false, false, false]

edc65
źródło
0

Rubinowy, 50 bajtów

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

Argumentami są (król x, król y, pion x, pion y), wszystkie liczby całkowite.

PellMell
źródło