WYZWANIE
Biorąc pod uwagę zestaw zgrupowanych liter, ułóż je na planszy, tak aby pokrywały cały obszar.
Przedstawicielstwo zarządu (inaczej SHECK DECK)
- Plansza to siatka 6x6.
- Zawsze będzie 36 kwadratów ogółem.
- Kolumny są oznaczone AF.
- Rzędy są oznaczone 1-6.
Przykład:
A B C D E F
+---+---+---+---+---+---+
1 : : : : : : :
+---+---+---+---+---+---+
2 : : : : : : :
+---+---+---+---+---+---+
3 : : : : : : :
+---+---+---+---+---+---+
4 : : : : : : :
+---+---+---+---+---+---+
5 : : : : : : :
+---+---+---+---+---+---+
6 : : : : : : :
+---+---+---+---+---+---+
WEJŚCIE (inaczej CRATES)
- Wielowierszowy ciąg zawierający zestaw zgrupowanych liter.
- Skrzynie są wykonane z grup identycznych liter.
- Skrzynie są NIEZWYKŁE, co oznacza, że nie można ich obracać ani odwracać.
- Punkt początkowy każdej skrzynki znajduje się w lewym górnym rogu (należy wziąć to pod uwagę przy przenoszeniu skrzyni na pokład).
- Od lewego górnego punktu skrzyni następujące identyczne kwadraty mogą znajdować się tylko w prawo lub poniżej.
- Każda litera może być użyta do przedstawienia skrzynki. Skrzynie zaczynają się zawsze od litery
[a]
i przesuwają w górę alfabetu. - Skrzynie są oznaczone literą (tzn. Skrzynia A, skrzynia B itp.)
- Liczba skrzyń może się różnić (pomimo podanych przykładów nie zawsze jest to 10).
- W każdym wierszu są 24 znaki oddzielające każdy blok skrzynek. (początek [a] na początek [b] oddzielony 24 znakami itp.)
Przykład:
[a][a][a] [b] [c][c]
[a] [b][b][b] [c]
[a] [b][b]
[d] [e] [f][f][f][f][f]
[d][d] [e]
[d][d] [e]
[e]
[e][e]
[g] [h] [i]
[g] [i]
[i]
WYNIK
Wymagane jest wydrukowanie szeregu poleceń, które umieszczają skrzynki na pozycjach na pokładzie, tak aby były całkowicie zakryte (bez pustych przestrzeni).
Format polecenia wygląda następująco:
HAUL <crate> TO <column> <row>
tj. ODPOWIEDŹ DO 1
Dla wyjaśnienia, zawsze będzie rozwiązanie dla podanych danych wejściowych.
TESTY <- Kliknij, aby uzyskać więcej.
Wejście
[a][a][a] [b] [c][c][c]
[a][a] [b]
[a] [b][b]
[b][b]
[d] [e] [f]
[d] [f]
[d] [f]
[d]
[d]
[g][g] [h] [i]
[i][i]
[i]
[i][i]
[j][j][j]
Wynik
HAUL I TO A 1
HAUL B TO A 3
HAUL A TO B 1
HAUL J TO D 6
HAUL D TO F 1
HAUL F TO E 1
HAUL C TO C 5
HAUL G TO D 4
HAUL E TO D 3
HAUL H TO C 6
Wynik:
A B C D E F
+---+---+---+---+---+---+
1 : i : a : a : a : f : d :
+---+---+---+---+---+---+
2 : i : i : a : a : f : d :
+---+---+---+---+---+---+
3 : b : i : a : e : f : d :
+---+---+---+---+---+---+
4 : b : i : i : g : g : d :
+---+---+---+---+---+---+
5 : b : b : c : c : c : d :
+---+---+---+---+---+---+
6 : b : b : h : j : j : j :
+---+---+---+---+---+---+
PUNKTACJA
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w postaci.
code-golf
sequence
decision-problem
parsing
board-game
Jonathan Picazo
źródło
źródło
Odpowiedzi:
Python 3.6,
435437385331 bajtówZadzwoń
F()
za pomocą sznurka skrzyni.Udało się golfowi o wiele więcej:
re
biblioteki.Przebudowano kod, aby usunąć zbędne pętle.
Poprzedni kod zbudował listę wszystkich pozycji skrzyni w,
F()
a następnie iterował ją po liścieR()
. Nowy kod tworzy jedną pozycję skrzynkiF()
iR()
wypróbowuje wszystkie możliwe pozycje.W poprzednim kodzie
R()
zebrano możliwe rozwiązanie w,a
aF()
następnie iterowano nad zwróconym rozwiązaniem. W nowym kodzieR()
drukuje polecenia HAUL bezpośrednioWyjaśnienie
Podstawową ideą jest przedstawienie pokładu statku i skrzyń jako map bitowych. Używając map bitowych, przenoszenie skrzynki staje się przesunięciem jej mapy bitowej, a sprawdzanie nakładania się skrzynek staje się bitowe ORAZ i testowanie na zero.
Nieskluczony kod:
F()
analizuje ciąg definicji skrzyni i buduje mapy bitowe. Wyrażenie regularne przeszukuje (wiersz 9) każdy wiersz ciągu definicji skrzyni w poszukiwaniu skrzynek (litera, po której następuje „]”). Po znalezieniu dopasowania odpowiadające mu (wiersz, kolumna) jest dodawane do słownika wpisanego literą (wiersze 11–13). Na przykład ciąg definicji skrzyni podany w problemie:Współrzędne każdej skrzyni są znormalizowane (linia 17), tak że każda skrzynia zaczyna się od (0,0), a każdy blok ma szerokość jednej jednostki (zamiast 3 a la „[a]”).
Następnie dla każdej skrzynki tworzona jest mapa bitowa na podstawie znormalizowanych współrzędnych (linia 18).
Talia jest traktowana jako siatka 7 x 7. Kolumna „G” i rząd 7 służą do wykrywania, kiedy kształt wychodzi poza planszę. Mapa bitowa ma wartość 1, jeśli skrzynki zajmą odpowiedni kwadrat na pokładzie. Bity 48 do bitów 42 odpowiadają kwadratom A1 do A7, bity 41 do 35 odpowiadają kwadratom B1 do B7 i tak dalej.
R(used, bitmaps)
następnie używa map bitowych do rekurencyjnego wyszukiwania miejsc skrzynek, które nie próbują umieścić dwóch skrzynek w tym samym kwadracie.used
to maska bitowa wskazująca, których kwadratów nie można użyć, ponieważ są już zajęte przez skrzynię lub ponieważ znajdują się poza planszą (tj. kolumna G i wiersz 7).bitmaps
to lista skrzyń, które wciąż muszą zostać umieszczone.Podstawowym przypadkiem rekurencji jest sytuacja, gdy nie ma już więcej skrzynek do umieszczenia, tzn.
bitmaps
Jest pusta (wiersz 23). W takim przypadku zwracana jest wartość True, aby wskazać, że znaleziono rozwiązanie.W przeciwnym razie nazwa skrzynki i jej mapa bitowa zostaną usunięte z listy map bitowych (linia 26). Chociaż mapa bitowa skrzynki nie jest pusta (wiersz 28), sprawdź, czy bieżące położenie skrzynki, reprezentowane przez mapę bitową skrzynki, powoduje konflikt z poprzednio umieszczonymi skrzynkami. Na linii 29,
not used & crate_bitmap
jest False jeśliused
icrate_bitmap
oba mają 1 w tej samej pozycji bitowej, co wskazuje na konflikt. Jeśli nie ma konfliktu,R()
nazywa się rekurencyjnie (linia 30), aby spróbować umieścić pozostałe skrzynki.Jeśli rekurencyjne wezwanie do
R()
zwrócenia True, oznacza to, że znaleziono rozwiązanie i że bieżące umieszczenie skrzynek jest częścią tego rozwiązania. Tak więc odpowiednie polecenie przesunięcia skrzynek jest drukowane, a True jest propagowany w górę wywołań rekurencyjnych (wiersze 31–32).Po utworzeniu w
F()
, każda mapa bitowa skrzynki reprezentuje kwadraty talii, które byłyby zajęte przez skrzynki, gdyby były umieszczone w pozycji A1. Przesunięcie mapy bitowej o jeden bit w prawo odpowiada przesunięciu skrzynek do pozycji A2. Siedmiobitowe przesunięcie w prawo odpowiada przesunięciu skrzynek do B1 itp. Na przykład następujące mapy bitowe przedstawiają skrzynki „a” w różnych pozycjach:Jeśli możliwe umieszczenie skrzynek nie działa, ponieważ powoduje konflikt z wcześniej umieszczoną skrzynią (linia 30) lub ponieważ nie ma prawidłowego umieszczenia pozostałych skrzyń (linia 31). Skrzynie są przenoszone w inne miejsce, przesuwając maskę bitową w prawo o jeden bit (linia 35).
Shift
śledzi, o ile miejsc została przesunięta mapa bitów, co odpowiada bieżącej pozycji skrzynek.Jeśli mapa bitowa jest pusta (zero), oznacza to, że wypróbowano wszystkie możliwe położenia. Fałsz jest zwracany (linia 37), aby wskazać awarię, dlatego wezwanie do
R()
wcześniejszej rekurencji spróbuje użyć innego miejsca dla swoich skrzynek.Aby upewnić się, że skrzynie nie wystają z boku pokładu, bity odpowiadające kolumnie G i rzędowi 7 są ustawiane
used
dla pierwszego wywołania doR()
(linia 20).4432676798719
jest pustą talią odpowiadającą0b0000001000000100000010000001000000100000011111111
źródło
Python 2 , 864 bajty
Wypróbuj online!
Wyjaśnienie
Wiele bajtów jest używanych do analizowania dwuwymiarowych skrzynek wprowadzanych przez pojedynczy ciąg. Skrzynie są reprezentowane jako zagnieżdżona lista wartości boolowskich.
Po przeanalizowaniu skrzynek funkcja uwzględnia wszystkie możliwe pozycje wszystkich skrzynek. Aby to zrobić, iteracyjnie się nazywa. Kiedy znajdzie niemożliwą pozycję (jeśli skrzynia zostanie umieszczona poza pokładem lub na innej skrzyni), zabija bieżącą gałąź drzewa rekurencji, aby poprawić wydajność.
Kiedy zobaczy, że pewna kombinacja miejsc zaowocowała całkowicie zakrytym pokładem, drukuje zapisaną historię umieszczania skrzyń i globalnie wychodzi, próbując dokonać beznadziejnego podziału. Wydrukowane instrukcje transportu są nawet sortowane alfabetycznie.
Python 2 , 812 bajtów
Wypróbuj online!
Wyjaśnienie
Łańcuch skrzyni jest analizowany i przekształcany w wymienione gniazdo booleanów reprezentujących każdą skrzynię.
Funkcja iteracyjna generuje wszystkie możliwe listy długości równe liczbie podanych skrzyń zawierających liczby całkowite
0 <= x < 36
(wszystkie możliwe pozycje na pokładzie statku). Każda lista jest interpretowana jako instrukcja pozycjonowania wszystkich skrzynek i testowana. Jeśli testowana lista instrukcji daje talię bez pustych miejsc, lista instrukcji musi być ważna i zostanie wydrukowana.Będąc wyjątkowo nieefektywnym, nie testowałem tego na dostarczonym przypadku testowym, choć w scenariuszach z mniejszą liczbą skrzynek (patrz link TIO). Ponieważ algorytm przeszukuje każdy możliwy układ, próbuje na nie spojrzeć
36**10 = 3.656e15
. Jednak teoretycznie powinno to nadal działać.źródło
H
/M
z deklaracji funkcji, ponieważ posiadanie ich w deklaracji sprawia, że funkcji nie można ponownie użyć. Dobry stary Python.[i]
ze[b]
to działa . Algorytm można ulepszyć, najpierw sortując skrzynie, aby większe były testowane przed małymi.JavaScript, 366
Uwaga: ta funkcja może analizować bardziej kompaktowe dane wejściowe, ponieważ nie zależy na odstępach między 24 znakami, a otwory w skrzyniach są dozwolone.
Myślę, że można by trochę bardziej zagrać w golfa, ale teraz jest krótki i nie jest zbyt wolny, więc lubię to tak, jak jest
Mniej golfa
Testuje wiele przypadków
źródło