(Pomimo ponad 60 pytań oznaczonych jako szachy , nie mamy prostego wyzwania dla n-królowych.)
W szachach układanka N-Queens jest opisana w następujący sposób: Biorąc pod uwagę n x n
szachownicę i n
królowe, ułóż królowe na szachownicy, aby żadne dwie królowe nie zagrażały sobie nawzajem. Poniżej znajduje się przykładowe rozwiązanie n = 8
pożyczone z Wikipedii.
Lub w renderowaniu ASCII:
xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx
Wyzwaniem będzie przyjęcie n
i wyprowadzenie reprezentacji ASCII rozwiązania n
układanki -Queens. Ponieważ istnieje więcej niż jedno możliwe rozwiązanie (np. Przynajmniej obrót lub odbicie), twój kod musi tylko wygenerować dowolne prawidłowe rozwiązanie.
Wejście
Pojedyncza dodatnia n
ze n >= 4
w dowolnym, wygodnym formacie . (n = 2 i n = 3 nie mają rozwiązań, a n = 1 jest banalne, więc są wykluczone)
Wynik
Wynikowa reprezentacja ASCII rozwiązania układanki N-królowych, jak opisano powyżej. Możesz wybrać dowolne dwie różne wartości ASCII, które będą reprezentować puste spacje i królowe. Ponownie, można go wyprowadzić w dowolnym odpowiednim formacie (pojedynczy ciąg, lista ciągów, tablica znaków itp.).
Zasady
- Wiodące lub końcowe znaki nowej linii lub białe znaki są opcjonalne, a także białe znaki między znakami, o ile same znaki są poprawnie ustawione w linii.
- Możesz albo użyć algorytmu do obliczenia możliwych pozycji, albo użyć jawnego rozwiązania typu „krok po schodach”, w zależności od tego, który kod jest bardziej golfowy.
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
- Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
Przykłady
n=4
xQxx
xxxQ
Qxxx
xxQx
n=7
xxQxxxx
xxxxxxQ
xQxxxxx
xxxQxxx
xxxxxQx
Qxxxxxx
xxxxQxx
n=10
xxxxQxxxxx
xxxxxxxxxQ
xxxQxxxxxx
xxxxxxxxQx
xxQxxxxxxx
xxxxxxxQxx
xQxxxxxxxx
xxxxxxQxxx
Qxxxxxxxxx
xxxxxQxxxx
Odpowiedzi:
MATL ,
333227 bajtówWypróbuj online!
Półstabilna siła, podejście nie deterministyczne:
Uzyskane rozwiązanie jest losowe. Jeśli uruchomisz kod ponownie, możesz uzyskać inną prawidłową konfigurację. Czas działania jest również losowy, ale najdłuższy przypadek testowy (
n = 10
) kończy się w TIO przez około 30 sekund.źródło
C, 114 bajtów
Bezpośrednio drukuje rozwiązanie w czasie O (1).
źródło
n/2
?n-=o=n%2;for(y=n+o;y--;)
zamiasto=n%2;n-=o;for(y=0;y<n+o;++y)
Mathematica, 103
108110117bajty-5 bajtów dla
DuplicateFreeQ
->E!=##&@@@
-7 bajtów dla
ReplacePart[Array[],]
->SparseArray[]
Zwróć tablicę 2D. Obliczenie zajmuje 2,76s,
f[6]
a dla 135sf[7]
. (W aktualnej wersji,-
staje0
iQ
do1
.Algorytm jest podobny do odpowiedzi MATL, ale tutaj kod jest całkowicie brutalny.
źródło
C - 222 bajty
Kod nie jest mój, ale pochodzi z IOCCC . Mam nadzieję, że nie łamię żadnych zasad. Wyświetla również wszystkie rozwiązania dla N od 4 do 99. Później spróbuję uzyskać link TIO.
źródło
Galaretka ,
2421 bajtówWypróbuj online!
Zakładając, że każda królowa jest umieszczona w osobnych rzędach, musimy tylko znaleźć indeksy kolumn, aby umieścić każdą królową, aby uniknąć konfliktów, które można znaleźć, generując losową permutację
[1, 2, ..., n]
i testując ją.Wyjaśnienie
źródło
Œc€
zamiastœc€2
-1?Python 3,
204189 bajtówBrutalna siła przeszukuje wszystkie permutacje. Mógłbym usunąć * i wydrukować listę, ale wyglądają okropnie.
Wynik:
Nieznacznie nie golfista:
źródło
Befunge, 122 bajty
Wypróbuj online!
Jest to mniej więcej oparte na rozwiązaniu C firmy orlp .
Wyjaśnienie
Odczytaj liczbę królowych, q , od stdin i oblicz dwie zmienne do późniejszego użycia:
n = q - q%2
ihn = n/2
Uruchom główną pętlę, iterując r , liczbę wierszy, od q do 0, zmniejszając na początku pętli, więc pierwsze r to q minus 1.
Obliczyć przesunięcie królowej w każdym rzędzie za pomocą następującego wzoru:
Wyjściowe znaki spacji przesunięcia, aby wciąć pozycję królowej dla bieżącego wiersza, oraz dodatkowe miejsce tylko dlatego, że ułatwia to pętlę wyjściową.
Wyjście
Q
dla królowej, a następnie nowa linia, aby przejść do następnego rzędu.Sprawdź, czy r wynosi zero, w którym to przypadku dotarliśmy do końca planszy i możemy wyjść, w przeciwnym razie powtórzymy ponownie główną pętlę.
źródło
Haskell , 145 bajtów
Oczywiste podejście brutalnej siły:
Wypróbuj online!
źródło
Siatkówka , 136 bajtów
Wypróbuj online! Doskonała odpowiedź C dla portu @ orlp. Wyjaśnienie:
Konwertuj na unary, używając spacji (po spacji jest spacja
*
).Utwórz
N
wiersze zeN
spacjami, a;
następnie0..N-1
spacjami, a następnie aQ
. Pozostałe etapy dotyczą wszystkich rzędów.Liczba całkowita dzielona
N
przez 2. (Również zawiń wynik,:;
aby ułatwić zakotwiczenie wzorów).Jeśli indeks pętli jest równy
N/2*2
, po prostu zostaw tyle spacji.Jeśli
N/2
jest wielokrotnością 3, weź podwój indeks pętli plus jeden, moduloN/2*2+1
.W przeciwnym razie weź podwój indeks pętli plus
(N/2-1)
plus dodatkowe 3 w dolnej połowie planszy, moduloN/2*2
.Właściwie wykonaj operację modulo.
źródło
Węgiel drzewny , 44 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Kolejny port doskonałej odpowiedzi w języku C @ orlp.
źródło
APL (Dyalog Unicode) , 18 bajtów SBCS
Pełne monitowanie programu o
n
standardowe wejście. Drukuje rozdzielone spacjami rozwiązanie na standardowe wyjście, używając·
pustych kwadratów i⍟
królowych.Wypróbuj online!
⎕CY'dfns'
C op r W „dfns” biblioteka⎕
uzyskać dane wejściowe ze standardowego wejściaqueens
znajdź wszystkie naprawdę unikalne rozwiązania Queens (bez odbić i rotacji)⊃
wybierz pierwsze rozwiązanieźródło
J , 49 bajtów
Wypróbuj online!
Brutalna siła, testując wszystkie permutacje długości n .
źródło