W tym konkursie musisz napisać program, który akceptuje czarno-biały obraz w pikselach i próbuje go zmienić, tak aby tworzył się biały kształt domenę gwiazdy , z jak najmniejszą liczbą zmian.
Dozwolone zmiany polegają na zamianie białych pikseli na czarne i zamianie czarnych pikseli na białe.
Wyjście musi ponownie składać się z tego samego obrazu, ale tym razem ze wszystkimi zmianami i oznaczonym środkiem /. Piksele, które zostały zmienione z białego na czarny, muszą być wyświetlane na niebiesko, te, które zostały zmienione z czarnego na biały, muszą być wyświetlane na żółto, a co najmniej jeden środkowy piksel musi być wyświetlony na czerwono. (Dokładne kolory zależą od Ciebie.) Program musi podać określony obraz, a także całkowitą liczbę wprowadzonych zmian.
Definicje
Domena gwiezdna
Zestaw białych pikseli obrazu reprezentuje domenę gwiazd, jeśli (i tylko wtedy) istnieje (przynajmniej) jeden środkowy piksel . Centrum pikseli jest jedną z białych pikseli, które mogą być conneced przez prostą do wszystkich innych białych pikseli tak, że linia przechodzi tylko białe piksele. (Dlatego środkowy piksel niekoniecznie jest unikalny).
Prosta linia między dwoma pikselami
Biorąc pod uwagę dwa piksele (początek i koniec, oba czerwone na ilustracji poniżej), linia prosta między dwoma pikselami składa się ze wszystkich pikseli, które dotykają linii (matematyczna, żółta na ilustracji poniżej), która prowadzi od środka pierwszego piksel do środka ostatniego piksela. Piksel nie dotyka linii, jeśli dotyka go tylko rogiem, więc aby piksel należał do linii piksela, linia (matematyczna, żółta) musi przecinać dany piksel o niezerowej długości. (Jeśli dotknie tylko punktu narożnego, uznaje się to za długość zero). Rozważ następujące przykłady:
Przykład
Pierwszy obraz powinien reprezentować przykładowe „wejście” testu, a dwa pozostałe obrazy przedstawiają dwa prawidłowe możliwe wyniki dla podanego przykładu:
Żółte obszary (wcześniej czarne) również liczą się do domeny „białej”, podczas gdy niebieskie obszary (wcześniej białe) liczą się do „czarnej” części poza domeną, a czerwona kropka za każdym razem reprezentuje jeden możliwy piksel środkowy.
Przypadki testowe
Następujące przypadki testowe to png o rozmiarze 256 x 256 pikseli.
Punktacja
Uruchom swój program z następującymi przypadkami testowymi i dołącz wynik (obraz / liczbę zmian) do swojej odpowiedzi. Zrobię tabelę wyników dla każdego przypadku testowego. Twój wynik będzie sumą każdego rankingu w tabeli liderów - im niższy wynik, tym lepiej. Obowiązują standardowe luki. Niedozwolone jest, aby program rozpoznał te przypadki testowe i uruchomił dla nich specjalne przypadki. (Niedozwolone jest wstępne obliczanie i zapisywanie optymalnych pikseli środkowych dla każdego z tych przypadków testowych.) Program powinien działać dla wszystkich obrazów.
Tabela liderów
Name | Score | 1 - rk | 2 - rk | 3 - rk | 4 - rk | 5 - rk | 5 - rk | Total Changes
------------+-------+------------+------------+------------+------------+------------+------------+--------------
Maltysen | 11 | 28688 - 2 | 24208 - 2 | 24248 - 1 | 7103 - 2 | 11097 - 2 | 13019 - 2 | 108363
TheBestOne | 7 | 0 - 1 | 13698 - 1 | 24269 - 2 | 103 - 1 | 5344 - 1 | 4456 - 1 | 47867
Odpowiedzi:
Java 8, 47 867 zmian ogółem.
Wykorzystuje średnią obrazu jako punkt środkowy. Następnie przyciąga wszystkie możliwe promienie do środka i daje najlepszy promień koloru. Następnie koloruje wszystkie nieprawidłowe punkty na czarno.
Wyniki
Zdjęcie 1 - 0 zmian, Zdjęcie 2 - 13 698 zmian
Zdjęcie 3 - 24 269 zmian, Zdjęcie 4 - 103 zmian
Zdjęcie 5 - 5 344 zmiany, Zdjęcie 6 - 4 456 zmian
Bez usuniętych nieprawidłowych pikseli, 42 782 zmian łącznie
Zielone piksele to pierwsza warstwa nieprawidłowych pikseli.
Zdjęcie 1 - 0 zmian, zdjęcie 2 - 9 889 zmian
Zdjęcie 3 - 24 268 zmian, Zdjęcie 4 - 103 zmian
Zdjęcie 5 - 4 471 zmian, Zdjęcie 6- 4 050 zmian
Wszystkie białe piksele na wszystkich zdjęciach mogą mieć linię rysowaną do nich od środkowego piksela, jeśli linia nie musi zaczynać się / kończyć w środkach, ale raczej w dowolnym miejscu piksela.
args[0]
zawiera nazwę pliku wejściowego.args[1]
zawiera nazwę pliku wyjściowego.Drukuje według
stdout
liczby zmian.źródło
Python - PIL -
216.228228 363 zmian ogółemWhoo! Przetnij go na pół dzięki @AJMansfield! Algorytm ten pomija wszystkie obawy związane z obliczaniem linii i optymalizacją.
Po prostu zmienia wszystkie białe kolory na czarne oprócz jednego. Jeśli nie ma białych, sprawia, że jeden jest biały i biały.Sprawdza, czy jest więcej białych lub czarnych i zmienia każdy inny z wyjątkiem jednego. Jeśli nie ma czerni, oznacza to (0, 0) środek.Wyniki
Zdjęcie 1 - 28688 zmian, Zdjęcie 2 - 24208 zmian
Zdjęcie 3 - 24248 zmian, Zdjęcie 4 - 7103 zmian
Zdjęcie 5 - 11097 zmian, Zdjęcie 6 - 13019 zmian
Pobiera nazwę pliku z raw_input i zapisuje do pliku out.png i wyświetla liczbę zmian.
źródło