To wyzwanie jest inspirowane tą aplikacją . Przypadki testowe są zapożyczone z tej aplikacji.
Jest to wyzwanie z najszybszym kodem , którego celem jest rozwiązanie największych przypadków testowych w jak najkrótszym czasie. Udostępniono kilka mniejszych przypadków testowych, aby ludzie mogli szybciej testować swoje algorytmy.
Otrzymasz kwadratową siatkę wejściową o wymiarach n-po-n, gdzie 9 <= n <= 12 . Ta siatka zostanie podzielona na n obszarów, w których komórki każdego obszaru mają unikalne identyfikatory (użyję małych liter z al w tekście tutaj, ale możesz wybrać, co chcesz, na przykład liczby całkowite 1-12 ) .
Dane wejściowe mogą wyglądać następująco (opcjonalny format wejściowy):
aabbbbbcc
adddbbbcc
adeeecccc
adddefgcc
hhhdifggg
hdddifffg
hhhiifffg
hihiifffg
iiiiiiggg
Lub łatwiejsze do wizualizacji:
Wyzwanie:
Musisz umieścić 2 * n drzew w tym parku, zgodnie z następującymi zasadami:
- Powinny być dokładnie 2 drzewa na kolumnę i 2 drzewa na rząd
- Wszystkie obszary powinny mieć dokładnie 2 drzewa.
- Żadne drzewa nie mogą przylegać do innego drzewa, pionowo, poziomo lub po przekątnej
Rozwiązaniem powyższego układu jest:
Uwaga: dla każdej układanki jest tylko jedno rozwiązanie
Dodatkowe zasady:
- Formaty wejściowe i wyjściowe są opcjonalne
- Wyjściem może być na przykład lista indeksów, siatka z 1/0 wskazującą, czy w tej pozycji znajduje się drzewo, lub zmodyfikowana wersja danych wejściowych, w których drzewa są wskazane
- Czas wykonania musi być deterministyczny
- Program musi zakończyć się w ciągu 1 minuty na komputerze @ isaacg
- Specyfikacja: 4 procesory, procesor i5-4300U przy 1,9 GHz, 7,5G pamięci RAM.
- W przypadku, gdy Twój program nie może rozwiązać dwóch największych przypadków testowych w ciągu jednej minuty, czas na drugą co do wielkości ( n = 11 ) będzie twój wynik. Przegrasz z rozwiązaniem, które rozwiązuje największy przypadek.
Przypadki testowe:
Mógłbym edytować tę listę, jeśli wydaje się, że przesłania są dostosowane do tych przypadków testowych.
12 na 12 :
--- Input ---
aaaaabccccdd
aaaaabccccdd
aaaaabbbbddd
eeeafffgbghh
eeaafffgbghh
eefffffggghh
eeefijffghhh
iieiijjjjkhh
iiiiijjjjkhk
lljjjjjjjkkk
llllllkkkkkk
llllllkkkkkk
--- Solution ---
aaaaabcccCdD
aaaaaBcCccdd
aAaaabbbbdDd
eeeaffFgBghh
eeAaFffgbghh
eefffffGgGhh
EeefijffghhH
iiEiIjjjjkhh
IiiiijjjjkHk
lljJjJjjjkkk
lLllllkkKkkk
lllLllKkkkkk
11 na 11 :
--- Input ---
aaaaaaabbcc
adddabbbbcc
edddbbbbbbc
eddddbbbbbb
effffggghhh
effffgghhii
eefffjjhhii
eeeejjjhhii
eeejjjjkiii
jjjjjjkkiii
jjjjjkkkiii
--- Solution ---
aaAaaaabbCc
adddAbBbbcc
eDddbbbbbbC
eddDdBbbbbb
effffggGhHh
eFfffGghhii
eefFfjjhHii
EeeejjjhhiI
eeEjjjjKiii
JjjjJjkkiii
jjjjjkKkIii
10 na 10
--- Input ---
aaaaabccdd
aeaabbbccd
aeaabfbgcd
eeeaafggcd
eeeaafghcd
eeeiifghcd
ieiiigghcd
iiijighhcd
jjjjighhcd
jjjggghhdd
--- Solution ---
aaAaabccdD
aeaaBbBccd
aEaabfbgcD
eeeaaFgGcd
eEeAafghcd
eeeiiFghCd
IeiIigghcd
iiijigHhCd
JjJjighhcd
jjjgGghHdd
9 na 9
--- Input ---
aabbbbbcc
adddbbbcc
adeeecccc
adddefgcc
hhhdifggg
hdddifffg
hhhiifffg
hihiifffg
iiiiiiggg
--- Solution ---
aAbBbbbcc
adddbbBcC
adEeEcccc
AdddefgCc
hhhDiFggg
hDddifffG
hhhiIfFfg
HiHiifffg
iiiiiIgGg
--- Input ---
aaabbbccc
aaaabbccc
aaaddbcce
ffddddcce
ffffddeee
fgffdheee
fggfhhhee
iggggheee
iiigggggg
--- Solution ---
aaAbBbccc
AaaabbcCc
aaaDdBcce
fFddddcCe
fffFdDeee
fGffdheeE
fggfHhHee
IggggheeE
iiIgggGgg
źródło
There shall be exactly 2 trees per column, and 2 trees per row
więc brutalna siła jest prawdopodobnie niemożliwa.Odpowiedzi:
JavaScript (ES6), 271 bajtów
Pobiera dane wejściowe jako tablicę tablic znaków. Zwraca tablicę masek bitowych (liczb całkowitych) opisujących pozycję drzew w każdym rzędzie, gdzie najmniej znaczący bit jest pozycją najbardziej na lewo.
Sformatowane i skomentowane
Przypadki testowe
Ten fragment kodu zawiera dodatkową funkcję wyświetlania wyników w bardziej czytelnym formacie. Zbyt wolne jest rozwiązywanie ostatniego przypadku testowego.
Oczekiwany czas działania: ~ 5 sekund.
Pokaż fragment kodu
źródło
C, oficjalny czas: 5 ms dla 12 x 12
Kompilowany z GCC 7 przy użyciu flag
-O3
i-fopenmp
. Powinny mieć podobne wyniki w dowolnej wersji GCC z zainstalowanym OpenMP.Format wejściowy i wyjściowy są podane w pytaniu.
Na mojej maszynie potrzeba
0,009s0,008s0,005s dla przykładu12x12i0,022s0,020s0,019s, aby uruchomić wszystkie przykłady. Na komputerze testowym isaacg zgłasza 5ms dla przykładu 12x12 przy użyciu oryginalnej (nie-wątkowej) wersji kodu.Stosowanie:
Po prostu prosty solver z brutalną siłą, działający na jednym rzędzie na raz. Działa z dobrą prędkością, wcześnie rozpoznając niemożliwe sytuacje (np. Nie pozostały komórki regionu, ale mniej niż 2 drzewa w regionie).
Pierwsza aktualizacja poprawia trafienia do pamięci podręcznej poprzez umieszczenie powiązanych danych blisko siebie w pamięci i sprawia, że obliczenia możliwych drzew pozostających w segmencie są nieco bardziej inteligentne (teraz uwzględnia to, że drzewa nie mogą sąsiadować). Wyodrębnia również najbardziej zewnętrzną pętlę, tak że w najgorętszej części algorytmu potrzeba mniej specjalnych przypadków.
Druga aktualizacja sprawia, że najbardziej zewnętrzna pętla działa równolegle na dostępnych procesorach (przy użyciu OpenMP), zapewniając liniowe zwiększenie prędkości. Jest to włączone tylko dla n> = 11, ponieważ narzut odradzających się wątków przewyższa zalety mniejszych sieci.
źródło
Java (OpenJDK 8) , oficjalny czas: 1,2 s na 12 x 12
edycja: już nie koduj golfa
Wypróbuj online!
Łącze TIO jest przeznaczone do skrzynki testowej 12x12. TIO zgłasza 2,429 dla czasu działania.
Pobiera na wejściu tablicę liczb całkowitych i modyfikuje tablicę, aby zawierała 1 dla drzew i 0 dla drzew innych niż drzewa.
Działa to dla wszystkich przypadków testowych. Największa walizka testowa działa na moim komputerze w niecałą sekundę, chociaż mam dość mocną maszynę
Kod testowy dla 12x12, można modyfikować dla innych
Produkuje to na moim komputerze:
źródło
Clingo , ≈ 7 ms dla 12 × 12, 116 bajtów
(Nowe linie są opcjonalne i nie są liczone).
Uruchom z
clingo plant.lp - -c n=<n>
gdzie<n>
jest rozmiar siatki. Format wejściowy jest listac(X,Y,Z).
instrukcji dla każdej komórki (X
,Y
) koloroweZ
, z ≤ 1X
,Y
,Z
≤n
, oddzielone spacją opcjonalnym. Dane wyjściowe obejmująt(X,Y)
dla każdego drzewa w (X
,Y
).Czas nie ma większego znaczenia, ponieważ jest to po prostu czas uruchamiania, więc rozważ to jako głos na większe przypadki testowe.
Próbny
Aby ułatwić obsługę formatu wejścia / wyjścia, oto programy w języku Python do konwersji zi do formatu podanego w wyzwaniu.
Wejście
Wynik
źródło