Ciemny czarny atrament rozpryskiwał się na białej kartce papieru do drukarki! Oczywistym rozwiązaniem jest złożenie papieru w taki sposób, aby czarno-białe części stykały się i obie stały się szare w miarę rozpraszania atramentu. Następnie rozłóż i zwiń, aż papier będzie równie szary.
Znalezienie najlepszego sposobu na wykonanie tych fałd jest Twoim zadaniem w tym wyzwaniu kodowania. Ten Pastebin zawiera cztery różnej wielkości siatki zer i jedynek. Każda siatka przedstawia kawałek poplamionego atramentem papieru, który należy zmienić na szary. Zera to papier, a te to atrament.
W tych siatkach obowiązują tylko poziome i pionowe fałdy wzdłuż przestrzeni między liniami i kolumnami. Po złożeniu pary uśpionych wartości uśrednia się. Fałdy są wykonywane pojedynczo i zawsze rozkładane. Fałdy zmieniają tylko rozkład atramentu, a nie rozmiar papieru.
Rn oznacza złożenie lewej krawędzi siatki w prawo, zaczynając od n-tej kolumny. Dn oznacza złożenie górnej krawędzi siatki w dół, zaczynając od n-tego rzędu. (n ma indeks 1)
Przykład
Biorąc pod uwagę tę siatkę
0 1 1 1
0 0 0 0
0 0 0 0
składanie D1 oznacza „złóż cały górny rząd w dół, a następnie rozłóż”.
0 0.5 0.5 0.5
0 0.5 0.5 0.5
0 0 0 0
Wtedy R2 wyprodukuje
0.25 0.5 0.5 0.25
0.25 0.5 0.5 0.25
0 0 0 0
a inny R2 nic nie zmieni.
Cel
Twoim celem jest napisanie algorytmu, który znajdzie najlepszą sekwencję rozkładania atramentu dla każdej z czterech siatek, używając dokładnie 8 fałd za każdym razem. Fałdy mogą być dowolną kombinacją Rs lub Ds.
Punktacja
Wynik twojego zgłoszenia jest sumą twoich wyników dla każdej siatki. Wynik siatki jest sumą bezwzględnych różnic między każdą z jej wartości a jej średnią (jej suma podzielona przez powierzchnię). Niższe wyniki są lepsze. Wynik 0 jest idealny, ale prawdopodobnie jest niemożliwy tylko w 8 fałdach.
Musisz podać swoje cztery 8-etapowe sekwencje składania ze swoim kodem w swojej odpowiedzi. Dzięki temu możemy zweryfikować, czy Twój algorytm naprawdę działa.
Proszę umieścić je w tej formie:
20*20R1D2R3D4R5D6R7D8
40*20R1D2R3D4R5D6R7D8
40*40R1D2R3D4R5D6R7D8
20*80R1D2R3D4R5D6R7D8
Oto skrypt w języku Python, który obliczy Twoje wyniki na podstawie sekwencji składania.
Oczywiście nie powinieneś kopiować przesyłania sekwencji przez inną osobę. Sekwencje dla każdej siatki należą tylko do osoby, która je utworzyła.
Wyjaśnienia
Idealnie twój algorytm będzie działał dobrze na każdej siatce, chociaż możesz go dostosować do tych konkretnych.
Musisz przesłać kod wraz z sekwencją. Aby wygrać, potrzebujesz najmniejszego zestawu 8-krokowych sekwencji składania, który nie został jeszcze opublikowany, a także algorytmu, który jest do publicznej kontroli. Wyjaśnij swój kod, nie zaciemniaj go.
Siatka nigdy nie powinna zawierać liczb ujemnych.
Obowiązują standardowe luki.
źródło
Odpowiedzi:
Pyton
Wyczerpująco wypróbowuje różne kombinacje foldów dla pierwszych kilku foldów, a następnie robi resztę foldów, stosując zachłanne podejście.
Wyczerpujące podejście jest ograniczone do rozsądnego zakresu fałd na środku, tak że nie zajmie to wieczności, nie ignorując zbyt wielu możliwych fałd, aby uzyskać dobre minimum.
Ran używając pypy na moim MacBook Air.
Odpowiedzi:
Wyjścia:
Łączny wynik: 7,91125 + 16,33375 + 42,13 + 32,30875 = 98,69375
Kod:
źródło
C, 16,344 (4 minuty 33 sekundy)
Najlepsze znalezione ruchy: D6, D13, R19, D9, D11, R21, D10, R20
Wykorzystuje mieszankę Monte Carlo i wspinaczki górskiej. Jestem pewien, że można by go uruchomić znacznie szybciej.
źródło