Za pomocą Algodoo i Paint wykonałem te sześć monochromatycznych obrazów o wymiarach 300 × 300 i czterech wygodnych kształtach:
Ta klasa obrazów ma następujące właściwości:
- Są one zawsze w rozmiarze 300 × 300 pikseli, monochromatyczne (tylko czarno-białe) i mają dokładnie cztery białe obszary odpowiadające kwadratowi, okręgowi, trójkątowi i zębatce.
- Kształty nigdy się nie nakładają ani nie dotykają się, ani nie dotykają obramowania obrazu ani nie wychodzą poza granice.
- Kształty zawsze mają ten sam rozmiar, ale można je dowolnie obracać i ustawiać.
(Kształty mają również równe obszary, chociaż przy takim rastrowaniu ich liczba pikseli prawdopodobnie nie będzie dokładnie równa.)
Wyzwanie
Napisz najkrótszy możliwy program lub funkcję, która pobierze nazwę pliku takiego obrazu i zamieni wszystkie białe piksele ...
- czerwony,
(255, 0, 0)
jeśli są na kwadracie. - niebieski,
(0, 0, 255)
jeśli są w kole. - zielony,
(0, 255, 0)
jeśli są w trójkącie. - żółty,
(255, 255, 0)
jeśli są na biegu.
na przykład
Detale
Twój program powinien działać skutecznie dla wszystkich możliwych obrazów wejściowych. (Wprowadzone zostaną tylko prawidłowe obrazy monochromatyczne 300 × 300). Sześć obrazów, które przedstawiłem, są jedynie przykładami, możesz nie zakodować na stałe ich wyników w swoim programie.
Nie wolno używać bibliotek lub funkcji komputerowych, wbudowanych ani zewnętrznych. Chodzi o to, aby to zrobić za pomocą własnych operacji na poziomie pikseli. Możesz użyć bibliotek obrazów, które po prostu pozwalają otwierać i modyfikować obrazy (np. PIL dla Pythona).
Możesz używać dowolnych popularnych bezstratnych formatów plików obrazu do wprowadzania i wyprowadzania, o ile trzymasz się schematu kolorów.
Możesz pobrać nazwę pliku obrazu jako argument funkcji, ze standardowego wejścia lub z wiersza poleceń. Obraz wyjściowy można zapisać w nowym pliku, tym samym pliku lub po prostu wyświetlić.
Punktacja
Zgłoszenie z najmniejszą liczbą bajtów wygrywa. Mogę przetestować zgłoszenia za pomocą dodatkowych zdjęć, aby ustalić ich ważność.
źródło
Odpowiedzi:
J -
246,224185 bajtówTo była świetna zabawa!
Ponownie wykorzystałem część połączonych komponentów, której użyłem do wyzwania „Jestem w największym pokoju” , i zastosowałem stosunek między średnią a maksymalną odległością wszystkich punktów do centrum każdego komponentu. Postawiłem na to, ponieważ jest ona niezmienna zarówno pod względem skali, jak i rotacji, i najwyraźniej wystarczająco dobra, aby rozróżnić kształty, które zostały podane. Ranking tej wartości od niskiej do wysokiej daje mi koło zamówienia, koło zębate, kwadrat i trójkąt, używane do permutacji mapy kolorów.
Wyświetla wynik za pomocą dodatku viewmap. Nie użyto żadnych przyborników oprócz odczytu i wyjścia plików.
Wytrzymałość nie wydaje się być wymogiem, to usuwa 18 bajtów. 2 więcej niepotrzebne przestrzenie zastąpione
&.>
przez&>
wratio
a&.:
o&:
w dcent przez kolejne 2 bajty.Ogromny wzrost zarówno krótkości, jak i wydajności
comp
dzięki zmianie biegów zamiastcut
(;.
). W ten sposób obraz jest replikowany i przesuwany we wszystkich 8 kierunkach zamiast skanowania go za pomocą okna 3x3.Ta
id
funkcja była absurdalnie skomplikowana pod względem tego, co musiała zrobić. Teraz przypisuje identyfikatory do pikseli w obiektach poprzez pomnożenie obrazu przez tablicę unikalnych liczb, a tym samym ustawienie BG na zero.Kod nieco bardziej wyjaśniony:
Ten jest nieco długi, aby szczegółowo wyjaśnić, ale zrobi to, jeśli będzie zainteresowanie.
źródło
Mathematica,
459392 bajtówNie golfowany:
Mógłbym zaoszczędzić 6 bajtów, zamieniając się
m=1.Mean@a;m=#-m&/@a;
wm=#-Mean@a&/@a;
, ale to znacznie skraca czas wykonania, co jest denerwujące dla testowania. (Zauważ, że są to dwie optymalizacje: wyciągnięcie obliczeniaMean@a
poza pętlą i użycie dokładnych typów symbolicznych zamiast liczb zmiennoprzecinkowych. Co ciekawe, użycie dokładnych typów jest o wiele bardziej znaczące niż obliczanie średniej w każdej iteracji.)To jest podejście numer trzy:
Teraz dla wszystkich pikseli w kształcie wykreślmy odległość od kąta względem kąta do tego środka:
Trójkąt ma 3 wyraźne maksima, kwadrat 4, koło zębate 16, a koło ma tony, ze względu na aliasing wahań wokół stałego promienia.
150
jest maksymalny.Dla przypomnienia, jeśli użyję pomysłu Ella i po prostu posortuję regiony według największej odległości między dowolnym pikselem a środkiem, mogę to zrobić w 342 bajtach:
Ale nie zamierzam z tym konkurować, dopóki wszyscy inni używają swoich własnych oryginalnych algorytmów, zamiast grać w golfa algorytmami innych.
źródło
Java,
1204113210871076Aby udowodnić sobie, że mogę to zrobić.
Dołączyłem import tuż obok deklaracji funkcji; aby to zadziałało, musiałyby znajdować się poza klasą:
Niegolfowane (i możliwe do uruchomienia; tj. Dodana płyta kotła)
Działa to poprzez iterowanie każdego piksela obrazu i wypełnianie zalewaniem za każdym razem, gdy docieramy do „dziury”. Każdy wynik wypełnienia dodajemy jako
Set<Point>
doSet
. Następnie określamy, który kształt jest który. Odbywa się to poprzez sprawdzenie liczby pikseli brzegowych kształtu. Zdefiniowałem granicę jako ruch rycerza od czarnej płytki, ponieważ pozostałaby ona bardziej stała między rotacjami i tym podobne. Kiedy to robimy, staje się jasne, że kształty można sortować według tej wartości: koło, kwadrat, trójkąt, koło zębate. Więc sortuję i ustawiam wszystkie piksele tego kształtu na właściwy kolor.Zauważ, że obraz, do którego piszę, nie jest pobierany bezpośrednio z pliku, ponieważ gdybym to zrobił, Java traktowałaby obraz jako czarno-biały, a wypełnienie kolorami nie działałoby. Więc muszę stworzyć własny obraz z
TYPE_INT_RGB
(który jest1
). Zauważ też, że obraz, nad którym pracuję, jest302
autorstwa302
; Dzieje się tak, aby algorytm odległości rycerza nie musiał się martwić próbą odczytania obrazu poza granicami. Naprawiam tę rozbieżność, dzwoniąci.getSubImage(1,1,300,300)
. Uwaga: mogłem zapomnieć o rozwiązaniu tego problemu podczas przesyłania zdjęć, w których to przypadkach obrazy są o 2 piksele za szerokie, ale poza tym powinny być poprawneFunkcja zastąpi plik, do którego ścieżka została przekazana. Dane wyjściowe:
źródło
Pyton,
571 567528 bajtówPodobnie jak w rozwiązaniu Quincunx, zaczyna się od wypełnienia każdego kształtu indeksem od 1 do 4. Następnie określa tożsamość kształtów na podstawie promienia ich ograniczającego okręgu. Paleta kolorów jest odpowiednio skonstruowana, a obraz jest zapisywany jako obraz w kolorze indeksowanym.
EDYCJA: Pominięto fakt, że kształty mają gwarancję, że nie dotykają ramki obrazu. Zatem jest krótszy!
Pobiera wejściową nazwę pliku w wierszu poleceń i zapisuje dane wyjściowe w
o.png
.źródło
Mathematica 225
Aktualizacja :
PO zdecydował, że to podejście wykorzystuje funkcje widzenia komputerowego, więc nie jest już aktywne. Zostawię to jednak opublikowane. Być może ktoś może go zainteresować.
ImageData
zwraca obraz jako macierz zer i jedynek.Flatten
konwertuje tę macierz na listę.Morphological Components
znajduje 4 klastry pikseli i przypisuje odrębną liczbę całkowitą 1, 2, 3, 4 do każdego piksela zgodnie z klastrem. 0 jest zarezerwowane dla (czarnego) tła.ComponentMeasurements
sprawdza kołowość klastrów.Od najbardziej do najmniej okrągłego zawsze będzie: koło, kwadrat, trójkąt i koło zębate.
ReplacePart
zastępuje każdą liczbę całkowitą składową odpowiednim kolorem RGB, stosując sortowanie według kołowości.Partition...Dimensions[m][[2]]
pobiera listę kolorów pikseli i zwraca macierz o takich samych wymiarach jak obraz wejściowy.Image
konwertuje matrycę kolorów pikseli na kolorowy obraz.źródło
f@i_:=Image[#/.Append[Thread[Ordering[Last/@ComponentMeasurements[#,"Circularity"]]->{Yellow,Green,Red,Blue}],0->Black]]&@MorphologicalComponents@i
{RGBColor[1, 0, 0], RGBColor[0, 1, 0], RGBColor[0, 0, 1], RGBColor[1, 1, 0]}
gdzie 1 odpowiada 255. Nie użyto bibliotek.MorphologicalComponents
spełnia on lub narusza Twoje zasady. Kiedy już wiadomo, do którego klastra należy każdy piksel, istnieje wiele sposobów, w tym surowa liczba pikseli, w celu ustalenia, która figura jest która.(255,0,22)
gdy sprawdzam w Paint). Nie mam Mathematica, więc nie mogę biegać, żeby się upewnić.Mathematica,
354345314291288Wciąż gra w golfa, może zostać skrócony o kilka znaków, ale wydajność staje się nie do zniesienia. Używa wariancji do identyfikacji kształtów:
Z odstępami:
Testowanie:
Tutaj jest całkowicie bez golfa. Dodają wyjaśnienia później:
źródło
Python,
579577554514502501 bajtówDla każdego kształtu wypełnij go, a następnie oblicz odległość między środkiem ciężkości a najdalszym punktem.
wtedy rzeczywista powierzchnia kształtu jest porównywana z powierzchnią trójkąta, kwadratu, tarczy lub koła, które miałyby ten sam rozmiar.
źródło
C # 1086 bajtów
Jeszcze jedno rozwiązanie wypełniające, tylko dla przypomnienia, ponieważ nie ma tutaj wersji C #. Podobnie jak Quincunx, chciałem udowodnić, że potrafię to zrobić i jego podejście do Javy nie ma większych trudności.
Akceptuje każdy format obrazu.
Prawdopodobnie można go rozebrać o kilka znaków, usuwając wszystkie elementy statyczne i tworząc instancję programu.
Wersja do odczytu:
Gra w golfa:
źródło