Biorąc pod uwagę dodatnią liczbę całkowitą poniżej 1000, wyświetl wszystkie możliwe prostokąty z tym obszarem.
Zadanie
Powiedzmy, że dane wejściowe to 20. Możemy zrobić prostokąt 20 × 1, 10 × 2 lub 5 × 4, więc jest to prawidłowy wynik:
********************
**********
**********
*****
*****
*****
*****
Zauważ, że każdy możliwy prostokąt pojawia się dokładnie raz.
Prostokąty mogą pojawiać się w dowolnej kolejności, orientacji lub pozycji, ale żadne dwa prostokąty nie mogą się nakładać ani dotykać, nawet w rogach. Obowiązują również następujące zasady:
********************
****
********** ****
********** ****
****
****
Punktacja
Obszar ramki granicznej (BBA) wyniku jest obszarem minimalnego prostokąta obejmującego wszystkie prostokąty. W pierwszym przykładzie wyjściowym rozmiar wynosi 20 × 9, więc BBA wynosi 180. W drugim przykładzie wyjściowym rozmiar wynosi 20 × 7, więc BBA ma tylko 140.
Znajdź BBA wyjścia, gdy wejście to 60, 111, 230, 400 i 480, i dodaj je. Pomnóż tę sumę przez rozmiar kodu w bajtach. Rezultatem jest twój wynik; najniższy wynik wygrywa.
Zasady
- Program (lub funkcja) musi generować prawidłowe dane wyjściowe dla dowolnej liczby całkowitej dodatniej poniżej 1000.
- Dane wyjściowe muszą zawierać tylko gwiazdki (
*
), spacje () i znaki nowej linii.
- Pomiędzy prostokątami może być dowolna ilość miejsca, ale ma to znaczenie dla BBA.
- Linie wiodące lub końcowe lub kolumny, jeśli mają tylko spacje, nie liczą się do BBA.
źródło
Odpowiedzi:
Rubinowy, 228 bajtów * 21895 = 4992060
Kilka zmian w stosunku do niepoznanego kodu. Największa jest zmiana znaczenia zmiennej
m
z wysokości prostokąta kwadratowego na wysokość prostokąta kwadratowego plusn
.Trywialnie
*40
został zmieniony na,*n
co oznacza wiele niepotrzebnych białych znaków po prawej stronie dla dużychn
; i-2
zmienia się na,0
co oznacza, że prostokąty narysowane wzdłuż dna zawsze pomijają dwie pierwsze kolumny (powoduje to gorsze upakowanie liczb, których jedynym rozkładem jest faktoryzacja(n/2)*2
)Wyjaśnienie
W końcu znalazłem czas, aby wrócić do tego.
Dla danego
n
pola najmniejsze pole musi mieć wystarczająco dużo miejsca zarówno dla najdłuższego prostokąta, jak1*n
i kwadratu prostokątax*y
. Powinno być oczywiste, że najlepszy układ można osiągnąć, jeśli oba prostokąty mają długie boki ustawione w tym samym kierunku.Nie zwracając uwagi na wymóg spacji między prostokątami, okazuje się, że całkowita powierzchnia jest albo
(n+y)*x = (n+n/x)*x
albon*(x+1)
. Tak czy inaczej, to ocenian*x + n
. Uwzględniając spację, musimy dodać dodatkowy,x
jeśli umieszczamy prostokąty od końca do końca lubn
jeśli umieszczamy prostokąty obok siebie. Ten pierwszy jest zatem preferowany.Daje to następujące dolne granice
(n+y+1)*x
obszaru pola:Sugeruje to następujący algorytm:
Możliwe jest uzyskanie wszystkich prostokątów dla wymaganych przypadków testowych w wyżej wymienionych dolnych granicach, z wyjątkiem 60, co daje następującą wartość wyjściową 71 * 8 = 568. Można to nieco poprawić do 60 * 9 = 540, przesuwając dwa najcieńsze prostokąty o jeden kwadrat w prawo, a następnie w górę, ale oszczędność jest minimalna, więc prawdopodobnie nie jest wart żadnego dodatkowego kodu.
To daje łączną powierzchnię 21895.
Nieskluczony kod
źródło
CJam, 90385 * 31 bajtów = 2801935
Sprawdź to tutaj. Użyj tego skryptu, aby obliczyć BBA.
To tylko naiwne rozwiązanie, aby zacząć wszystko.
źródło
Rubinowy, 56 bajtów
90385 * 56 = 5061560 przy założeniu, że dane wyjściowe są takie same jak w przypadku Martina (tak mi się wydaje).
Oto kolejna przydatna funkcja w przydatnym programie testowym
Co daje następujące dane wyjściowe:
źródło