Wenn Sie nicht wissen, was eine Königin im Schach ist, spielt es keine Rolle. Es ist nur ein Name :)
Ihre Eingabe wird ein Quadrat von beliebiger Breite und Höhe sein, das eine gewisse Anzahl von Königinnen enthält. Die Eingabekarte sieht folgendermaßen aus (diese Karte hat eine Breite und Höhe von 8):
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
Es gibt 8 Königinnen auf diesem Brett. Wenn es hier zum Beispiel 7 oder 1 oder 10 gäbe, wäre die Tafel nicht gültig.
Hier verwenden wir a .
für einen leeren Raum und a Q
für eine Königin. Alternativ können Sie auch ein beliebiges Nicht-Leerzeichen verwenden.
Diese Eingabe kann als gültig überprüft werden, und Sie sollten einen Wahrheitswert ausgeben (oder zurückgeben) (falls sie nicht gültig ist, sollten Sie einen falschen Wert ausgeben (oder zurückgeben)). Es ist gültig, weil sich keine Dame in derselben Zeile, Spalte, Diagonale oder Antidiagonale wie eine andere befindet .
Beispiele (Dinge nicht in Klammern ausgeben):
...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)
Lassen Sie mich betonen, dass eine Eingabe nur gültig ist, wenn sich keine Dame in derselben Zeile, Spalte, Diagonale oder Antidiagonale wie eine andere befindet .
Regeln
- Sie werden niemals eine leere Eingabe erhalten
- Wenn die Eingabe weniger Damen als die Quadratwurzel des Bereichs der Tafel enthält, ist sie ungültig.
- Beachten Sie, dass es keine gültigen Lösungen für eine 2x2- oder 3x3-Platine gibt. Es gibt jedoch eine Lösung für jede andere quadratische Platinengröße, bei der Breite und Höhe eine natürliche Zahl sind.
- Die Eingabe kann in einem angemessenen Format gemäß den PPCG-Regeln erfolgen
- Die Eingabe wird immer ein Quadrat sein
- Ich habe in den Beispielen 1 und 0 verwendet, aber Sie können alle wahrheitsgemäßen oder falschen Werte (wie
Why yes, sir, that is indeed the case
undWhy no, sir, that is not the case
) verwenden.
Da dies Codegolf ist , gewinnt der kürzeste Code!
{(x, y, v)}
mitv
in[., Q]
ein gültiges Eingabeformat?(0, 0, Q), (0, 1, .), (1, 0, Q), (1, 1, .)
wäre der dritte Testfall.Antworten:
Schnecken , 14 Bytes
Probieren Sie es online!
Nichts geht über eine 2D-Pattern-Matching-Sprache für ein 2D-Entscheidungsproblem. :)
Erläuterung
Bei
&
der Option in der ersten Zeile handelt es sich um einen Übereinstimmungsmodus, bei dem das Muster in der zweiten Zeile von jeder möglichen Position in der Eingabe aus übereinstimmen muss. In diesem Fall wird das Programm gedruckt1
, andernfalls wird es gedruckt0
.Beachten Sie, dass für das Muster selbst
)
am Ende ein Implizit steht.Warum dies funktioniert, ist am einfachsten zu erkennen, wenn Sie vom negativen Lookahead ausgehen: Wenn Sie sicherstellen, dass keine
Q
Gerade zu derQ
bereits gefundenen Linie gehört , stellen Sie sicher, dass nicht mehr als N Königinnen vorhanden sind (andernfalls wäre dies der Fall) zwei in einer Reihe zu sein, und es wäre nicht möglich, diese Königinnen zu finden, ohne eine andere zu finden). Dann stellt der erste Teil sicher, dass es eine Königin gibt, die in einer orthogonalen Richtung von jeder Position aus erreichbar ist, dass es genau N Königinnen gibt. Wenn einer fehlen würde, gäbe es eine Reihe und eine Spalte ohne eine Königin. Ausgehend von deren Schnittpunkt wäre es nicht möglich, eine Königin nur in orthogonaler Richtung zu finden.quelle
Gelee , 17 oder 15 Bytes
Probieren Sie es online!
Verwendet
‘
für eine Königin und¹
für Leerzeichen. (Dies ist hauptsächlich eine Folge des Verbots, Eingaben als Array zu verwenden, da es die Eingabe zu Zeichenfolgen zwingt. Die Konvertierung von Zeichenfolgen in Ganzzahlen ist in Jelly schwierig, wobei die einfachste Methode die Auswertung ist 0 mit "add 1" (‘
) und "add 0" (¹
) ermöglichen das Weglassen mehrerer Summen- und Kartenanweisungen, da wir die Damen in einer Liste zählen können, indem wir sie auswerten.) Die Wahrheits- und Falschheitswerte sind Jellys normale1
und0
.BEARBEITEN: Die Frage wurde geändert, seit ich diese Antwort geschrieben habe, damit Eingaben als Matrix verwendet werden können. Dies ermöglicht das Löschen der führenden
Ỵµ
und spart 2 Bytes. Wahrscheinlich erlaubt es auch, das Eingabeformat auf etwas Normaleres zu ändern, indemS
man eher summiert alsV
auswertet, aber ich glaube nicht, dass dies Bytes spart, und ich mag dieses irre Format.Erläuterung
Die Grundidee ist also, dass wir sicherstellen, dass höchstens eine Dame auf jeder Antidiagonale, Diagonale und Säule steht. und genau eine Dame in jeder Reihe. Diese Bedingungen sind zusammen ausreichend, um zu erfordern, dass sich höchstens eine Dame auf jeder der vier Linienarten und eine der Seitenlänge des Brettes entsprechende Anzahl von Damen befindet.
Im Übrigen könnte Jelly wahrscheinlich ein eingebautes Gegenmittel gebrauchen, aber AFAICT scheint es nicht zu geben, also muss ich mich damit begnügen, das Brett zu reflektieren und dann die Diagonalen zu nehmen.
Eine weitere interessante Anmerkung ist, dass das Ändern
=1Ṃ
aufE
(alle gleich) einen verallgemeinerten n- Queens-Checker ergibt, der auch ein n × n- Board akzeptiert, bei dem jede Zeile, Spalte, Diagonale und Antidiagonale nicht mehr als k Queens enthält und das Board genau enthält kn Königinnen. Das Beschränken von k auf 1 kostet tatsächlich zwei Bytes.quelle
Oktave,
5770675152 Bytes1 Byte mit
flip
anstattrot90
dank @LuisMendo gespeichert, aber einen Fehler im 1x1-Fall gefundenÜbernimmt die Eingabe als binäre Matrix, wobei 1 für eine Dame und 0 für ein leeres Feld steht.
Erstellt eine anonyme Funktion, die zuerst die Eingabematrix und ihre Transponierung verkettet.
spdiags
Erstellt eine Matrix mit der gleichen Anzahl von Zeilen wie das Argument, wobei die Diagonalen in Spalten umgewandelt werden (nach Bedarf mit Nullen aufgefüllt). Verketten Sie alsospdiags
die Eingabematrix, um die Diagonalen zu erhalten, undspdiags
die Matrix horizontal, um die Antidiagonalen zu erhalten.Nehmen Sie nun die Summe jeder Spalte der verketteten Matrix und stellen Sie sicher, dass jede Spalte genau 1 ist.
Probelauf auf ideone .
quelle
flip
anstelle vonrot90
all()
?MATL ,
3834 Bytes4 Bytes weniger dank @beaker !
Die Eingabe ist ein 2D-Array aus Nullen und Einsen, wobei Semikolons als Zeilentrennzeichen verwendet werden.
Dies gibt einen Spaltenvektor von Eins als wahr und einen Spaltenvektor mit mindestens einer Null als falsch aus.
Probieren Sie es online! Der Footer-Code ist eine
if
Verzweigung, um Wahrhaftigkeit oder Falschheit zu demonstrieren.Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
J , 37 Bytes
Anonymer Funktionszug, der die Boolesche Matrix als Argument verwendet.
Probieren Sie es online!
(
+/
die Summe&
von,
Ravel=
gleich#
der tally der Zeilen)
*
und (lit. times)1
eins=
entspricht[:
dem>./
Maximum von+/
die Summen/.
diagonal,
und (wörtlich verkettet)+/
die Summen/.
diagonal&
von|.
der Rückseite,
und+/
die Summen über,
und+/
die Summen&
von|:
den transponierenquelle
SnakeEx , 67 Bytes
Verwendet
_
anstelle von.
in der Eingabe. Gibt 1 oder mehr Übereinstimmungen für die Wahrheit zurück, 0 Übereinstimmungen für Falsey. Einen Online-Dolmetscher finden Sie unter dem Link in der Kopfzeile.Erläuterung
SnakeEx ist eine Sprache aus der 2-D Pattern Matching Challenge . Es definiert "Schlangen", die sich um das Gitter bewegen, das zum Material passt. Schlangen können andere Schlangen hervorbringen, was die Sprache sehr mächtig macht.
Lassen Sie uns dieses Programm von unten nach oben betrachten.
Dies definiert eine Schlange
n
, die einem oder mehreren Unterstrichen und dann der Kante des Gitters entspricht. Beachten Sie, dass dies in eine der 8 Hauptrichtungen erfolgen kann - die Richtung wird bestimmt, wenn die Schlange erzeugt wird.Ähnlich wie
n
oben definiert diesq
eine Schlange, die mit einer beliebigen Anzahl von Unterstrichen, einer einzelnenQ
, einer beliebigen Anzahl von Unterstrichen und der Kante des Gitters übereinstimmt . Mit anderen Worten, eine Zeile / Spalte / Diagonale, die nur eine Dame enthält.e
ist eine Schlange, die einem Charakter und dem Rand des Gitters entspricht.Die Hauptschlange
m
benutzt diese Bausteine, um das gesamte Board zu überprüfen. Konzeptionell läuft es um die Außenkanten des Gitters herum und erzeugt andere Schlangen, um zu überprüfen, ob alle Spalten und Zeilen genau eine Dame haben und alle Diagonalen höchstens eine Dame. Wenn eine der hervorgebrachten Schlangen nicht übereinstimmt, schlägt die gesamte Übereinstimmung fehl. Lassen Sie es uns aufschlüsseln.( )%{4}
Führt den Inhalt der Klammern viermal aus, und zwar einmal für jede Seite. (Im Folgenden ist es hilfreich, sich eine bestimmte Seite vorzustellen, z. B. die obere Kante des Rasters, beginnend mit der linken oberen Ecke und nach rechts bewegend.){q<>}
erzeugt eineq
Schlange in der gleichen Richtung, in der sich die Hauptschlange bewegt. Dies stellt sicher, dass die aktuelle Flanke der Regel "genau eine Dame" entspricht. Beachten Sie, dass gespawnte Schlangen den Match-Zeiger der Hauptschlange nicht bewegen, sodass wir uns immer noch am Rand befinden.( )*
Stimmt mit 0 oder mehr der Angaben in Klammern überein.{q<R>}
erzeugt eineq
Schlange, die von der Richtung der Hauptschlange nach rechts gedreht ist. (Wenn sich die Hauptschlange z. B. am oberen Rand nach rechts bewegt, bewegt sich diese Schlange nach unten.) Dies überprüft jede Spalte / Zeile.[ ]
Entspricht einer der Optionen in den Klammern:{q<RF>}
erzeugt eineq
Schlange, die um 45 Grad nach rechts (dh nachR
rechts und nachF
rechts) von der Richtung der Hauptschlange gedreht ist. Dieq
Schlange passt, wenn die Diagonale genau eine Dame enthält.{n<RF>}
bringtn
stattdessen eine Schlange hervor. Dien
Schlange passt, wenn die Diagonale keine Königinnen enthält..
Stimmt mit einem beliebigen Zeichen überein, wobei der Übereinstimmungszeiger nach vorne bewegt wird.{e<>}
.<R>
die Hauptschlange nach rechts gedreht, um mit der nächsten Kante übereinzustimmen.Komisches Zeug
X
(in alle diagonalen Richtungen zu verzweigen), anstelle vonRF
. Leider hat der Online-Interpreter einen Syntaxfehler gemeldet. Ich habe auch versucht*
(in alle Richtungen abzweigen), aber das hat den Dolmetscher aufgehängt._*Q?_*$
funktionieren, um "höchstens eine Königin" in den Diagonalen zu finden, aber das hat auch den Dolmetscher aufgehängt. Ich vermute, dass die Möglichkeit leerer Übereinstimmungen Probleme verursacht.quelle
Ruby, 120 Bytes
Die Lambda-Funktion basiert auf der ursprünglichen Spezifikation, für die eine Eingabe als Zeichenfolge erforderlich war.
wandelt die Qs in komplexe Zahlen um und subtrahiert sie voneinander. Wenn der Unterschied zwischen den Koordinaten von zwei Königinnen horizontal, vertikal oder diagonal ist, ergibt das Erhöhen auf die 4. Potenz eine reelle Zahl und die Anordnung ist ungültig.
Ungolfed im Testprogramm
quelle
Python 3 ,
232200155 BytesProbieren Sie es online!
-32 Bytes dank @beaker, der eine Änderung der Eingangsspezifikationen bemerkt; Ich habe die Sprache von Python 3 auf 2 geändert, sodass ich sie verwenden kann
input
Eingaben als Array von Zeichenfolgen oder als Array von Zeichenarrays verwenden kann.-45 Bytes dank @Leaky Nun
quelle
JavaScript (ES6), 115 Byte
Ungolfed:
quelle
Ruby, 155 Bytes
Das ist schrecklich zu lesen, deshalb habe ich unten eine etwas weniger golfene Version
Dies ist derselbe Code, aber mit einigen Zeilenumbrüchen, um herauszufinden, was passiert.
Der Code selbst ist eine anonyme Lambda-Funktion, die ein Array von Strings (
x
) im Format annimmt["..Q", "Q..", ".Q."]
.Die erste Zeile ordnet jede Zeichenfolge dem Index des Q-Zeichens in dieser Zeichenfolge zu. Wenn es kein Q-Zeichen gibt, wird es durch -2 1 ersetzt . Dieses neue Array von Indizes wird der Variablen zugewiesen
y
.In der nächsten Zeile wird dieses Indexarray mit einem Versatz von eins (gedreht) gezippt. Dies führt zu einer Reihe von Paaren aufeinanderfolgender Indizes.
Die nächste Zeile ist besonders kompliziert. Es durchläuft jedes der Indexpaare und subtrahiert das kleinere vom größeren. Wenn dies 1 ist (und wir sind nicht beim letzten Paar 2) ), dann gibt es zwei Damen, die sich auf derselben Diagonale befinden, und ein Wert von -2 wird eingefügt, andernfalls wird der ursprüngliche Index der Dame in der Zeichenfolge eingefügt .
Die letzte Zeile fasst alle Indizes für jeden zusammen und prüft, ob es sich um die Dreieckszahl für n-1 handelt, wobei n die Breite (oder Höhe) des Quadrats ist.
1: -1 wäre mein Anliegen gewesen, aber es ist 1, abgesehen von 0, also würde ich mich mit dem Prüfen von Diagonalen herumschlagen. Die Negativität ist wichtig, um die Endsumme falsch zu machen. Ich habe über eine hohe Zahl (mit einzelnen Ziffern) wie 9 nachgedacht, kann jedoch nicht sicher sein, dass dies nicht zu einer falschen Bestätigung führt.
2: Das Board wickelt sich nicht um, wohingegen Rubys
rotate
Array-Funktion dies tut, und wenn sich das letzte Paar um eins unterscheidet, spielt es keine Rolle - das ist keine Diagonale.quelle
PHP,
137143 Bytesinspiriert von Neils Lösung
Nimmt Eingaben vom ersten Befehlszeilenargument entgegen; renn mit
-r
. Erfordert Einzelbyte-Zeilenumbrüche.Eigentlich kann man jedes Zeichen außer
0
für den Zeilenumbruch verwenden.Gibt true (
1
) oder false (leere Zeichenfolge) aus.Nervenzusammenbruch
quelle
Python 3 ,
185176175172171 BytesEine anonyme Funktion, die eine Liste von Zeichenfolgen als Eingabe verwendet.
Python 2 , 175 Bytes
quelle