Погляньте на це зображення. Зокрема, як влаштовані отвори на торцях.
Зверніть увагу, як труби на цьому зображенні упаковані в шестикутний візерунок. Відомо, що в 2D шестикутна решітка - це найгустіша упаковка кіл. У цьому виклику ми зупинимося на тому, щоб мінімізувати периметр упаковки кіл. Один корисний спосіб візуалізації периметра - це уявити прокладку навколо колекції гумок.
Завдання
Подавши ціле додатне ціле число n
, покажіть колекцію n
кіл, упаковану якомога щільніше.
Правила та уточнення
- Припустимо, кола мають діаметр 1 одиницю.
- Мінлива бути зведена до мінімуму довжина периметра, який визначений , щоб бути опуклою оболонкою з центрів кіл в групі. Погляньте на це зображення:
Три кола по прямій лінії мають периметр 4 (опуклий корпус - прямокутник 2х0, а 2 рахуються двічі), розташовані під кутом 120 градусів мають периметр приблизно 3,85, а трикутник має периметр всього 3 одиниці. Зауважте, що я ігнорую додаткові пі-одиниці, який би був фактичний периметр, тому що я дивлюся лише на центри кіл, а не їхні краї.
- Можливо (і майже напевно буде) безліч рішень для будь-якої заданої
n
. Ви можете випустити будь-яке з них на свій розсуд. Орієнтація не має значення. - Кола повинні бути на шестикутній решітці.
- Кола повинні бути діаметром не менше 10 пікселів і можуть бути заповненими чи ні.
- Ви можете написати або програму, або функцію.
- Вхід може бути прийнятий через STDIN, як аргумент функції, або найближчий еквівалент.
- Вихід може бути відображений або виведений у файл.
Приклади
Нижче я маю приклади дійсних та недійсних результатів для n від 1 до 10 (дійсні приклади лише для перших п'яти). Дійсні приклади знаходяться зліва; кожен приклад праворуч має більший периметр, ніж відповідний дійсний приклад.
Велике спасибі Steveverrill за допомогу в написанні цього виклику. Щаслива упаковка!