(A pesar de más de 60 preguntas etiquetadas ajedrez , no tenemos un simple desafío n-reinas).
En ajedrez, el Rompecabezas N-Queens se describe de la siguiente manera: dado un n x n
tablero de ajedrez y n
reinas, coloque las reinas en el tablero de modo que no haya dos reinas amenazándose entre sí. A continuación se muestra una solución de ejemplo n = 8
, tomada de Wikipedia.
O, en la representación ASCII:
xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx
El desafío aquí será tomar la entrada n
y salida de una representación ASCII de una solución para el n
rompecabezas -Queens. Dado que hay más de una solución posible (por ejemplo, al menos, una rotación o reflexión), su código solo necesita generar una solución válida.
Entrada
Un solo entero positivo n
con n >= 4
cualquier formato conveniente . (n = 2 yn = 3 no tienen soluciones, y n = 1 es trivial, por lo que están excluidos)
Salida
La representación ASCII resultante de una solución para el rompecabezas N-reinas, como se describe anteriormente. Puede elegir dos valores ASCII distintos para representar espacios en blanco y reinas. Una vez más, esto se puede generar en cualquier formato adecuado (cadena única, una lista de cadenas, una matriz de caracteres, etc.).
Reglas
- Las nuevas líneas iniciales o finales o espacios en blanco son opcionales, así como los espacios en blanco entre caracteres, siempre que los caracteres se alineen correctamente.
- Puede usar un algoritmo para calcular las posibles posiciones, o usar el estilo explícito de solución de "escalón", el que sea más apropiado para su código.
- Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
- Si es posible, incluya un enlace a un entorno de prueba en línea para que otras personas puedan probar su código.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
Ejemplos
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
Respuestas:
MATL ,
333227 bytesPruébalo en línea!
Fuerza semi-bruta, enfoque no determinista:
La solución obtenida es aleatoria. Si vuelve a ejecutar el código, puede obtener una configuración válida diferente. El tiempo de ejecución también es aleatorio, pero el caso de prueba más largo (
n = 10
) termina en aproximadamente 30 segundos en TIO la mayor parte del tiempo.fuente
C, 114 bytes
Imprime directamente una solución en O (1) tiempo.
fuente
n/2
?n-=o=n%2;for(y=n+o;y--;)
lugar deo=n%2;n-=o;for(y=0;y<n+o;++y)
Mathematica, 103
108110117bytes-5 bytes para
DuplicateFreeQ
->E!=##&@@@
-7 bytes para
ReplacePart[Array[],]
->SparseArray[]
Devuelve una matriz 2D. Se necesitan 2.76s para calcular
f[6]
y 135s paraf[7]
. (En la versión actual, se-
convierte en0
yQ
para1
.El algoritmo es similar a la respuesta MATL pero aquí el código es completamente fuerza bruta.
fuente
C - 222 bytes
El código no es mío, sino de IOCCC . Espero no estar rompiendo ninguna regla. Además, esto muestra todas las soluciones para N entre 4 y 99. Trataré de obtener un enlace TIO más adelante.
fuente
Gelatina ,
2421 bytesPruébalo en línea!
Suponiendo que cada reina se coloque en filas separadas, solo necesitamos encontrar los índices de columna para colocar a cada reina para evitar conflictos, que se pueden encontrar generando una permutación aleatoria de
[1, 2, ..., n]
y probándola.Explicación
fuente
Œc€
lugar deœc€2
para -1?Python 3,
204189 bytesBúsqueda de fuerza bruta a través de todas las permutaciones. Podría eliminar el * e imprimir la lista de comprensiones, pero se ven horribles.
Salida:
Ligeramente incólume:
fuente
Befunge, 122 bytes
Pruébalo en línea!
Esto se basa más o menos en la solución C de orlp .
Explicación
Lea el número de reinas, q , de stdin y calcule dos variables para su uso posterior:
n = q - q%2
e inicie el buclehn = n/2
principal, iterando r , el número de fila, de q a 0, disminuyendo al inicio del bucle, por lo que el primer r es q menos 1.
Calcula el desplazamiento de la reina en cada fila con la siguiente fórmula:
Salida de caracteres de espacio compensado para sangrar la posición de la reina para la fila actual, más un espacio adicional solo porque facilita el bucle de salida.
Salida
Q
para la reina, seguido de una nueva línea para pasar a la siguiente fila.Pruebe si r es cero, en cuyo caso hemos llegado al final del tablero y podemos salir, de lo contrario, repetiremos el ciclo principal nuevamente.
fuente
Haskell , 145 bytes
El enfoque obvio de la fuerza bruta:
Pruébalo en línea!
fuente
Retina , 136 bytes
Pruébalo en línea! Puerto de la excelente respuesta C de @ orlp. Explicación:
Convierta a unario, usando espacios (hay un espacio después de
*
).Cree
N
filas conN
espacios, a;
, luego0..N-1
espacios, luego aQ
. Las etapas restantes se aplican a todas las filas.Entero dividido
N
por 2. (También envuelva el resultado:;
para facilitar el anclaje de los patrones).Si el índice del bucle es igual
N/2*2
, entonces deje tantos espacios.Si
N/2
es un múltiplo de 3, tome el doble del índice de bucle más uno, móduloN/2*2+1
.De lo contrario, tome el doble del índice de bucle
(N/2-1)
más un extra 3 en la mitad inferior del tablero, móduloN/2*2
.Realmente realice la operación de módulo.
fuente
Carbón , 44 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Otro puerto de la excelente respuesta C de @ orlp.
fuente
APL (Dyalog Unicode) , SBCS de 18 bytes
Programa completo que solicita
n
desde stdin. Imprime una solución separada por espacios en stdout usando·
para cuadrados vacíos y⍟
para Queens.Pruébalo en línea!
⎕CY'dfns'
C op y la biblioteca "dfns"⎕
obtener entrada de stdinqueens
encuentre todas las soluciones de Queens verdaderamente únicas (sin reflejos ni rotaciones)⊃
elige la primera soluciónfuente
J , 49 bytes
Pruébalo en línea!
Fuerza bruta probando todas las permutaciones de longitud n .
fuente