Spójrz na to zdjęcie. W szczególności, w jaki sposób rozmieszczone są otwory na końcach.
( Źródło obrazu )
Zauważ, jak rury na tym obrazie są upakowane w sześciokątny wzór. Wiadomo, że w 2D sieć sześciokątna jest najgęstszym upakowaniem kół. W tym wyzwaniu skupimy się na zminimalizowaniu obwodu wypełnienia kół. Jednym z przydatnych sposobów wizualizacji obwodu jest wyobrażenie sobie zakładania gumki wokół kolekcji kół.
Zadanie
Biorąc pod uwagę dodatnią liczbę całkowitą njako dane wejściowe, pokaż kolekcję nkręgów spakowanych tak ciasno, jak to możliwe.
Zasady i wyjaśnienia
- Załóżmy, że koła mają średnicę 1 jednostki.
- Zmienna być zminimalizowane jest długość obwodu, który jest zdefiniowany jako kadłub wypukła z ośrodków z kręgów w grupie. Spójrz na ten obraz:
Trzy okręgi w linii prostej mają obwód 4 (wypukły kadłub to prostokąt 2x0, a 2 jest liczony dwukrotnie), te ustawione pod kątem 120 stopni mają obwód około 3,85, a trójkąt ma obwód tylko 3 jednostki. Zauważ, że ignoruję dodatkowe jednostki pi, którymi byłby rzeczywisty obwód, ponieważ patrzę tylko na środki okręgów, a nie na ich krawędzie.
- Może istnieć (i prawie na pewno będzie) wiele rozwiązań dla każdego
n. Możesz wydać dowolne z nich według własnego uznania. Orientacja nie ma znaczenia. - Kręgi muszą znajdować się na siatce sześciokątnej.
- Koła muszą mieć co najmniej 10 pikseli średnicy i mogą być wypełnione lub nie.
- Możesz napisać program lub funkcję.
- Dane wejściowe mogą być pobierane przez STDIN, jako argument funkcji lub najbliższy odpowiednik.
- Dane wyjściowe mogą być wyświetlane lub w postaci pliku.
Przykłady
Poniżej mam przykładowe prawidłowe i nieprawidłowe dane wyjściowe dla n od 1 do 10 (prawidłowe przykłady tylko dla pierwszych pięciu). Prawidłowe przykłady znajdują się po lewej stronie; każdy przykład po prawej stronie ma większy obwód niż odpowiadający mu prawidłowy przykład.
Ogromne podziękowania dla Steveverrill za pomoc w napisaniu tego wyzwania. Miłego pakowania!



