Biorąc pod uwagę obraz, który ma tylko czarno-białe piksele i lokalizację (x, y), która jest białym pikselem, pokoloruj białe piksele na podstawie ich minimalnej odległości na Manhattanie od (x, y) na ścieżce, która obejmuje tylko przemieszczenie innych białych pikseli.
Odcienia barwnego pikseli muszą być proporcjonalne do odległości od (x, y), a więc na pikselu (x, y) będą miały odcień w zakresie od 0 ° (czysty kolor czerwony), a piksele najdalej z (x, y), będzie miał odcień 360 ° (także czerwony), a pozostałe odcienie będą płynnie i liniowo mieszać się między nimi. Nasycenia i wartość musi być zarówno 100%.
Jeśli biały piksel nie jest podłączony do (x, y) przez inne białe piksele, musi pozostać biały.
Detale
- Dane wejściowe będą składały się z nazwy pliku obrazu lub nieprzetworzonych danych obrazu oraz liczb całkowitych xiy.
- Obraz wyjściowy można zapisać do pliku lub przesłać strumieniowo na standardowe wyjście w dowolnym standardowym formacie pliku obrazu lub po prostu wyświetlić.
- Wartość x wynosi 0 na skrajnych lewych pikselach i zwiększa się w prawo. Wartość y wynosi 0 w najwyższych pikselach i rośnie w dół. (x, y) zawsze będzie w granicach obrazu.
- Dozwolone są zarówno pełne programy, jak i funkcje.
Najkrótszy kod w bajtach wygrywa.
Przykłady
Wszystkie te obrazy zostały zmniejszone, aby zaoszczędzić miejsce. Kliknij je, aby wyświetlić w pełnym rozmiarze.
Obraz wejściowy:
(x,y) = (165,155)
i (x,y) = (0,0)
Obraz wejściowy i wyjściowy za pomocą (x,y) = (0,0)
:
Obraz wejściowy i wyjściowy za pomocą (x,y) = (600,350)
:
Obraz wejściowy i wyjściowy za pomocą (x,y) = (0,0)
:
Obraz wejściowy i wyjściowy za pomocą (x,y) = (0,0)
:
Opcjonalny bonus -30%: użyj odległości euklidesowej. Sugestia dla twojego algorytmu jest następująca (ogólny zarys):
- Mają piksel początkowy.
- Wypełnienie z tego piksela.
- Dla każdego piksela osiągniętego w wypełnieniu powodziowym
- Przejście od piksela początkowego do tego piksela w krokach co pół jednostki, w linii prostej.
- Na każdym kroku zastosuj
int()
do współrzędnych xiy. Jeśli piksel na tych współrzędnych jest czarny, zatrzymaj się. W przeciwnym razie kontynuuj. (Jest to metoda widoczności.) - Każdy osiągnięty piksel, który otacza biały piksel i / lub piksel, który był wcześniej oznaczony znacznie większą odległością (tj. +10), staje się pikselem początkowym.
W bardziej meta sensie, algorytm ten rozciąga się na każdy piksel osiągalny w linii prostej od pikseli początkowych / już kolorowych, a następnie „cali” wokół krawędzi. Bit „znacznie większej odległości” ma na celu przyspieszenie algorytmu. Szczerze mówiąc, tak naprawdę nie ma znaczenia, w jaki sposób wdrażasz odległość euklidesową, po prostu musi wyglądać mniej więcej tak.
Tak wygląda pierwszy przykład z odległością euklidesową przy użyciu powyższego algorytmu:
Wprowadź obraz i (x,y) = (165,155)
Bardzo dziękuję Calvin'sHobby i trichoplax za pomoc w napisaniu tego wyzwania! Baw się dobrze!
źródło
Odpowiedzi:
Matlab,
255 245231 bajtówOczekuje to najpierw nazwy obrazu, a potem
y
i potemx
.Zaimplementowałem wypełnienie zalewowe (lub `` dijkstra dla 4 dzielnic '', jeśli chcesz) z grubsza, najpierw tworząc maskę, w której piksel początkowy jest ustawiony na 1, i z akumulatorem odległości (oba wielkości obrazu), a następnie powtarzając następujące kroki:
k
k
To pozostawia nam manhattan odległości każdego piksela do piksela nasion w akumulatorze odległości. Następnie tworzymy nowy obraz, przechodząc przez podany zakres kolorów i odwzorowując „pierwszy” odcień na wartość zero, a „ostatni” odcień na maksymalną odległość.
Przykłady
Jako bonus, tutaj jest ładny obraz tego, jak obliczana jest odległość. jaśniejszy = dalej.
źródło
Blitz 2D / 3D , 3068 * 0,7 = 2147.6
Jest to referencyjna implementacja algorytmu euklidesowego, golfa.
Właściwie to trochę nienawidzę tego, jak nieczytelne w porównaniu do oryginału. (Nawiasem mówiąc, 5305 bajtów.) Właściwie, mógłbym odciąć jeszcze kilka bajtów, używając do tego wszystkiego jednoznakowych nazw zmiennych, ale to już dość śmieszne. I wkrótce nie wygrywa. : P
źródło
C ++ / SFML:
127112351226 bajtów-36 bajtów dzięki user202729 -9 bajtów dzięki Zacharý
Ten
sf::Image
parametr jest również wyjściem (zostanie zmodyfikowany). Możesz użyć tego w następujący sposób:Pierwszym parametrem jest wejście obrazu (i wyjście), drugim i trzecim parametrem jest parametr
x
iy
tam, gdzie musi się rozpocząćźródło
setPixel(j, i,hsv2
iFI(xm,ym) (std::find_if
naprawdę konieczne?G(d,a,b,c)
icase d:
. Również przestrzeń międzycase d:
i niereturn C(a,b,c)
jest potrzebna.(b>m?b:m)
nie wymaga nawiasów i(t/60)%6
=>t/60%6
według kolejności operacji.xm
iym
skrócić nazwy zmiennychG(d,a,b,c)
icase
,FI
,ti
, ihsv2rgb
każdy może być zastąpiona krótszą nazwą.C ++,
979 969 898 859848 bajtówRGBARGB (wyprowadzony w pliku: d)Nie do końca bezpośredni „niepozorny”, ale był to prototyp C, z którego najpierw wyszydzałem:
Wiele koncepcji pozostaje podobnych, ale z pewnością istnieje mnóstwo drobnych zmian. Aby skompilować to jako C, musisz użyć C11 (C99 prawdopodobnie będzie działać, ale ja tylko ściśle przetestowałem w C11).
Bardzo podobało mi się to wyzwanie, dziękuję za pomysł, aby spróbować czegoś nowego :).
Edycja: Golf był trochę lepszy.
Edycja2: Scaliłem dwie struktury, aby moja struktura pikseli i kolejka były takie same, nieco więcej nadużyć makr, i ponownie wykorzystałem 255, tak że można go zdefiniować jako -1 podczas definiowania serii niepodpisanych znaków, a na koniec usunąć wywołanie funkcji.
Edycja3: Ponownie wykorzystałem kilka dodatkowych zmiennych, ulepszenia pierwszeństwa operatora i dane wyjściowe przekonwertowane na RGB, zapisując kanał alfa.
Edit4: Myślę, że już to zrobiłem, pewne zmiany arytmetyczne wskaźnika i drobne poprawki przepływu sterowania.
źródło
Python 3 i matplotlib, 251 bajtów
Dane wejściowe to tablica liczb MxNx3 zwracana przez
imshow()
funkcję matplotlib . Dane wejściowe są modyfikowane przez funkcję, dlatego należy je wcześniej skopiować. Wyświetla obraz automatycznie, jeśli matplotlib jest w trybie „interaktywnym”; w przeciwnym razieshow()
należy dodać wywołanie do kolejnych 7 bajtów.Dane wyjściowe są tworzone poprzez wyświetlenie oryginalnego obrazu, a następnie wyświetlenie nad nim obrazu tęczy. Matplotlib dogodnie traktuje inf i nan jako przezroczyste, dzięki czemu widać czarno-biały obraz.
źródło