Kostki mogą być wykonane z sześciu kwadratów jako boków. Ale możesz również złożyć trzy prostokąty 2x1 na pół i skleić je ze sobą, tworząc sześcian. Teraz w tym wyzwaniu otrzymujesz zestaw elementów, z których każdy składa się z kwadratów, i musisz ustalić, czy możesz wybrać elementy, aby utworzyć kostkę jednostkową. Nie wszystkie elementy muszą być użyte, mogą pozostać jakieś resztki.
Detale
Elementy są podawane jako ciąg dwóch różnych znaków lub czarno-biały obraz lub dowolny dogodny format rastrowy 2D. Poniżej zakładam, że piksele tworzące kawałki są czarne, a tło jest białe.
Uważa się, że dwa piksele dzielące bok należą do tego samego elementu. Kawałki można składać tylko wzdłuż linii siatki oddzielających piksele i nie można ich ciąć. Każda strona sześcianu ma rozmiar jednego piksela, a każda strona sześcianu może być wykonana tylko z jednej warstwy.
Dane wyjściowe muszą być zgodne z prawdą lub falsey .
Przypadki testowe
Poniżej spacje są tłem, a symbole skrótu
#
reprezentują elementy.
(więcej do dodania)
Ważny
##
##
##
#
####
#
# # # # # # #
# ##
## #
Nieważny
###
###
# #
####
### ## ####
Uruchom następujący fragment kodu, aby uzyskać więcej przypadków testowych.
PS: To jest uogólnienie tego wyzwania
Odpowiedzi:
C,
824803 bajtówWypróbuj online!
... a zanim szczegółowo to wyjaśnię, warto zapoznać się z ogólnym przeglądem.
Podstawowy przegląd
Ten algorytm stosuje dopasowywanie wzorców do klasyfikowania każdego znalezionego poliomino z danym wzorcem jako jego podzbioru. Po dopasowaniu poliomino są one „nieoznaczone”, co wyklucza ich ponowne dopasowanie do wzorca. Początkowa klasyfikacja podana przez dopasowującego jest po prostu liczbą płytek w poliomino.
Matcher jest nakładany najpierw, aby zabić wszystkie poliominoe, których nie można złożyć na sześcian; klasyfikacja tych poliominos została odrzucona. Dopasowanie zakończy się sukcesem, jeśli te poliomino pojawią się w obrębie tych wyższych; dlatego zależy nam tylko na najmniejszym podzbiorze „rozwijanego” dla każdej klasy. Pokazano tutaj wraz z wyściełanymi kodowaniami wszystkie takie poliominoesy (z wyjątkiem ich odbić pionowych). Kodowanie wykorzystuje bity 4-0 każdego znaku do reprezentowania kwadratów w każdym rzędzie:
Po unicestwieniu tych poliomino dzielimy pozostałe poliomino na odpowiednie kategorie. Warto zauważyć, że w prawie wszystkich przypadkach można po prostu znaleźć pozostające poliominoes (te składane na kostkę) i po prostu wyszukać sumy sześciu. Istnieją dwa wyjątki:
Aby sprostać temu ograniczeniu, tworzymy 8 kategorii, od AH: A dla monomino (pojedyncze płytki), B dla domino, C dla puzonów narożnych, D dla puzonów liniowych, E dla tetromino linii, F dla innych tetromino, G dla pentominoes i H dla heksominoes. Wszystko, co nie należy do jednej z tych kategorii, jest po prostu ignorowane. Wystarczy polomino, które należą do każdej kategorii.
Na koniec zwracamy prawdę lub fałsz na podstawie gigantycznego równania i tych tabel.
Nie golfił z komentarzami
źródło