W grze w szachy istnieje element zwany królową, który może atakować każdy inny element, który znajduje się w tym samym rzędzie, kolumnie lub po przekątnej. W szachach występują zazwyczaj dwie boki, czarno-biały, z których każdy należy do jednej z drużyn. Kawałki nie mogą atakować sztuk należących do tej samej drużyny.
Twoim celem jest znalezienie największych pokojowych współistniejących armii na kwadratowej planszy. Jest to największa liczba czarnych i białych królowych, które mogą zmieścić się na planszy, tak że żadne dwie królowe nie mogą się nawzajem atakować, a liczba czarnych królowych jest równa liczbie białych królowych.
Otrzymasz jako dane wejściowe długość boku kwadratowej planszy i powinieneś podać liczbę największych największych pokojowych armii, które mogą zmieścić się na tej planszy.
To jest golf golfowy, więc obowiązują standardowe reguły dla tagu.
Te przypadki testowe obejmują wszystkie znane odpowiedzi. Twoje rozwiązanie powinno być uogólnioną odpowiedzią, która przy wystarczającej mocy obliczeniowej i czasie może obliczyć rozwiązanie dla dowolnej wartości wejściowej.
1: 0 2: 0 3: 1 4: 2 5: 4 6: 5 7: 7 8: 9 9: 12 10: 14 11: 17 12: 21 13: 24
Odpowiedzi:
C, 476 bajtów, iterujące DFS białe królowe, O (2 n 2 )
518 bajtów, DFS z przycinaniem, O (2 n )
577 bajtów, DFS iterujące białe i czarne królowe, O (?)
Zasadniczo kod iteruje możliwości białej królowej i sprawdza, czy w takim razie można ją umieścić.
Tabela prędkości odniesienia (w sekundach):
źródło
Clingo , 90 bajtów
Próbny
źródło
Python 2 |
325284217 bajtówWypróbuj online!
Edycja: Zastąpiono krotki liczbami całkowitymi wg i innymi trywialnymi zmianami.
Edycja2: Bajty do 217 dzięki musicman523 i CalculatorFeline !
Jak to działa
Program dokonuje iteracji po wszystkich możliwych pozycjach
n
królowych i odfiltrowuje niepasujące punktyg
spowodowane przez pozycję królowych. Jeśli pozostałe punkty są większe niżn
wtedy, oznacza to, żen
armie królowej mogą pozostać w spokoju. Jeśli dla następnej wartościn
nie zostanie znaleziona sytuacja pokojowa, program zakończy działanie z kodem wyjścia:,n-1
który jest odpowiedzią. Krótko mówiąc, jest to brutalna siłaProgram można przyspieszyć, zmieniając dwa ostatnie wiersze na
źródło
from module import*
do importowania wszystkiego z modułu i zapisywania bajtów.Haskell ,
169 156 153152 bajtówDefiniuje funkcję
g
, może być dodatkowo grywalna. Wypróbuj online! W przypadku TIO po skompilowaniu-O2
zajmuje to około 36 sekund dla n = 4, a limit czasu dla n = 5 . Złożoność czasowa powinna wynosić O (n 2 4 n 2 ) .Wyjaśnienie
Iterujemy ponad możliwymi wartościami liczby królowych ( q ). Dla każdego q generujemy wszystkie pary podzbiorów rozmiar- q z [1..n] 2 , jeden zestaw czarnych królowych ( b ) i jeden z białych królowych ( w ). Następnie każdy element b jest sprawdzany względem każdego elementu w, aby sprawdzić, czy mają one wspólny rząd, kolumnę, przekątną lub anty-przekątną. Dotyczy to również dwóch elementów o tej samej współrzędnej. Największa wartość q która dopuszcza konfigurację pokojową, jest wartość końcowa.
Pierwsze dwa wiersze programu określają funkcję
!
, która obliczak
podsekwencje długości listyx
. Implementacja odbywa się przez podstawową rekurencję: albo wybierz pierwszy element, który ma być w zestawie, albo nie, i wróć do ogona, zmniejszając wk
razie potrzeby. Następnie pusta lista lub osiągnięty, sprawdź tok==0
.Druga funkcja pomocnicza
&
pobiera liczbęq
(liczbę królowych po każdej stronie) i listęl
(współrzędne x planszy, używane również jako współrzędne y) i zwraca wartość logiczną wskazującą, czy istnieje konfiguracja pokojowa. Najpierw obliczamyp
listęq
podsekwencji długości listy wartości[x,y,x-y,x+y]
, gdziex
iy
zakresl
. Reprezentują rząd, kolumnę, przekątną i anty-przekątną kwadratu(x,y)
na planszy.Następnie mamy wynik
q&l
. Zwracamy dwa krótsze sekwencjeb
iw
odp
, powiązać 4-list nich razem na wszystkie możliwe sposoby i sprawdzić, że zawsze różnią się we wszystkich 4 współrzędnych. Jeśli niektóre wyboryb
iw
wynik prawdziwego wyniku, wrócimyTrue
.Ostatni wiersz jest główną funkcją. Biorąc pod uwagę
n
, po prostu znajduje największą możliwą wartość,q
dla którejq&[1..n]
jest to prawda.źródło