(Apesar de mais de 60 perguntas marcadas como xadrez , não temos um desafio simples das n rainhas.)
No xadrez, o quebra-cabeça do N-Queens é descrito a seguir: Dado um n x n
tabuleiro de xadrez e n
rainhas, organize as rainhas no tabuleiro de xadrez para que não haja duas rainhas ameaçando uma à outra. Abaixo está um exemplo de solução para n = 8
, emprestado da Wikipedia.
Ou, na renderização ASCII:
xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx
O desafio aqui será receber n
e n
gerar uma representação ASCII de uma solução para o quebra-cabeça -Queens. Como há mais de uma solução possível (por exemplo, pelo menos, uma rotação ou reflexão), seu código só precisa gerar uma solução válida.
Entrada
Um número inteiro positivo único n
com n >= 4
em qualquer formato conveniente . (n = 2 en = 3 não têm soluções, e n = 1 é trivial, portanto essas são excluídas)
Resultado
A representação ASCII resultante de uma solução para o quebra-cabeça N-rainhas, conforme descrito acima. Você pode escolher dois valores ASCII distintos para representar espaços em branco e rainhas. Novamente, isso pode ser produzido em qualquer formato adequado (cadeia única, uma lista de cadeias, uma matriz de caracteres, etc.).
Regras
- Novas linhas à esquerda ou à direita ou espaços em branco são opcionais, bem como espaços em branco entre os caracteres, desde que os próprios caracteres estejam alinhados corretamente.
- Você pode usar um algoritmo para calcular as posições possíveis ou usar o estilo explícito de solução "degrau", o que for mais positivo para o seu código.
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
Exemplos
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
Respostas:
MATL ,
333227 bytesExperimente online!
Força semi-bruta, abordagem não determinística:
A solução obtida é aleatória. Se você executar o código novamente, poderá obter uma configuração válida diferente. O tempo de execução também é aleatório, mas o caso de teste mais longo (
n = 10
) termina em cerca de 30 segundos no TIO na maioria das vezes.fonte
C, 114 bytes
Imprime diretamente uma solução em O (1).
fonte
n/2
?n-=o=n%2;for(y=n+o;y--;)
vez 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[]
Retorne uma matriz 2D. Demora 2.76s para calcular
f[6]
e 135s paraf[7]
. (Na versão atual,-
torna-se0
- eQ
para1
.O algoritmo é semelhante à resposta MATL, mas aqui o código é de força bruta.
fonte
C - 222 bytes
O código não é meu, mas do IOCCC . Espero não estar quebrando nenhuma regra. Além disso, isso exibe todas as soluções para N entre 4 e 99. Tentarei obter um link TIO posteriormente.
fonte
Geléia ,
2421 bytesExperimente online!
Supondo que cada dama seja colocada em linhas separadas, precisamos apenas encontrar os índices da coluna para colocar cada dama para evitar conflitos, que podem ser encontrados gerando uma permutação aleatória de
[1, 2, ..., n]
e testando-a.Explicação
fonte
Œc€
vez deœc€2
-1?Python 3,
204189 bytesPesquisa de força bruta em todas as permutações. Eu poderia remover o * e imprimir as compreensões da lista, mas elas parecem horríveis.
Resultado:
Ligeiramente não destruído:
fonte
Anterior, 122 bytes
Experimente online!
Isso é mais ou menos baseado na solução C do orlp .
Explicação
Leia o número de rainhas, q , de stdin e calcule duas variáveis para uso posterior:,
n = q - q%2
ehn = n/2
Inicie o loop principal, iterando r , o número da linha, de q até 0, decrementando no início do loop, então o primeiro r é q menos 1.
Calcule o deslocamento da rainha em cada linha com a seguinte fórmula:
Caracteres de espaço de deslocamento de saída para recuar a posição da rainha para a linha atual, mais um espaço adicional apenas porque facilita o loop de saída.
Saída
Q
para a rainha, seguida por uma nova linha para passar para a próxima linha.Teste se r é zero; nesse caso, chegamos ao final do quadro e podemos sair, caso contrário, repetimos o loop principal novamente.
fonte
Haskell , 145 bytes
A abordagem óbvia da força bruta:
Experimente online!
fonte
Retina , 136 bytes
Experimente online! Excelente resposta C do porto da @ orlp. Explicação:
Converta em unário, usando espaços (existe um espaço após o
*
).Crie
N
linhas comN
espaços, a;
,0..N-1
espaços e, em seguida, aQ
. Os estágios restantes se aplicam a todas as linhas.Divida o número inteiro
N
por 2. (Coloque também o resultado:;
para facilitar a ancoragem dos padrões.)Se o índice do loop for igual
N/2*2
, deixe apenas muitos espaços.Se
N/2
for múltiplo de 3, pegue o dobro do índice de loop mais um móduloN/2*2+1
.Caso contrário, pegue o dobro do índice de loop mais
(N/2-1)
mais um 3 extra na metade inferior da placa, móduloN/2*2
.Realize a operação do módulo.
fonte
Carvão , 44 bytes
Experimente online! Link é a versão detalhada do código. Outra porta da excelente resposta C do @ orlp.
fonte
APL (Dyalog Unicode) , SBCS de 18 bytes
Programa completo solicitando
n
do stdin. Imprime a solução separada por espaço no stdout usando·
quadrados vazios e⍟
Queens.Experimente online!
⎕CY'dfns'
C op y os "NDR" biblioteca⎕
obter informações de stdinqueens
encontre todas as soluções exclusivas do Queens (sem reflexos ou rotações)⊃
escolha a primeira soluçãofonte
J , 49 bytes
Experimente online!
Força bruta testando todas as permutações de comprimento n .
fonte