Mira esta imagen. Específicamente, en cómo están dispuestos los agujeros en los extremos.
Observe cómo las tuberías en esta imagen se empaquetan en un patrón hexagonal. Se sabe que en 2D, una red hexagonal es el paquete de círculos más denso. En este desafío, nos centraremos en minimizar el perímetro de un paquete de círculos. Una forma útil de visualizar el perímetro es imaginarse colocando una banda elástica alrededor de la colección de círculos.
La tarea
Dado un entero positivo n
como entrada, muestre una colección de n
círculos empaquetados lo más ajustados posible.
Reglas y aclaraciones
- Suponga que los círculos tienen un diámetro de 1 unidad.
- La variable a minimizar es la longitud del perímetro, que se define como el casco convexo de los centros de los círculos en el grupo. Mira esta imagen:
Los tres círculos en línea recta tienen un perímetro de 4 (el casco convexo es un rectángulo de 2x0, y el 2 se cuenta dos veces), los dispuestos en un ángulo de 120 grados tienen un perímetro de aproximadamente 3,85 y el triángulo tiene un perímetro de solo 3 unidades. Tenga en cuenta que estoy ignorando las unidades pi adicionales que el perímetro real sería porque solo estoy mirando los centros de los círculos, no sus bordes.
- Puede haber (y casi con seguridad habrá) múltiples soluciones para cualquier cosa
n
. Puede enviar cualquiera de estos a su discreción. La orientación no importa. - Los círculos deben estar en una red hexagonal.
- Los círculos deben tener al menos 10 píxeles de diámetro y pueden estar rellenos o no.
- Puede escribir un programa o una función.
- La entrada puede tomarse a través de STDIN, como un argumento de función, o su equivalente más cercano.
- La salida puede mostrarse o enviarse a un archivo.
Ejemplos
A continuación tengo ejemplos de salidas válidas e inválidas para n del 1 al 10 (ejemplos válidos solo para los primeros cinco). Los ejemplos válidos están a la izquierda; cada ejemplo a la derecha tiene un perímetro mayor que el correspondiente ejemplo válido.
Muchas gracias a steveverrill por ayudarme a escribir este desafío. Feliz embalaje!