Wkład
Twój wkład w to wyzwanie jest listą liczb całkowitych. Reprezentują południowo-zachodnie rogi kwadratów jednostek na płaszczyźnie, a lista przedstawia ich związek jako podzbiór płaszczyzny. Na przykład lista
[(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)]
przedstawia czerwony zestaw na tym obrazku:
Wydajność
Dane wyjściowe to lista poczwórnych liczb całkowitych reprezentujących prostokątne podzbiory płaszczyzny. Mówiąc (x,y,w,h)
ściślej, czteroosobowy przedstawia prostokąt o szerokości w > 0
i wysokości, h > 0
którego południowo-zachodni róg jest (x,y)
. Prostokąty muszą tworzyć dokładne pokrycie obszaru wejściowego, w tym sensie, że każdy z kwadratów jednostkowych jest podzbiorem jakiegoś prostokąta, każdy prostokąt jest podzbiorem regionu, a dwa prostokąty mogą zachodzić na siebie tylko na swoich granicach. Aby zabronić trywialnych rozwiązań, pokrycie nie może zawierać dwóch prostokątów, które można połączyć w większy prostokąt.
Na przykład lista
[(0,0,2,1),(0,1,3,1),(1,2,2,1)]
reprezentuje ochronę prawną
z powyższego regionu, natomiast pokrycie udzielone przez
[(0,0,2,2),(2,1,1,1),(1,2,1,1),(2,2,1,1)]
jest nielegalne, ponieważ sąsiednie kwadraty 1 na 1 można połączyć:
Zasady
Możesz podać pełny program lub funkcję. Dokładne formatowanie danych wejściowych i wyjściowych nie jest ważne z uzasadnionego powodu. Wygrywa najkrótsza liczba bajtów, a standardowe luki są niedozwolone. Zachęcamy do wyjaśnienia swojego algorytmu i kilku przykładowych wyników.
Przypadki testowe
Region w kształcie litery U:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(2,0),(2,1),(3,0),(3,1),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5)]
Duży trójkąt:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(3,0),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(7,0),(7,1),(7,2),(8,0),(8,1),(9,0)]
Kwadrat z otworami:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(3,0),(3,1),(3,2),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,7),(5,8),(5,9),(6,1),(6,2),(6,3),(6,5),(6,6),(6,7),(6,8),(6,9),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(7,7),(7,8),(7,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,4),(9,5),(9,6),(9,7),(9,8),(9,9)]
Odłączone regiony:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,6),(1,7),(1,8),(1,9),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(4,0),(4,1),(4,2),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(5,7),(5,8),(5,9),(6,0),(6,1),(6,2),(6,4),(6,5),(6,6),(6,7),(6,8),(6,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,7),(9,8),(9,9),(10,0),(10,1),(10,2),(10,3),(10,4),(10,5),(10,6),(10,7),(10,8),(10,9)]
Weryfikator
Użyj tego programu Python 2, aby zweryfikować swoje rozwiązanie. Pobiera ze STDIN listę krotek (dane wejściowe) i listę poczwórnych (dane wyjściowe), oddzielonych przecinkiem.
Napisałem również ten program w języku Python 2 do generowania zdjęć i możesz go również używać. Pobiera ze STDIN listę krotek lub poczwórnych i tworzy plik o nazwie out.png
. Wymaga biblioteki PIL. Jeśli chcesz, możesz zmienić rozmiar komórek siatki i szerokość linii podpaskowych.
3-h
, aby~h
?Python -
272261258251224Myślę, że mogę bardziej golfa.
Jestem pewien, że to działa, ale jeszcze nie skończyłem testowania na wszystkich testowych przypadkach.Skończyłem testować. Działa dla wszystkich przypadków testowych.Pracuję nad dodaniem zdjęć wyników.Edycja: Oto wyniki z przykładu i przypadków testowych:Próbuję napisać to w Perlu, ale nie potrafię wymyślić, jak uzyskać wielowymiarowe tablice ze standardowego wejścia bez ogromnej liczby znaków. Czy ktoś ma jakieś sugestie?
źródło
(i[0]+w,i[1]+j)not in c
do{(i[0]+w,i[1]+j)}-c
i możesz przejśćw=h=1
doc=set(a)-set(b)
liniib+=[(j+i[0],k+i[1])]
dob+=(j+i[0],k+i[1]),
i używaszrange
trzy razy, więc przypisanie jest krótszer=range
x,y=i
za pomocąx
iy
zamiasti[0]
ii[1]
? Pozwoliłoby to zaoszczędzić wiele bajtów.while not[j for j in r(h)if(x+w,y+j)not in c]:w+=1
używaćwhile all((x+w,y+j)in c for j in r(h)):w+=1
.Python 2, 139
Program akceptuje listy uporządkowanych par otoczonych nawiasami klamrowymi na standardowym wejściu. Na przykład,
{(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)}
Często denerwujące (nie tylko w golfie) jest to, że Python nie pozwala na przypisanie w teście pętli. Aby obejść ten problem, użyłem operacji formatowania łańcucha.
źródło
Mathematica -
315 285267 bajtówZ pewną pomocą @ MartinBüttner.
Nie golfowany:
Stosowanie:
Przypadki testowe
Region w kształcie litery U.
Duży trójkąt
Kwadrat z dziurami
Odłączone regiony
źródło
Haskell, 158
przypadki testowe i zdjęcia będą wkrótce dostępne.
Algorytm: weź pierwszy kwadrat. Dotrzyj jak najdalej w prawo, nie napotykając kwadratu poza wejściem. Następnie sięgnij tak daleko, jak to możliwe, bez kwadratu na wejściu. Teraz mamy prostokąt bez brakującego kwadratu. Dodaj go do wyjścia, usuń wszystkie jego kwadraty z wejścia i wywołaj rekurencyjnie.
źródło
not$all(\x->elem(x,i)s)
goany(\x->notElem(x,i)s)
.JavaScript (ES6) 148
155 199Edycja2 Jeszcze więcej tuningu
Edytuj Niektóre golfa + przepisz używając rekurencji. Nie spodziewałem się takiej redukcji. Teraz jest trochę trudny do naśladowania, ale algorytm jest taki sam.
Algorytm jest podobny do odpowiedzi @jakube.
Tak? Pierwszy element rośnie, drugi element jest usuwany, zacznij od kroku 2 W przeciwnym razie
przejdź do następnego elementu
Testuj we fragmencie
źródło
Mathematica,
153 151 144 136133Przykład:
Wkład:
Wydajność:
Wkład:
Wydajność:
Algorytm:
Przykryj region kwadratami jednostek, a następnie scal je.
źródło