Se você não sabe o que é uma rainha no xadrez, isso não importa muito; é apenas um nome :)
Sua entrada será um quadrado de largura e altura arbitrárias contendo alguma quantidade de rainhas. A placa de entrada ficará assim (esta placa possui largura e altura de 8):
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
Existem 8 rainhas neste fórum. Se houvesse, digamos, 7, 1 ou 10 aqui, o quadro não seria válido.
Aqui usamos a .
para um espaço vazio e umQ
para uma rainha. Como alternativa, você pode usar qualquer caractere que não seja de espaço em branco que desejar.
Essa entrada pode ser verificada como válida e você deve imprimir (ou retornar) um valor verdadeiro (se não for válido, deve imprimir (ou retornar) um valor falso). É válido porque nenhuma dama está na mesma linha, coluna, diagonal ou anti-diagonal que outra .
Exemplos (não exiba itens entre colchetes):
...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)
Deixe-me enfatizar que uma entrada é válida apenas se nenhuma rainha estiver na mesma linha, coluna, diagonal ou anti-diagonal que outra .
Regras
- Você nunca receberá uma entrada vazia
- Se a entrada contiver menos rainhas que a raiz quadrada da área da placa, ela não será válida.
- Observe que não há soluções válidas para uma placa 2x2 ou 3x3, mas existe uma solução para todos os outros tamanhos quadrados placas , em que a largura e a altura são um número natural.
- A entrada pode estar em qualquer formato razoável, de acordo com as regras do PPCG
- A entrada será sempre um quadrado
- Usei 1 e 0 nos exemplos, mas você pode usar valores de verdade ou falsidade (como
Why yes, sir, that is indeed the case
eWhy no, sir, that is not the case
)
Como se trata de código-golfe , o código mais curto vence!
{(x, y, v)}
comv
em[., Q]
ser um formato de entrada válido?(0, 0, Q), (0, 1, .), (1, 0, Q), (1, 1, .)
seria o terceiro caso de teste.Respostas:
Caracóis , 14 bytes
Experimente online!
Nada como uma linguagem de correspondência de padrões 2D para um problema de decisão 2D. :)
Explicação
A
&
primeira linha é uma opção de modo de correspondência que requer que o padrão na segunda linha corresponda de todas as posições possíveis na entrada. Se for esse o caso, o programa será impresso1
, caso contrário, será impresso0
.Quanto ao próprio padrão, observe que há um implícito
)
no final.Por que isso funciona é mais fácil de ver, começando pela cabeça negativa: garantindo que não haja
Q
uma linha reta da outraQ
que já encontramos, garantimos que não haja mais que N rainhas (caso contrário, haveria ser duas em uma linha e não seria possível encontrar essas rainhas sem encontrar outra). Então a primeira parte, certificando-se de que há uma rainha alcançável em uma direção ortogonal a partir de qualquer posição, garante que haja exatamente N rainhas. Se alguém estivesse faltando, haveria uma linha e uma coluna sem uma rainha. A partir da interseção destes, não seria possível encontrar uma rainha indo apenas em uma direção ortogonal.fonte
Gelatina , 17 ou 15 bytes
Experimente online!
Usa
‘
para uma rainha e¹
para espaço em branco. (Isso é principalmente uma conseqüência da proibição de receber entrada como uma matriz, porque força a entrada a ser cadeias; converter cadeias em números inteiros é difícil no Jelly, com o método mais fácil sendo a avaliação, e acontece que, em vez de 1 e 0, usando "add 1" (‘
) e "add 0" (¹
) torna possível omitir várias instruções de soma e mapa, porque podemos contar as rainhas em uma lista avaliando-a.) Os valores truthy e falsey são os valores normais de Jelly1
e0
.EDIT: A pergunta foi alterada desde que escrevi esta resposta para permitir a entrada de dados como uma matriz. Isso permite eliminar os principais
Ỵµ
, economizando 2 bytes. Provavelmente também permite alterar o formato de entrada para algo mais normal, usandoS
somar e nãoV
avaliar, mas não acho que isso economize bytes e eu meio que gosto desse formato descolado.Explicação
Portanto, a ideia básica é garantir que haja no máximo uma rainha em cada antidiagonal, diagonal e coluna; e exatamente uma rainha em cada linha. Essas condições estão juntas o suficiente para exigir que haja no máximo uma rainha em cada um dos quatro tipos de linha e um número de rainhas iguais ao comprimento lateral do tabuleiro.
Aliás, Jelly provavelmente poderia fazer com um antidiagonais embutido, mas o AFAICT não parece ter um, então eu preciso me contentar em refletir o quadro e depois tirar as diagonais.
Outra observação interessante é que mudar
=1Ṃ
paraE
(todos iguais) fornece um verificador n- rainhas generalizado , que também aceita um quadro n × n em que cada linha, coluna, diagonal e antidiagonal não contém mais que k rainhas, e o quadro contém exatamente kn queens. Restringir k para igual a 1 realmente custa dois bytes.fonte
Oitava,
5770675152 bytesEconomizou 1 byte usando em
flip
vez derot90
agradecer a @LuisMendo, mas encontrou um bug no gabinete 1x1Recebe a entrada como uma matriz binária, com 1 representando uma rainha e 0 representando um espaço vazio.
Cria uma função anônima que concatena primeiro a matriz de entrada e sua transposição.
spdiags
cria uma matriz com o mesmo número de linhas que o argumento, com as diagonais transformadas em colunas (preenchidas com zero, conforme necessário), para concatenarspdiags
a matriz de entrada para obter as diagonais espdiags
a matriz invertida horizontalmente para obter as antidiagonais.Agora pegue a soma de cada coluna da matriz concatenada e verifique se cada coluna é exatamente 1.
Amostra executada em ideone .
fonte
flip
vez derot90
all()
?MATL ,
3834 bytes4 bytes de desconto graças a @beaker !
A entrada é uma matriz 2D de zeros e uns, usando ponto-e-vírgula como separadores de linha.
Isso gera um vetor de coluna uns como verdade e um vetor de coluna contendo pelo menos um zero como falso.
Experimente online!O código do rodapé é um
if
ramo para demonstrar a veracidade ou falsidade.Ou verifique todos os casos de teste .
Explicação
fonte
J , 37 bytes
Trem de funções anônimas que usa a matriz booleana como argumento.
Experimente online!
(
+/
a soma&
do,
percurso=
é igual#
à contagem de linhas)
*
e (lit. vezes)1
um=
é igual[:
ao>./
máximo de+/
as somas na/.
diagonal,
e (lit. catenadas para)+/
as somas na/.
diagonal&
do|.
reverso,
e+/
as somas,
e+/
as somas&
da|:
transposiçãofonte
SnakeEx , 67 bytes
Usos
_
no lugar de.
na entrada. Retorna 1 ou mais correspondências para truthy, 0 correspondências para falsey. Você pode encontrar um intérprete online no link no cabeçalho.Explicação
SnakeEx é um idioma do desafio de Correspondência de Padrão 2-D . Ele define "cobras" que se movem ao redor do material correspondente à grade. Cobras podem gerar outras cobras, tornando a linguagem bastante poderosa.
Vamos olhar para este programa de baixo para cima.
Isso define uma cobra
n
que corresponde a 1 ou mais sublinhados e depois à borda da grade. Observe que isso pode estar em qualquer uma das oito direções cardeais - a direção é determinada quando a cobra é gerada.Semelhante ao
n
acima, isso defineq
como uma cobra que corresponde a qualquer número de sublinhados, um únicoQ
, qualquer número de sublinhados e a borda da grade. Em outras palavras, uma linha / coluna / diagonal que tem apenas uma rainha nela.e
é uma cobra que corresponde a um caractere e a borda da grade.A cobra principal
m
usa esses blocos de construção para verificar o tabuleiro inteiro. Conceitualmente, ele percorre as bordas externas da grade, gerando outras cobras para verificar se todas as colunas e linhas têm exatamente uma rainha e todas as diagonais têm no máximo uma rainha. Se alguma das cobras reproduzidas não corresponder, a correspondência inteira falhará. Vamos dividir.( )%{4}
executa o que está dentro dos parênteses 4 vezes, uma vez para cada lado. (A seguir, é útil imaginar um lado em particular - digamos, a borda superior da grade, começando no canto superior esquerdo e movendo-se para a direita.){q<>}
cria umaq
cobra na mesma direção em que a cobra principal está se movendo. Isso verifica se a borda atual atende à regra "exatamente uma dama". Observe que as cobras reproduzidas não movem o ponteiro da partida da serpente principal, portanto ainda estamos no início da borda.( )*
corresponde a 0 ou mais do que está entre parênteses.{q<R>}
cria umaq
cobra virada para a direita na direção da cobra principal. (Por exemplo, se a cobra principal estiver se movendo para a direita ao longo da borda superior, ela se moverá para baixo.) Isso verifica cada coluna / linha.[ ]
corresponde a uma das opções dentro dos colchetes:{q<RF>}
cria umaq
cobra virada 45 graus para a direita (isto é, para a direitaR
e para a frenteF
) na direção da cobra principal. Aq
cobra combina se a diagonal contiver exatamente uma rainha.{n<RF>}
gera uman
cobra em seu lugar. An
cobra combina se a diagonal não contiver rainhas..
corresponde a qualquer caractere, movendo o ponteiro da correspondência para frente.{e<>}
.<R>
vira a serpente principal para a direita, pronta para corresponder à próxima aresta.Coisa estranha
X
(ramificar em todas as direções diagonais) no lugar deRF
. Infelizmente, o intérprete on-line disse que foi um erro de sintaxe. Eu também tentei*
(ramifique em todas as direções), mas isso impediu o intérprete._*Q?_*$
deveria funcionar para combinar "no máximo uma rainha" nas diagonais, mas isso também pendia do intérprete. Meu palpite é que a possibilidade de correspondências vazias causa problemas.fonte
Ruby, 120 bytes
Função Lambda baseada na especificação original que exigia entrada como uma sequência.
converte os Q's em números complexos e os subtrai um do outro. Se a diferença entre as coordenadas de duas rainhas for horizontal, vertical ou diagonal, elevá-la para a quarta potência resultará em um número real e o arranjo será inválido.
Ungolfed in program program
fonte
Python 3 ,
232200155 bytesExperimente online!
-32 bytes graças ao @beaker notando uma alteração nas especificações de entrada; Mudei a linguagem de Python 3 para 2, permitindo que eu usasse
input
a entrada como uma matriz de seqüências de caracteres ou uma matriz de matrizes de caracteres.-45 bytes graças a @Leaky Nun
fonte
JavaScript (ES6), 115 bytes
Ungolfed:
fonte
Ruby, 155 bytes
Isso é horrível de ler, então eu tenho uma versão um pouco menos golfe abaixo
Este é o mesmo código, mas com algumas linhas novas para separar o que está acontecendo.
O próprio código é uma função lambda anônima que recebe uma matriz de strings (
x
) no formato["..Q", "Q..", ".Q."]
.A primeira linha está mapeando cada sequência para o índice do caractere Q nessa sequência. Se não houver um caractere Q, ele será substituído por -2 1 . Esta nova série de índices é atribuído à variável
y
.A próxima linha fecha esse conjunto de índices com um deslocamento (rotacionado). Isso resulta em uma matriz de pares de índices consecutivos.
A próxima linha é particularmente complicada. Ele percorre cada um dos pares de índices e subtrai o menor do maior. Se for 1 (e não estamos no último par 2) ), existem duas rainhas que estão na mesma diagonal e um valor de -2 é inserido; caso contrário, o índice original da rainha na sequência é inserido .
A última linha resume todos os índices de cada um e verifica se é o número do triângulo para n-1, onde n é a largura (ou altura) do quadrado.
1: -1 teria sido o meu objetivo, mas é 1 além de 0, por isso mexeria com a verificação das diagonais. A negatividade é importante para fazer a soma final errada. Pensei em um número alto (com um dígito) como 9, mas não tenho certeza se isso não resultará em uma verificação incorreta.
2: O tabuleiro não quebra, enquanto a
rotate
função de array do ruby , e se o último par é diferente de um, não importa - isso não é uma diagonal.fonte
PHP,
137143 bytesinspirado na solução de Neil
recebe entrada do primeiro argumento da linha de comando; corra com
-r
. Requer quebras de linha de byte único.Na verdade, você pode usar qualquer caractere, exceto
0
para a quebra de linha.imprime true (
1
) ou false (string vazia).demolir
fonte
Python 3 ,
185176175172171 bytesUma função anônima que recebe uma lista de seqüências de caracteres como entrada.
Python 2 , 175 bytes
fonte