Jeśli nie wiesz, czym jest królowa w szachach, nie ma to większego znaczenia; to tylko nazwa :)
Twój wkład będzie kwadratem o dowolnej szerokości i wysokości zawierającym pewną liczbę królowych. Tablica wejściowa będzie wyglądać następująco (ta tablica ma szerokość i wysokość 8):
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
Na tej planszy jest 8 królowych. Gdyby było na przykład 7, 1 lub 10, plansza nie byłaby ważna.
Tutaj używamy .
pustej przestrzeni i Q
królowej. Zamiast tego możesz użyć dowolnego znaku spacji, który chcesz.
Dane wejściowe można zweryfikować jako poprawne i powinieneś wydrukować (lub zwrócić) prawdziwą wartość (jeśli nie jest poprawna, powinieneś wydrukować (lub zwrócić) wartość fałszu). Jest ważny, ponieważ żadna królowa nie znajduje się w tym samym rzędzie, kolumnie, przekątnej lub przeciw przekątnej jak inne .
Przykłady (nie wypisuj rzeczy w nawiasach):
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
1
...Q.
Q....
.Q...
....Q
..Q..
0
Q.
Q.
0
..Q
...
.Q.
0 (this is 0 because there are only 2 queens on a 3x3 board)
..Q.
Q...
...Q
.Q..
1
Q
1 (this is valid, because the board is only 1x1, so there's no queen that can take another)
Podkreślę, że dane wejściowe są prawidłowe tylko wtedy, gdy żadna królowa nie znajduje się w tym samym rzędzie, kolumnie, przekątnej lub anty-przekątnej jak inne .
Zasady
- Nigdy nie otrzymasz pustego wejścia
- Jeśli dane wejściowe zawierają mniej królowych niż pierwiastek kwadratowy obszaru planszy, nie są poprawne.
- Uwaga: nie ma prawidłowych rozwiązań dla płyty 2x2 lub 3x3, ale istnieje rozwiązanie dla każdej kwadratowej płyty o innym rozmiarze , gdzie szerokość i wysokość są liczbą naturalną.
- Dane wejściowe mogą być w dowolnym rozsądnym formacie, zgodnie z zasadami PPCG
- Dane wejściowe zawsze będą kwadratowe
- W przykładach użyłem 1 i 0, ale możesz użyć dowolnych wartości prawdziwości lub fałszowania (takich jak
Why yes, sir, that is indeed the case
iWhy no, sir, that is not the case
)
Ponieważ jest to kod-golf , wygrywa najkrótszy kod!
{(x, y, v)}
zev
w[., Q]
być prawidłowy format wejściowy?(0, 0, Q), (0, 1, .), (1, 0, Q), (1, 1, .)
byłby trzecim przypadkiem testowym.Odpowiedzi:
Ślimaki , 14 bajtów
Wypróbuj online!
Nie ma to jak język dopasowania wzoru 2D dla problemu decyzyjnego 2D. :)
Wyjaśnienie
&
W pierwszym wierszu jest opcja Tryb mecz, który wymaga wzorzec w drugim wierszu, aby dopasować z każdej możliwej pozycji w wejściu. W takim przypadku program drukuje1
, w przeciwnym razie drukuje0
.Jeśli chodzi o sam wzorzec, zwróć uwagę, że
)
na końcu jest niejawny .Dlaczego to działa najłatwiej zobaczyć, zaczynając od negatywnego spojrzenia w przyszłość: upewniając się, że nie ma
Q
linii prostej od drugiejQ
, którą już znaleźliśmy, upewniamy się, że nie ma więcej niż N królowych (w przeciwnym razie byłoby być dwiema w jednym rzędzie i nie byłoby możliwe znalezienie tych królowych bez znalezienia innej). Następnie pierwsza część, upewniając się, że królowa jest osiągalna w ortogonalnym kierunku z dowolnej pozycji, upewnia się, że są dokładnie N królowych. Gdyby jednego brakowało, byłby rząd i kolumna bez królowej. Zaczynając od ich skrzyżowania, nie byłoby możliwe znalezienie królowej, idąc tylko w kierunku ortogonalnym.źródło
Galaretka , 17 lub 15 bajtów
Wypróbuj online!
Używa
‘
królowej i¹
pustej przestrzeni. (Jest to głównie konsekwencja zakazu pobierania danych wejściowych jako tablicy, ponieważ wymusza to, aby dane wejściowe były łańcuchami; konwersja ciągów na liczby całkowite jest trudna w Jelly, przy czym najłatwiejszą metodą jest ocena, i okazuje się, że zamiast 1 i 0, używając „dodaj 1” (‘
) i „dodaj 0” (¹
) pozwala pominąć kilka instrukcji sumowania i mapowania, ponieważ możemy policzyć królowe na liście, oceniając je.) Wartości true i falsey są normalne dla Jelly1
i0
.EDYCJA: Pytanie zostało zmienione, odkąd napisałem tę odpowiedź, aby umożliwić przyjmowanie danych wejściowych jako matrycy. Pozwala to upuścić wiodące
Ỵµ
, oszczędzając 2 bajty. Prawdopodobnie pozwala to również zmienić format wejściowy na bardziej normalny, wykorzystującS
raczej sumowanie niżV
ocenę, ale nie sądzę, że to oszczędza bajty i podobał mi się ten funky format.Wyjaśnienie
Zatem podstawową ideą jest zapewnienie, że na każdej antydiagonalnej, przekątnej i kolumnie znajduje się najwyżej jedna królowa; i dokładnie jedna królowa w każdym rzędzie. Te warunki są razem wystarczające, aby na każdej z czterech rodzajów linii była najwyżej jedna królowa i liczba królowych równa długości boku planszy.
Nawiasem mówiąc, galaretka prawdopodobnie mogłaby zrobić z wbudowanym w antydiagonale, ale AFAICT wydaje się, że nie ma takiego, więc muszę zadowolić się odbiciem planszy, a następnie wzięciem przekątnych.
Inną interesującą uwagą jest to, że zmiana
=1Ṃ
naE
(wszystkie równe) daje uogólniony moduł sprawdzania n- kwadratów, który akceptuje również tablicę n × n, w której każdy rząd, kolumna, przekątna i antypoślizgowa zawiera nie więcej niż k królowych, a tablica zawiera dokładnie kn królowe. Ograniczenie k do równego 1 faktycznie kosztuje dwa bajty.źródło
Oktawa,
5770675152 bajtówZaoszczędzono 1 bajt
flip
zamiastrot90
podziękowań dla @LuisMendo, ale znaleziono błąd w przypadku 1x1Pobiera dane wejściowe jako macierz binarną, gdzie 1 oznacza Królową, a 0 reprezentuje pustą przestrzeń.
Tworzy anonimową funkcję, która najpierw łączy macierz wejściową i jej transpozycję.
spdiags
tworzy macierz z taką samą liczbą wierszy jak argument, z przekątnymi zamienionymi w kolumny (w razie potrzeby uzupełnionymi zerami), więc połączspdiags
macierz wejściową, aby uzyskać przekątne ispdiags
uzupełnionymi zerami matrycę obróconą w poziomie, aby uzyskać antydiagonale.Teraz weź sumę każdej kolumny skonkatowanej macierzy i upewnij się, że każda kolumna ma dokładnie 1.
Próbka uruchomiona na ideone .
źródło
flip
zamiastrot90
all()
?MATL ,
3834 bajtów4 bajty wyłączone dzięki @beaker !
Dane wejściowe to tablica 2D zer i jedynek, wykorzystująca średniki jako separatory wierszy.
To powoduje, że wektor kolumnowy z nich jest prawdziwy, a wektor kolumnowy zawiera co najmniej jedno zero jako fałsz.
Wypróbuj online! Kod stopki to
if
gałąź służąca do wykazania prawdziwości lub fałszu.Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
jot , 37 bajtów
Anonimowy ciąg funkcji, który jako argument przyjmuje macierz boolowską.
Wypróbuj online!
(
+/
suma&
z,
gmatwaninie=
równa#
się zgadzają wierszy)
*
i (razy razy)1
jeden=
równa[:
się>./
maksimum+/
sumy/.
po przekątnej,
i (lit. catenated to)+/
sumy/.
ukośnie&
w|.
odwrotnej,
i+/
sumy w poprzek,
i+/
kwoty&
z|:
transpozycjąźródło
SnakeEx , 67 bajtów
Używa
_
zamiast.
na wejściu. Zwraca 1 lub więcej dopasowań dla prawdy, 0 dopasowań dla falsey. Tłumacz online znajduje się pod linkiem w nagłówku.Wyjaśnienie
SnakeEx to język z wyzwania 2-D Pattern Matching . Definiuje „węże”, które poruszają się po siatce, dopasowując rzeczy. Węże mogą odradzać inne węże, dzięki czemu język jest dość mocny.
Spójrzmy na ten program od podstaw.
Definiuje węża,
n
który pasuje do 1 lub więcej znaków podkreślenia, a następnie do krawędzi siatki. Pamiętaj, że może to być jeden z 8 głównych kierunków - kierunek jest ustalany, kiedy wąż się odradza.Podobnie jak
n
powyżej, definiuje się toq
jako węża, który pasuje do dowolnej liczby znaków podkreślenia, jednegoQ
, dowolnej liczby znaków podkreślenia i krawędzi siatki. Innymi słowy, wiersz / kolumna / przekątna, która ma tylko jedną królową.e
jest wężem, który pasuje do jednej postaci i krawędzi siatki.Główny wąż
m
wykorzystuje te klocki do sprawdzania całej planszy. Pod względem koncepcyjnym biegnie wokół zewnętrznych krawędzi siatki, spawnując inne węże, aby sprawdzić, czy wszystkie kolumny i rzędy mają dokładnie jedną królową, a wszystkie przekątne mają co najwyżej jedną królową. Jeśli którykolwiek ze spawnowanych węży się nie zgadza, całe dopasowanie kończy się niepowodzeniem. Rozwalmy to.( )%{4}
uruchamia to, co jest w nawiasach 4 razy, raz dla każdej strony. (W dalszej części pomocne jest zobrazowanie konkretnej strony - powiedzmy, górnej krawędzi siatki, zaczynając od lewego górnego rogu i przesuwając się w prawo.){q<>}
spawnujeq
węża w tym samym kierunku, w którym porusza się główny wąż. To weryfikuje, czy bieżąca krawędź spełnia zasadę „dokładnie jednej królowej”. Zauważ, że odrodzone węże nie poruszają wskaźnikiem dopasowania głównego węża, więc wciąż jesteśmy na początku krawędzi.( )*
dopasowuje 0 lub więcej elementów znajdujących się w nawiasach.{q<R>}
spawnujeq
węża obróconego w prawo od głównego węża. (Np. Jeśli główny wąż porusza się w prawo wzdłuż górnej krawędzi, ten wąż porusza się w dół.) Sprawdza każdą kolumnę / wiersz.[ ]
pasuje do jednej z opcji w nawiasach:{q<RF>}
spawnujeq
węża obróconego o 45 stopni w prawo (tj.R
doF
przodu i do przodu) od kierunku głównego węża.q
Węża pasuje jeśli przekątna zawiera dokładnie jedną królową.{n<RF>}
n
zamiast tego spawnuje węża.n
Węża pasuje jeśli przekątna zawiera żadnych królowych..
dopasowuje dowolny znak, przesuwając wskaźnik dopasowania do przodu.{e<>}
.<R>
obraca głównego węża w prawo, gotowy do dopasowania do następnej krawędzi.Dziwne rzeczy
X
(gałąź we wszystkich kierunkach po przekątnej) zamiastRF
. Niestety tłumacz online stwierdził, że to błąd składniowy. Próbowałem też*
(oddział we wszystkich kierunkach), ale to zawiesiło tłumacza._*Q?_*$
powinno działać w celu dopasowania „najwyżej jednej królowej” na przekątnych, ale to także zawiesiło tłumacza. Domyślam się, że możliwość pustych dopasowań powoduje problemy.źródło
Rubinowy, 120 bajtów
Funkcja Lambda oparta na oryginalnej specyfikacji, która wymagała wprowadzenia jako łańcucha.
konwertuje liczby Q na liczby zespolone i odejmuje je od siebie. Jeśli różnica między współrzędnymi dwóch królowych jest pozioma, pionowa lub ukośna, podniesienie jej do czwartej potęgi da rzeczywistą liczbę, a układ będzie nieważny.
Niegolfowany w programie testowym
źródło
Python 3 ,
232200155 bajtówWypróbuj online!
-32 bajty dzięki @beaker zauważając zmianę specyfikacji wejściowej; Zmieniłem język z Python 3 na 2, dzięki czemu mogłem używać
input
danych wejściowych jako tablicy ciągów lub tablicy tablic znaków.-45 bajtów dzięki @Leaky Nun
źródło
JavaScript (ES6), 115 bajtów
Nie golfowany:
źródło
Rubin, 155 bajtów
To jest okropne do przeczytania, więc poniżej mam nieco mniej golfową wersję
To jest ten sam kod, ale z kilkoma nowymi wierszami, aby rozróżnić, co się dzieje.
Sam kod jest anonimową funkcją lambda, która pobiera tablicę łańcuchów (
x
) w formacie["..Q", "Q..", ".Q."]
.Pierwszy wiersz odwzorowuje każdy ciąg na indeks znaku Q w tym ciągu. Jeśli nie ma znaku Q, jest on zastępowany -2 1 . Ta nowa tablica indeksów jest przypisana do zmiennej
y
.Następny wiersz zamyka tę tablicę indeksów, przesuwając ją o jeden (obrócony). Daje to tablicę par następujących po sobie wskaźników.
Kolejna linia jest szczególnie skomplikowana. Przechodzi przez każdą z par indeksów i odejmuje mniejszą od większej. Jeśli jest to 1 (i nie jesteśmy przy ostatniej parze 2 ), to są dwie królowe, które są na tej samej przekątnej i wstawiana jest wartość -2, w przeciwnym razie wstawiany jest oryginalny indeks królowej w ciągu .
Ostatni wiersz sumuje wszystkie indeksy dla każdego i sprawdza, czy jest to numer trójkąta dla n-1, gdzie n jest szerokością (lub wysokością) kwadratu.
1: -1 byłoby moim celem, ale jest to 1 oprócz 0, więc popsułoby się sprawdzanie przekątnych. Negatywność jest ważna, aby błędna była ostateczna suma. Myślałem o dużej liczbie (z pojedynczymi cyframi), takiej jak 9, ale nie jestem pewien, czy nie spowoduje to niepoprawnej weryfikacji.
2: Plansza się nie zawija, podczas gdy
rotate
funkcja tablicy Ruby ma tę funkcję, a jeśli ostatnia para różni się o jedną, nie ma to znaczenia - to nie jest przekątna.źródło
PHP,
137143 bajtówzainspirowany rozwiązaniem Neila
pobiera dane wejściowe z argumentu pierwszego wiersza poleceń; biegać z
-r
. Wymaga podziału wiersza na jeden bajt.Właściwie możesz użyć dowolnego znaku, z wyjątkiem
0
podziału linii.wypisuje true (
1
) lub false (pusty ciąg).awaria
źródło
Python 3 ,
185176175172171 bajtówAnonimowa funkcja pobierająca listę ciągów jako dane wejściowe.
Python 2 , 175 bajtów
źródło