Podziel n X n
kwadrat na wiele nie przystających prostokątów o liczbach całkowitych. a(n)
jest najmniejszą możliwą różnicą między największym a najmniejszym obszarem.
___________
| |S|_______|
| | | L |
| |_|_______|
| | | |
| |_____|___|
|_|_________| (fig. I)
Największy prostokąt ( L
) ma powierzchnię 2 * 4 = 8
, a najmniejszy prostokąt ( S
) ma powierzchnię 1 * 3 = 3
. Dlatego różnica jest taka 8 - 3 = 5
.
Biorąc pod uwagę liczbę całkowitą n>2
, wyprowadzaj najmniejszą możliwą różnicę.
Wszystkie znane wartości sekwencji w momencie publikacji:
2, 4, 4, 5, 5, 6, 6, 8, 6, 7, 8, 6, 8, 8, 8, 8, 8, 9, 9, 9, 8, 9, 10, 9, 10, 9, 9, 11, 11, 10, 12, 12, 11, 12, 11, 10, 11, 12, 13, 12, 12, 12
Tak a(3)=2
, a(4)=4
...
Powiązane - to powiązane wyzwanie umożliwia nieoptymalne rozwiązania, ma ograniczenia czasowe i nie jest golfem kodowym.
Aby uzyskać więcej informacji, obejrzyj ten film autorstwa Numberphile
Befunge, 708 bajtów
Wypróbuj online!
To oczywiście nie zdobędzie żadnych nagród za rozmiar, ale w rzeczywistości jest dość szybki, biorąc pod uwagę, że jest to podstawowa implementacja bruce force w ezoterycznym języku. W tłumaczu referencyjnym Befunge może obsłużyć do n = 6 w ciągu kilku sekund. Dzięki kompilatorowi może obsłużyć do n = 8, zanim zacznie się leniwie; n = 9 zajmuje kilka minut, a n = 10 jest zamykane przez 2 godziny.
Teoretycznie górna granica wynosi n = 11, zanim zabraknie nam pamięci (tj. Nie ma wystarczającej ilości miejsca na boisku, aby zmieścić większy kwadrat). Jednak w tym momencie czas obliczenia optymalnego rozwiązania jest prawdopodobnie dłuższy niż ktokolwiek byłby skłonny czekać, nawet po skompilowaniu.
Najlepszym sposobem, aby zobaczyć, jak działa algorytm, jest uruchomienie go w jednym z „wizualnych debuggerów” Befunge. W ten sposób możesz oglądać, jak próbuje dopasować różne rozmiary prostokąta do dostępnej przestrzeni. Jeśli chcesz „przewinąć do przodu” do punktu, w którym ma dobre dopasowanie, możesz umieścić punkt przerwania
4
w sekwencji w$_40p
pobliżu środka dziesiątej linii (9, jeśli zero). Wartość na górze stosu w tym punkcie jest bieżącą różnicą powierzchni.Poniżej znajduje się animacja pokazująca kilka pierwszych klatek tego procesu dla n = 5:
Każdy odrębny prostokąt jest reprezentowany przez inną literę alfabetu. Należy jednak pamiętać, że końcowy prostokąt nigdy nie jest zapisywany, więc sekcja kwadratu będzie po prostu pusta.
Napisałem również wersję debugowania kodu, która wyświetla bieżący układ za każdym razem, gdy znajdzie nowe najlepsze dopasowanie ( Wypróbuj online! ). W przypadku mniejszych rozmiarów pierwsze dopasowanie jest często optymalnym rozwiązaniem, ale gdy miniesz n = 6, prawdopodobnie zobaczysz kilka prawidłowych, ale nieoptymalnych układów, zanim osiądzie na ostatecznym rozwiązaniu.
Najlepszy układ znaleziony dla n = 10 wygląda następująco:
źródło