Szachy atomowe to (bardzo zabawna) odmiana szachów, w której każde przechwycenie powoduje „eksplozję”, niszczenie uchwyconego kawałka, pionka przechwytującego i wszystkich pionków w promieniu 1 kwadratu. Celem tego wyzwania nie jest rozegranie całej gry w szachy atomowe, ale po prostu symulacja tego, co dzieje się po wykonaniu określonego ruchu.
Uwaga: Efekty dźwiękowe wybuchu nie są uwzględnione.
Wejście
Pozycja planszy zostanie podana w Forsyth-Edwards Notation (powszechnie znana jako FEN), ale tylko z pierwszym polem. Na przykład dane wejściowe:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
reprezentuje pozycję początkową:
Musi to być traktowane jako ciąg znaków lub odpowiednik twojego języka. Jest gwarantowane, że jest ważne; na przykład nie musisz się przejmować, czy jest dziesięciu królów, czy w ogóle nie ma króla.
Otrzymasz również ruch, który chcesz zasymulować, który jest reprezentowany przez dwie nazwy kwadratów: kwadrat, na którym znajduje się element, który ma zostać przeniesiony, i kwadrat, na który się porusza. Na przykład przesunięcie pionka króla o dwa pola do przodu na powyższym obrazku byłoby reprezentowane jako:
e2e4
Należy to również traktować jako ciąg. Ten ruch zawsze będzie ważny i nie musisz wspierać roszady . Musisz wspierać en passant , co zostanie wyjaśnione bardziej szczegółowo w następnej sekcji.
Wynik
Dane wyjściowe twojego programu powinny być w tym samym zapisie częściowym FEN, co dane wejściowe, z wykonanym określonym ruchem (i wszelkie elementy eksplodujące, jeśli to konieczne).
Dokładne zasady dotyczące eksplozji są następujące: podczas przechwytywania elementu:
Usuń przechwycony element (zawsze będzie to element na drugim kwadracie wymienionym na wejściu, z wyjątkiem sytuacji, gdy przechwytywanie jest en passant ).
Usuń element, który wykonuje przechwytywanie (zawsze będzie to element na pierwszym kwadracie wymienionym na wejściu).
Usuń każdy kawałek, który jest:
znajduje się na jednym z 8 kwadratów otaczających miejsce, w którym miał miejsce schwytanie (dla en passant , jest to kwadrat, na którym znajdowałby się pionek, gdyby nie eksplodował).
nie pionek.
Szybki przegląd zasad pasywnych dla tych, którzy nie są ci obcy: jeśli pionek przesunie się o dwa pola do przodu od swojej początkowej rangi, i istnieje pion, który mógłby go przejąć, gdyby przesunął się tylko o jedno pole do przodu, i tak może go przejąć, ale tylko w kolejnym ruchu. Mówi się, że przechwytywanie to odbywa się „ przelotnie ” (lub po francusku: „ en passant ”).
Przypadki testowe
Na zdjęciach zielone strzałki reprezentują ruch, który ma zostać wykonany, a zielone kółka oznaczają kawałki, które zostaną rozbite.
Wejście: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
, g1f3
Wyjście:rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R
Wejście: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK
, f2g3
Wyjście: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK
(skradziony z http://en.lichess.org/ocoSfS5I/white#36 )
Wejście: rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R
, f3b7
Wyjście:3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R
(skradziony z http://en.lichess.org/NCUnA6LV/white#14 )
Wejście: rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R
, e5d6
Wyjście:rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R
(skradziony z http://en.lichess.org/AvgU4Skq/white#16 ; nie był to rzeczywisty ruch, ale nie może być jedno, aby znaleźć grę atomową że rzeczywiście miał en passant: P)
Wejście: 5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q
, c6h1
Wyjście:5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2
(skradziony z http://en.lichess.org/l77efXEb/white#58 )
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Odpowiedzi:
JavaScript ( ES6 ) 305
310 321Jako funkcja z 2 rzeczywistymi parametrami (i wiele więcej z wartościami domyślnymi, używana jako szybki i brudny sposób definiowania lokalnych)
Przetestuj poniższy fragment kodu (tylko EcmaScript 6, tylko Firefox)
Nie golfił
źródło
Java, (
946777776 znaków)1 znak dzięki @ edc65
Uwaga: Znaki zliczane bez wstawionych przypadków testowych.
Kod
Nie jestem pewien, czy to rozwiązanie jest optymalne, ale pracuję nad golfem, wszelkie sugestie są mile widziane. Mogę też skomentować cały kod, jeśli ktoś chce, ale myślę, że jest to w większości oczywiste, z wyjątkiem mylącego wyliczania zmiennych.
Wyjaśnienie
Rozszerzony
Stary
źródło
String m,i="";m="";char[]n=m.toCharArray()
->String i=a[0];char[]n=a[1].toCharArray()
jest krótszy, więc otrzymujesz parametry z zewnątrz (tak jak powinieneś i tak)