Deixe um tabuleiro de xadrez 8x8 ser representado por quaisquer dois valores distintos, sendo um valor um quadrado vazio e o outro uma rainha. Nos exemplos a seguir, eu uso 0s como quadrados vazios e 1s como rainhas. Por exemplo:
É dado por
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Considere o número de pares de rainhas que estão atacando cada uma a pelo menos um quadrado de distância (como lembrete, as rainhas atacam ortogonal e diagonalmente). No exemplo acima, o diagrama feio incrível a seguir mostra todos esses pares como setas.
Existem 43 pares encontrados acima, fornecendo o seguinte caso de teste:
Input:
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Output: 43
Desafio
Escreva um programa que, dado um estado da placa representado por dois valores distintos, produza o número de pares de rainhas que se atacam com pelo menos um quadrado entre elas.
- Você pode inserir em qualquer formato que seja mais conveniente que use dois valores para representar os quadrados e rainhas vazios, por exemplo, uma sequência de 64 "." S para quadrados vazios e "Q" s para rainhas por linhas de baixo para cima, um 8x8 matriz de booleanos, uma lista de números inteiros 0 e 1 etc, contanto que seja explicado em sua solução
- A saída é um número inteiro
- Os métodos de E / S padrão se aplicam e as brechas padrão são proibidas
- Este é o código de golfe, então a resposta mais curta em bytes ganha
Casos de teste:
Usando o formato 0 e 1, com 0 sendo quadrados vazios e 1 sendo rainhas:
Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 0
Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 0
Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 1
Input:
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 0
Output: 10
Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 4
Input:
1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 11
fonte
Respostas:
Python 2 , 105 bytes
Experimente online!
Explicação
Tomamos a entrada como uma sequência de 64 caracteres
'0'
ou'1'
. Usando fatias de passos, lançamos quatro "linhas de visão" de cada rainha que encontramos. Por exemplo, quando i = 10 e d = 7 , marcação a rainha como ♥ e as telhas seleccionados porb[i+d::d]
como █:Claramente, na verdade não queremos que a visão envolva esse quadro. Então calculamos a que distância a borda do quadro está em cada direção e vemos os blocos em
b[i+d::d][:…]
.Para cada par de direção da telha, contamos:
Isso falhará sempre
c
não é uma rainha; oufind
retorna 0); oufind
retorna -1).Cada par de rainhas é verificado apenas uma vez, uma vez que os raios são sempre lançados para a frente em ordem de leitura, de uma rainha "anterior" para uma "posterior".
fonte
JavaScript (ES7), 86 bytes
Recebe a entrada como uma matriz de 64 números inteiros, com 254 para uma rainha e 0 para um quadrado vazio.
Experimente online!
Esta versão abusa do underflow aritmético para obter uma condição de parada na parte recursiva.
JavaScript (ES7), 89 bytes
Recebe a entrada como uma matriz de 64 bits.
Experimente online!
Quão?
Chamamos recursivamente uma função de retorno de chamada nomeada de
map()
para percorrer os quadrados em uma determinada direção. Embora realmente não precisemos do conteúdo do terceiro parâmetro do retorno de chamada (a matrizmap()
foi chamada), indiretamente, ainda assim o usamos para saber se é a primeira iteração ou não.Essa é a variável x no código.
fonte
Caracóis , 14 bytes
Experimente online!
Entrada é o formato 0/1, sem espaços dentro de linhas.
O Snails foi criado para um desafio PPCG de design de linguagem de correspondência de padrões 2D . O mais importante é que, por padrão, gera o número de correspondências encontradas, o que é perfeito para esse desafio.
A
define a opção "todos os caminhos", de modo que, se uma dama estiver em vários pares, cada um desses pares gerará uma correspondência.rdaa7
define a direção da correspondência como S, SE, E e NE. Definir todas as direções (z
) causaria uma contagem dupla.\1\0+\1
corresponde a1
, depois um ou mais0
s e depois outro1
.fonte
APL (Dyalog Classic) ,
413932 bytesExperimente online!
≠⍨
é "diferente de si mesmo" - uma matriz 8x8 totalmente zero⊢,≠⍨,⌽,≠⍨
- se a matriz original forABC...
, esta expressão retornará:8 31⍴
remodela de 8x32 para 8x31, reutilizando os elementos na ordem principal da linha:⊢,⍉,
precede a matriz original e sua transposição (espaços extras para maior clareza):2<⌿0⍪
adiciona 0s na parte superior e compara o uso de<
todos os elementos com o elemento abaixo, para obter um 1 para o 1 líder em cada grupo vertical de 1s e obter 0s em qualquer outro lugar+⌿-⌈⌿
as somas por coluna menos os máximos por coluna - calculamos o número de lacunas entre os grupos 1 em cada coluna, 0 se não houver+/
somafonte
Geléia ,
2220 bytesExperimente online!
fonte
Retina 0.8.2 ,
6058 bytesExperimente online! Recebe a entrada como 8 cadeias binárias de 8 caracteres, separadas por vírgula, mas o cabeçalho converte o formato fornecido para você. Explicação:
Crie todas as substrings do tabuleiro começando em uma dama. Sufixe um valor de marcador a cada substring. Editar: salvou 2 bytes, deixando algumas seqüências de lixo para trás; estes são efetivamente ignorados.
Divida cada marcador em um intervalo inclusivo e adicione 7 aos elementos diferentes de zero.
Exclua todas as séries de caracteres que sejam iguais ao comprimento do marcador. Isso é equivalente a encontrar cada raio leste, sudoeste, sul ou sudeste de cada rainha.
Conte todos os raios que passam por pelo menos um quadrado vazio antes de encontrar outra rainha.
fonte
JavaScript (ES6) + SnakeEx , 38 bytes
Recebe entrada no formulário
'10111000\n10101011\n10101101\n01010100\n01100101\n10001000\n01000111\n01110101'
. Acontece que o SnakeEx ainda pode ser usado fora do seu desafio original!fonte
K (ngn / k) , 45 bytes
Experimente online!
fonte