Jetez un oeil à cette image. Plus précisément, comment les trous sur les extrémités sont disposés.
Remarquez comment les tuyaux de cette image sont placés dans un motif hexagonal. On sait qu'en 2D, un réseau hexagonal est le plus dense des cercles. Dans ce défi, nous nous concentrerons sur la minimisation du périmètre d'un emballage de cercles. Une façon utile de visualiser le périmètre est d'imaginer mettre un élastique autour de la collection de cercles.
La tâche
Étant donné un entier positif n
en entrée, montrez une collection de n
cercles aussi serrés que possible.
Règles et clarifications
- Supposons que les cercles ont un diamètre de 1 unité.
- La variable à minimiser est la longueur du périmètre, qui est définie comme étant la coque convexe des centres des cercles du groupe. Jetez un oeil à cette image:
Les trois cercles en ligne droite ont un périmètre de 4 (la coque convexe est un rectangle 2x0 et les 2 sont comptés deux fois), ceux disposés selon un angle de 120 degrés ont un périmètre d'environ 3,85 et le triangle a un périmètre de seulement 3 unités. Notez que j'ignore les unités pi supplémentaires que serait le périmètre réel parce que je ne regarde que les centres des cercles, pas leurs bords.
- Il peut y avoir (et il y en aura presque certainement) de multiples solutions pour tout
n
. Vous pouvez produire n'importe lequel de ces éléments à votre discrétion. L'orientation n'a pas d'importance. - Les cercles doivent être sur un réseau hexagonal.
- Les cercles doivent avoir au moins 10 pixels de diamètre et peuvent être remplis ou non.
- Vous pouvez écrire soit un programme soit une fonction.
- L'entrée peut être prise via STDIN, comme argument de fonction ou équivalent le plus proche.
- La sortie peut être affichée ou sortie dans un fichier.
Exemples
Ci-dessous, j'ai des exemples de sorties valides et invalides pour n de 1 à 10 (exemples valides uniquement pour les cinq premiers). Les exemples valides sont à gauche; chaque exemple à droite a un périmètre plus grand que l'exemple valide correspondant.
Un grand merci à steveverrill pour son aide à la rédaction de ce défi. Bon emballage!