Escribir un programa de conteo cuadrado

8

Un acertijo bien conocido implica contar cuántos cuadrados se pueden hacer usando los puntos en una cuadrícula de 3x3:

.  .  .
.  .  .
.  .  .

La respuesta es 6: cuatro cuadrados pequeños, un cuadrado grande y un cuadrado formado por las clavijas superior, izquierda, inferior y derecha, con bordes a lo largo de las diagonales de los cuadrados.

Su tarea es construir un programa que cuente el número total de cuadrados que se pueden formar a partir de un conjunto de puntos.

Su programa tomará información en uno de dos formatos (de su elección):

  • Un Mpor Ncuadrícula que consiste en .o . .representa un punto en la cuadrícula del que un cuadrado puede ser una esquina, y todos los espacios en la cuadrícula están exactamente separados por una unidad horizontal o verticalmente.

  • Una lista de pares de coordenadas que representan puntos en los que puede estar un cuadrado.

y devuelve el número de cuadrados distintos que se pueden formar usando los puntos provistos. Su programa debe devolver una solución correcta para cada entrada posible.


Por ejemplo, tome la entrada anterior pero donde falta el cuadrado central:

...
. .
...

Aquí solo hay dos cuadrados posibles (el grande y el diagonal), por lo que el programa debería volver 2.


El código más corto para hacer esto en cualquier idioma gana.

Joe Z.
fuente
77
Te votaría, pero tu reputación es perfecta. (6666) :-P
Pomo de la puerta
Mientras tenga esa reputación, soy el diablo :(
Joe Z.
¿Estamos hablando de cuadrados o rectángulos ? Dices que la unidad horizontal y la vertical son ambas 1. Pero en tu ejemplo, los puntos están separados verticalmente por una unidad pero separados horizontalmente por 3 unidades. Entonces, ¿cómo son esos cuadrados? ¿También podría haber huecos en la entrada? Si es así, ¿podría proporcionar un ejemplo más complejo?
Martin Ender
Los puntos en la pregunta solo se espacian más ampliamente con fines estéticos. Deben estar separados por un solo personaje a los fines de la pregunta real.
Joe Z.
¿Cuál es el valor máximo posible para M y N, y el número máximo de puntos totales? ¿Y somos libres de decir cuántos puntos hay de alguna manera que deseamos? (Ya sea tomando una entrada al principio o deteniéndose una vez que se alcanza algún tipo de EOF.)
Level River St

Respuestas:

7

Python, 95

Toma una 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

Explicación:

Para cada par de puntos (a,b)y (c,d), verifique si el cuadrado con puntos adicionales (c-d+b,d+c-a)y (a-d+b,b+c-a)está en la lista. Esto cuenta cada cuadrado 4 veces y cada punto una vez (cuando (a,b) = (c,d)), por lo que restando el número de puntos y dividiendo entre 4 se obtiene el número de cuadrados.

caja de cartón
fuente
Inteligente, conciso.
primo