Ten obraz powstał przez nałożenie na siebie 7 prostokątów o różnych kolorach:
Czarne i bordowe prostokąty nie są zasłonięte , to znaczy, żadne inne prostokąty nie są nad nimi.
Napisz program, który pobiera obraz taki jak ten, i usuń pojedynczy niezablokowany prostokąt, wysyłając obraz wynikowy.
Przykład
Jeśli uruchomiłeś program na powyższym obrazku i nadal uruchamiałeś go ponownie na wyjściu, może to wyglądać następująco.
Run 1 - Czarny usunięty (mógł być bordowy):
Run 2 - Maroon usunięty (tylko wybór):
Przebieg 3 - Żółty usunięty (tylko wybór):
Uruchom 4 - niebieski usunięty (mógł być zielony):
Uruchom 5 - Usunięto kolor zielony (tylko wybór):
Run 6 - Brązowy usunięty (tylko wybór):
Uruchom 7 - Usunięto czerwony (tylko wybór):
Wszelkie dodatkowe przebiegi powinny dawać ten sam biały obraz.
Mam nadzieję, że Stack Exchange nie skompresował żadnego z tych obrazów.
Obraz zawsze będzie miał białe tło, a każdy prostokąt będzie miał unikalny kolor RGB, który nie jest biały.
Możesz założyć, że obraz zawsze może być interpretowany jako zestaw nakładających się prostokątów. W szczególności można założyć, że w przypadku określonego koloru piksel o tym kolorze najbliższym górnej krawędzi obrazu jest częścią górnej krawędzi prostokąta tego koloru. To samo dotyczy dolnej, lewej i prawej krawędzi.
Na przykład na tym obrazie górna krawędź czerwonego prostokąta znajdowałaby się tuż poniżej dolnej krawędzi żółtego prostokąta, ponieważ pomarańczowy prostokąt zakrywał starą czerwoną górną krawędź:
Na tym obrazku czerwony prostokąt można najpierw usunąć (wraz z czarnym / bordowym / pomarańczowym / szarym):
Gdy kolejność dolnych prostokątów jest niejednoznaczna, możesz nadać im dowolną kolejność.
Na przykład lewy obraz tutaj może stać się środkiem lub prawą stroną:
Wyjście nie powinno mieć paradoksalnych nakładek (więc powinno być możliwe zrobienie tego za pomocą algorytmu malarza ). Na tym obrazku ( dzięki user23013 ) musiałby być zielony pod pomarańczowym prostokątem:
Dodatkowe Szczegóły
- Obraz i prostokąty mogą mieć dowolne wymiary.
- Prostokąty mogą dotykać ramki obrazu.
- Może być do 256 prostokątów 3 - 1.
- Jeśli wejście jest całkowicie białe, wyjście powinno również być.
- Możesz użyć bibliotek obrazów.
- Dane wejściowe powinny być nazwą pliku obrazu lub surowymi danymi obrazu. Może pochodzić ze standardowego wejścia lub wiersza poleceń.
- Dane wyjściowe można zapisać do tego samego lub innego pliku obrazu, wyrzucać na surowo do standardowego wyjścia lub po prostu wyświetlać.
- Dowolny typowy bezstratny format pliku obrazu truecolor jest dozwolony.
Zgłoszenie z najmniejszą liczbą bajtów wygrywa.
źródło
Odpowiedzi:
CJam, 241 bajtów
(z usuniętymi znakami nowej linii).
Używa formatu pliku ppm. Przykładowe użycie (przy użyciu ImageMagick):
Cóż, jest za długi i za wolny ... Działa na przykład około minuty.
Zmieniłem rozmiar przypadków testowych (i dodałem kilka innych), aby ułatwić testowanie.
Wygląda na to, że informacje o przestrzeni kolorów zostały utracone, więc kolory są nieco inne.
źródło
Python,
690651610606594569 bajtówSkrypt odczytuje nazwę obrazu ze standardowego wejścia.
Wykrywa krawędzie każdego prostokąta, sortuje je według liczby różnych kolorów, które zawierają (niezablokowane prostokąty zawierają tylko 1 kolor, a następnie pojawiają się na końcu listy)
Ta lista służy do przerysowania obrazu. Kolejność przerysowywania jest ustalana przez wybranie permutacji listy, która generowałaby obraz wyjściowy, który miałby najmniejszą różnicę pikseli w danych wejściowych.
źródło
Java - 1483 bajtów
Nie jestem świetnym golfistą, niech to będzie jasne; więc gadatliwość nie jest całkowicie winą Javy ;-) Niemniej jednak wydawało się, że to naprawdę zabawne wyzwanie. Rozwiązałem to w sposób, który - myślę - jest trochę nudny i gadatliwy, ale hej. Działa, jest (względnie) szybki, a zwłaszcza fajnie!
Pomysł jest następujący: Sprawdź każdy piksel, zaczynając od lewego górnego rogu, aż do prawego dolnego rogu. Czy to biały piksel? Ignorować. Czy to jest kolorowe? Fajnie, śledźmy go i spróbujmy określić jego granice (lewy górny, prawy górny, lewy dolny, prawy dolny).
Po zakończeniu sprawdź obszar każdego prostokąta. Czy zawiera inny kolor niż kolor prostokąta? Następnie dowiedz się, jaki prostokąt należy do tego koloru i zaktualizuj indeks Z pokrywającego się z nim o 1.
Na koniec narysuj wszystkie prostokąty, biorąc pod uwagę wskaźniki Z. Działa właściwie jak indeks Z znany z CSS i innych materiałów 3D. Prostokąty o najniższym indeksie Z są rysowane jako pierwsze, a najwyższe - indeks Z na końcu.
Pełny kod, który jest nieco - i to mało powiedziane ;-) - napisany jaśniej, można znaleźć tutaj: http://pastebin.com/UjxUUXRp
Teraz, gdy widzę poddanie się dietera, mogłem ułatwić niektóre części. Naprawdę nie jest konieczne znalezienie prostokąta, którego kolor nachodzi na inny prostokąt. Mógłbym po prostu policzyć liczbę kolorów „inwazji”.
źródło