Si vous ne savez pas ce qu'est une reine aux échecs, peu importe; c'est juste un nom :)
Votre entrée sera un carré de largeur et de hauteur arbitraires contenant une certaine quantité de reines. La carte d'entrée ressemblera à ceci (cette carte a une largeur et une hauteur de 8):
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
Il y a 8 reines sur ce tableau. S'il y avait, disons, 7, 1 ou 10 ici, le tableau ne serait pas valide.
Ici, nous utilisons un .
pour un espace vide et un Q
pour une reine. Vous pouvez également utiliser à la place n'importe quel caractère non blanc.
Cette entrée peut être vérifiée comme valide et vous devez imprimer (ou renvoyer) une valeur véridique (si elle n'était pas valide, vous devez imprimer (ou renvoyer) une valeur falsifiée). Elle est valable car aucune reine n'est dans la même ligne, colonne, diagonale ou anti-diagonale qu'une autre .
Exemples (ne pas afficher les éléments entre parenthèses):
...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)
Permettez-moi de souligner qu'une entrée n'est valide que si aucune reine n'est dans la même ligne, colonne, diagonale ou anti-diagonale qu'une autre .
Règles
- Vous ne recevrez jamais une entrée vide
- Si l'entrée contient moins de reines que la racine carrée de la zone du tableau, elle n'est pas valide.
- Notez qu'il n'y a pas de solutions valides pour une carte 2x2 ou 3x3, mais il existe une solution pour toutes les autres cartes carrées de taille , où la largeur et la hauteur sont un nombre naturel.
- L'entrée peut être dans n'importe quel format raisonnable, selon les règles PPCG
- L'entrée sera toujours un sqaure
- J'ai utilisé 1 et 0 dans les exemples, mais vous pouvez utiliser n'importe quelle valeur vraie ou fausse (comme
Why yes, sir, that is indeed the case
etWhy no, sir, that is not the case
)
Comme il s'agit de code-golf , le code le plus court gagne!
{(x, y, v)}
avecv
en[., Q]
être un format d'entrée valide?(0, 0, Q), (0, 1, .), (1, 0, Q), (1, 1, .)
serait le troisième cas de test.Réponses:
Escargots , 14 octets
Essayez-le en ligne!
Rien de tel qu'un langage de correspondance de motifs 2D pour un problème de décision 2D. :)
Explication
Le
&
sur la première ligne est une option de mode de correspondance qui nécessite que le motif sur la deuxième ligne corresponde à toutes les positions possibles dans l'entrée. Si tel est le cas, le programme s'imprime1
, sinon il s'imprime0
.Quant au motif lui-même, notez qu'il y a un implicite
)
à la fin.Il est plus facile de comprendre pourquoi cela fonctionne en partant de l'anticipation négative: en veillant à ce qu'il n'y en ait pas
Q
en ligne droite par rapport à l'autre queQ
nous avons déjà trouvé, nous nous assurons qu'il n'y a pas plus de N reines (sinon, il y aurait être deux dans une rangée, et il ne serait pas possible de trouver ces reines sans en trouver une autre). Ensuite, la première partie, en s'assurant qu'il y a une reine accessible dans une direction orthogonale à partir de n'importe quelle position, s'assure qu'il y a exactement N reines. S'il en manquait un, il y aurait une rangée et une colonne sans reine. À partir de l'intersection de celles-ci, il ne serait pas possible de trouver une reine en allant uniquement dans une direction orthogonale.la source
Gelée , 17 ou 15 octets
Essayez-le en ligne!
Utilise
‘
une reine et¹
un espace vide. (C'est principalement une conséquence de l'interdiction de prendre l'entrée en tant que tableau, car elle force l'entrée à être des chaînes; la conversion de chaînes en entiers est difficile dans Jelly, la méthode la plus simple étant l'évaluation, et il s'avère qu'au lieu de 1 et 0, en utilisant "add 1" (‘
) et "add 0" (¹
) permettent d'omettre plusieurs instructions de somme et de carte, car nous pouvons compter les reines dans une liste en l'évaluant.) Les valeurs truey et falsey sont normales de Jelly1
et0
.EDIT: La question a été modifiée depuis que j'ai écrit cette réponse pour permettre de prendre l'entrée comme une matrice. Cela permet de supprimer le début
Ỵµ
, économisant 2 octets. Il permet également probablement de changer le format d'entrée en quelque chose de plus normal, en utilisantS
pour additionner plutôt queV
pour évaluer, mais je ne pense pas que cela économise des octets et j'aime un peu ce format génial.Explication
L'idée de base est donc de s'assurer qu'il y a au plus une reine sur chaque antidiagonale, diagonale et colonne; et exactement une reine sur chaque rangée. Ces conditions sont suffisamment réunies pour exiger qu'il y ait au plus une reine sur chacun des quatre types de ligne, et un nombre de reines égal à la longueur du côté de la planche.
Soit dit en passant, Jelly pourrait probablement faire avec un intégré pour les antidiagonales, mais AFAICT il ne semble pas en avoir, donc je dois me contenter de réfléchir la planche et de prendre ensuite les diagonales.
Une autre note intéressante est que le passage
=1Ṃ
àE
(tous égaux) donne un vérificateur de n -queens généralisé , qui acceptera également un tableau n × n où chaque ligne, colonne, diagonale et antidiagonale ne contient pas plus de k reines, et le tableau contient exactement kn reines. Restreindre k à 1 équivaut en fait à deux octets.la source
Octave,
5770675152 octetsEnregistré 1 octet en utilisant
flip
au lieu derot90
grâce à @LuisMendo, mais a trouvé un bug sur le cas 1x1Prend l'entrée comme une matrice binaire avec 1 représentant une reine et 0 représentant un espace vide.
Crée une fonction anonyme qui concatène d'abord la matrice d'entrée et sa transposition.
spdiags
crée une matrice avec le même nombre de lignes que l'argument, avec les diagonales transformées en colonnes (complétées par un zéro si nécessaire), donc concaténezspdiags
la matrice d'entrée pour obtenir les diagonales etspdiags
la matrice inversée horizontalement pour obtenir les antidiagonales.Prenez maintenant la somme de chaque colonne de la matrice concaténée et assurez-vous que chaque colonne est exactement 1.
Exemple de run sur ideone .
la source
flip
place derot90
all()
?MATL ,
3834 octets4 octets de moins grâce à @beaker !
L'entrée est un tableau 2D de zéros et de uns, utilisant des points-virgules comme séparateurs de lignes.
Cela produit un vecteur de colonne de uns comme véridique, et un vecteur de colonne contenant au moins un zéro comme fausse.
Essayez-le en ligne! Le code de pied de page est une
if
branche pour démontrer la véracité ou la fausseté.Ou vérifiez tous les cas de test .
Explication
la source
J , 37 octets
Train de fonctions anonyme qui prend comme argument la matrice booléenne.
Essayez-le en ligne!
(
+/
la somme&
du,
ravel=
est égale#
au décompte des rangées)
*
et (lit. fois)1
on=
est égal[:
au>./
maximum de+/
les sommes en/.
diagonale,
et (lit. caténalisé à)+/
les sommes en/.
diagonale&
de|.
l'inverse,
et+/
les sommes à travers,
et+/
les sommes&
de|:
la transpositionla source
SnakeEx , 67 octets
Utilise
_
à la place de.
dans l'entrée. Renvoie 1 correspondance ou plus pour véridique, 0 correspondance pour falsey. Vous pouvez trouver un interprète en ligne sur le lien dans l'en-tête.Explication
SnakeEx est un langage du défi de correspondance de motifs 2-D . Il définit des "serpents" qui se déplacent autour des trucs correspondant à la grille. Les serpents peuvent engendrer d'autres serpents, ce qui rend le langage assez puissant.
Regardons ce programme de bas en haut.
Cela définit un serpent
n
qui correspond à un ou plusieurs traits de soulignement, puis au bord de la grille. Notez que cela peut être dans l'une des 8 directions cardinales - la direction est déterminée lorsque le serpent apparaît.Similaire à
n
ci-dessus, cela définitq
comme un serpent qui correspond à n'importe quel nombre de traits de soulignement, un seulQ
, n'importe quel nombre de traits de soulignement et le bord de la grille. En d'autres termes, une ligne / colonne / diagonale qui n'a qu'une seule reine.e
est un serpent qui correspond à un caractère et au bord de la grille.Le serpent principal
m
utilise ces blocs de construction pour vérifier l'ensemble du plateau. Conceptuellement, il court sur les bords extérieurs de la grille, engendrant d'autres serpents pour vérifier que toutes les colonnes et lignes ont exactement une reine et que toutes les diagonales ont au plus une reine. Si l'un des serpents engendrés ne correspond pas, la correspondance entière échoue. Décomposons-le.( )%{4}
exécute ce qui est à l'intérieur des parenthèses 4 fois, une fois de chaque côté. (Dans ce qui suit, il est utile d'imaginer un côté particulier - disons, le bord supérieur de la grille, en partant du coin supérieur gauche et en se déplaçant vers la droite.){q<>}
engendre unq
serpent dans la même direction que le serpent principal se déplace. Cela vérifie que le bord actuel répond à la règle "exactement une reine". Notez que les serpents engendrés ne déplacent pas le pointeur de correspondance du serpent principal, nous sommes donc toujours au début du bord.( )*
correspond à 0 ou plus de ce qui est à l'intérieur des parenthèses.{q<R>}
engendre unq
serpent tourné vers la droite de la direction du serpent principal. (Par exemple, si le serpent principal se déplace vers la droite le long du bord supérieur, ce serpent se déplace vers le bas.) Ceci vérifie chaque colonne / ligne.[ ]
correspond à l'une des options à l'intérieur des crochets:{q<RF>}
engendre unq
serpent tourné à 45 degrés vers la droite (c'est-à-dire vers la droiteR
et vers l'F
or) à partir de la direction du serpent principal. Leq
serpent correspond si la diagonale contient exactement une reine.{n<RF>}
engendre unn
serpent à la place. Len
serpent correspond si la diagonale ne contient pas de reines..
correspond à n'importe quel caractère, déplaçant le pointeur de correspondance vers l'avant.{e<>}
.<R>
tourne le serpent principal à droite, prêt à correspondre au bord suivant.Trucs bizarres
X
(branche dans toutes les directions diagonales) à la place deRF
. Malheureusement, l'interprète en ligne a déclaré qu'il s'agissait d'une erreur de syntaxe. J'ai aussi essayé*
(branchement dans toutes les directions), mais ça a suspendu l'interprète._*Q?_*$
devrait fonctionner pour faire correspondre "au plus une reine" dans les diagonales, mais cela a également suspendu l'interprète. Je suppose que la possibilité de correspondances vides pose des problèmes.la source
Rubis, 120 octets
Fonction Lambda basée sur la spécification d'origine qui nécessitait une entrée sous forme de chaîne.
convertit les Q en nombres complexes et les soustrait les uns des autres. Si la différence entre les coordonnées de deux reines est horizontale, verticale ou diagonale, l'élever à la 4e puissance donnera un nombre réel et l'arrangement n'est pas valide.
Non testé dans le programme de test
la source
Python 3 ,
232200155 octetsEssayez-le en ligne!
-32 octets grâce à @beaker constatant un changement dans les spécifications d'entrée; J'ai changé la langue de Python 3 en 2, ce qui me permet d'utiliser
input
entrée comme un tableau de chaînes ou un tableau de tableaux de caractères.-45 octets grâce à @Leaky Nun
la source
JavaScript (ES6), 115 octets
Non golfé:
la source
Rubis, 155 octets
C'est horrible à lire, j'ai donc une version un peu moins golfée ci-dessous
C'est le même code, mais avec quelques nouvelles lignes pour séparer ce qui se passe.
Le code tself est une fonction lambda anonyme qui prend un tableau de chaînes (
x
) au format["..Q", "Q..", ".Q."]
.La première ligne mappe chaque chaîne à l'index du caractère Q dans cette chaîne. S'il n'y a pas de caractère Q, il est remplacé par -2 1 . Ce nouveau tableau d'indices est affecté à la variable
y
.La ligne suivante zippe ce tableau d'index avec lui-même décalé d'un (pivoté). Il en résulte un tableau de paires d'indices consécutifs.
La ligne suivante est particulièrement compliquée. Il passe par chacune des paires d'indices et soustrait le plus petit du plus grand. Si c'est 1 (et nous ne sommes pas à la dernière paire 2 ), alors il y a deux reines qui sont sur la même diagonale, et une valeur de -2 est insérée, sinon l'index original de la reine dans la chaîne est inséré .
La dernière ligne résume tous les index de chacun et vérifie s'il s'agit du numéro du triangle pour n-1, où n est la largeur (ou la hauteur) du carré.
1: -1 aurait été mon choix, mais c'est 1 en dehors de 0, donc je jouerais avec la vérification des diagonales. Son caractère négatif est important pour que la somme finale soit fausse. J'ai pensé à un nombre élevé (avec un seul chiffre) comme 9, mais je ne peux pas être sûr que cela n'entraînera pas une vérification incorrecte.
2: La carte ne s'enroule pas, contrairement à la
rotate
fonction de tableau de ruby , et si la dernière paire est différente d'une unité, cela n'a pas d'importance - ce n'est pas une diagonale.la source
PHP,
137143 octetsinspiré par solution de Neil
prend l'entrée du premier argument de ligne de commande; courir avec
-r
. Nécessite des sauts de ligne à un octet.En fait, vous pouvez utiliser n'importe quel caractère sauf
0
pour le saut de ligne.affiche vrai (
1
) ou faux (chaîne vide).panne
la source
Python 3 ,
185176175 175172171 octetsUne fonction anonyme prenant une liste de chaînes en entrée.
Python 2 , 175 octets
la source