Escreva um programa de contagem quadrada

8

Um quebra-cabeça conhecido envolve contar quantos quadrados podem ser feitos usando os pontos em uma grade 3x3:

.  .  .
.  .  .
.  .  .

A resposta é 6 - quatro quadrados pequenos, um quadrado grande e um quadrado formado pelos pinos superior, esquerdo, inferior e direito, com bordas ao longo das diagonais dos quadrados.

Sua tarefa é criar um programa que conte o número total de quadrados que podem ser formados a partir de um conjunto de pontos.

Seu programa terá entrada em um dos dois formatos (de sua escolha):

  • Um Mpor Ngrade consistindo em um .ou . .representa um ponto na grade do qual um quadrado pode ser um canto e todos os espaços na grade são exatamente uma unidade separados horizontal ou verticalmente.

  • Uma lista de pares de coordenadas representando pontos em que um quadrado pode estar.

e retorne o número de quadrados distintos que podem ser formados usando os pontos fornecidos. Seu programa deve retornar uma solução correta para todas as entradas possíveis.


Por exemplo, considere a entrada acima, mas onde o quadrado central está ausente:

...
. .
...

Existem apenas dois quadrados possíveis aqui (o grande e o diagonal), portanto o programa deve retornar 2.


O código mais curto para fazer isso em qualquer idioma vence.

Joe Z.
fonte
7
Gostaria de te votar, mas sua reputação é perfeita. (6666) :-P
Maçaneta da porta
Desde que eu tenha essa reputação, eu sou o diabo :(
Joe Z.
Estamos falando de quadrados ou retângulos ? Você diz que a unidade horizontal e a vertical são as duas unidades. Mas, no seu exemplo, os pontos são uma unidade verticalmente, mas três unidades horizontalmente. Então, como estão esses quadrados? Também poderia haver lacunas na entrada? Em caso afirmativo, você poderia fornecer um exemplo mais complexo?
Martin Ender
Os pontos da questão são espaçados apenas para fins estéticos. Eles devem ter apenas um caractere para fins da pergunta real.
Joe Z.
Qual é o valor máximo possível para M e N e o número máximo de pontos totais? E somos livres para dizer quantos pontos existem da maneira que desejamos? (Ou, tomando uma entrada no início, ou parando uma vez algum tipo de EOF é atingido.)
Nível River St

Respostas:

7

Python, 95

Leva uma lista de coordenadas de stdin.

l=input();print(sum((c-d+b,d+c-a)in l and(a-d+b,b+c-a)in l for a,b in l for c,d in l)-len(l))/4

Explicação:

Para cada par de pontos (a,b)e (c,d), verifique se o quadrado com pontos adicionais (c-d+b,d+c-a)e (a-d+b,b+c-a)está na lista. Isso conta cada quadrado 4 vezes e cada ponto uma vez (quando (a,b) = (c,d)), subtraindo o número de pontos e dividindo por 4, obtém o número de quadrados.

caixa de papelão
fonte
Inteligente, conciso.
Primo