Jest zima i nadeszła pora roku, aby zaczęło się robić zimno (i dziwne kolorowe chusty na głowie zaczęły pojawiać się ... wkrótce). Napiszmy kod, aby zamrozić zdjęcia awatarów i inne obrazy, aby pasowały do motywu!
Wkład
Dane wejściowe do zgłoszeń do tego wyzwania powinny być obrazem (obraz, który ma zostać zamrożony) i liczbą (próg, który zostanie wyjaśniony później).
Możesz wprowadzić obraz w dowolny sposób, w jaki obsługuje go Twój język (ścieżka pliku lub adres URL jako argument, biorąc go ze schowka, przeciągając i upuszczając obraz itp.) Oraz w dowolnym wymienionym tutaj formacie, który wyraża kolory w RGB (ty może zamiast tego obsługiwać / wymagać RGBA, ale nie jest to wymagane).
Możesz wprowadzić liczbę w dowolny sposób (argument wiersza poleceń, STDIN, okno dialogowe wprowadzania danych itp.), Z wyjątkiem zakodowania jej na stałe w programie (np. n=10
). Jeśli używasz ścieżki pliku / adresu URL obrazu, należy go również wprowadzić w ten sposób.
Wydajność
Program musi przetworzyć obraz zgodnie z poniższym opisem, a następnie wydrukować go w dowolny sposób (do pliku, pokazując go na ekranie, umieszczając w schowku itp.).
Opis
Zgłoszenia powinny przetwarzać obraz w trzech następujących krokach. n
odnosi się do liczby otrzymanej przez program jako dane wejściowe wraz z obrazem.
Stosowanie rozmycia promienia
n
do obrazu wejściowego przez zastąpienie R każdego piksela, G, i wartości B o średniej R, G, i wartości B wszystkich pikseli w odległości Manhattan zn
pikseli, ignorując się aut współrzędnych. (Tj. Wszystkie piksele, w których suma różnicy w X i różnicy w Y jest mniejsza lub równan
.)(uwaga: Użyłem rozmycia Gaussa dla powyższych obrazów, ponieważ była dla niego wygodna wbudowana funkcja, dzięki czemu twoje obrazy mogą wyglądać nieco inaczej.)
Ustaw każdy piksel na losowy piksel w odległości kilku
n/2
pikseli („odległość” jest zdefiniowana w taki sam sposób, jak w poprzednim kroku).Należy to zrobić, zapętlając obraz i ustawiając każdy piksel na losowy piksel w tym zakresie, aby niektóre piksele zniknęły całkowicie, a niektóre mogły zostać powielone.
Wszystkie zmiany muszą obowiązywać w tym samym czasie. Innymi słowy, użyj starych wartości pikseli (po kroku 1, ale przed tym krokiem), a nie nowych wartości po ustawieniu ich na losowy piksel.
Pomnóż „niebieską” wartość RGB każdego piksela przez 1,5, ograniczając go do 255 (lub jakąkolwiek maksymalną wartością dla pasma pikseli) i zaokrąglając w dół.
Zasady
Możesz korzystać z bibliotek obrazów / funkcji związanych z przetwarzaniem obrazu wbudowanych w twój język; nie można jednak używać żadnych funkcji, które wykonują jedno z trzech głównych zadań wymienionych w opisie. Na przykład nie możesz użyć
blur
funkcji, alegetPixel
funkcja jest w porządku.To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
dx <= n && dy <= n
jest dokładnym odwzorowaniem odległości na Manhattanie, prawda?Odpowiedzi:
Python 2 - 326
339 358Pobiera dane od użytkownika. Najpierw złóż plik
n
.Prawdopodobnie można by grać w golfa o wiele więcej: P Dzięki @ SP3000 za pomysły na golfa!
Przykładowe dane wejściowe: (Windows)
Edycja : Naprawiono błąd, w którym propagowano niebieski (Martin z n = 20 nie jest już rzeką; _;)
Martin z n = 2:
Martin z n = 10:
Martin z n = 20:
źródło
Python 2 - 617 bajtów
EDYCJA: trochę grałem w golfa, wygląda na to, że FryAmTheEggMan mnie pobił :)
źródło
Java - 1009 bajtów
eh, myślałem, że mogę zrobić lepiej niż to ...
Martin z n = 5:
n = 20:
Ja z 10:
źródło
k&0xFF00
? Ponadto, czy nie możesz użyć255
zamiast0xFF
?C, 429 (391 + 38 dla definicji flag)
Format wejściowy:
pam
plik bez komentarzy lub dodatkowych białych znaków w nagłówku, treść przekazywana przez STDIN.n
argumenty są wymagane (mogą być dowolne).Format wyjściowy:
pam
plik w STDOUT.Kompilować:
-Wl,--stack,33554432
zwiększa rozmiar stosu; można to zmienić lub usunąć, w zależności od rozmiaru przetwarzanego obrazu (program wymaga rozmiaru stosu większego niż dwukrotność liczby pikseli razy 4).-funsigned-char
ma wykorzystanie gccunsigned char
zamiastsigned char
zachar
. Standardy C pozwalają na jedną z tych opcji, a ta opcja jest potrzebna tylko tutaj, ponieważ gcc używasigned char
domyślnie.Aby uruchomić (n = 5):
Uwaga: W przypadku kompilacji w systemie Windows
stdio.h
,fcntl.h
iio.h
muszą być uwzględnione, a następujący kod dodany do początkumain()
, aby program do odczytu / zapisu do STDIN / STDOUT jako binarne, a nie tekst, strumieni (to jest bez znaczenia na Linuksie, ale System Windows używa\r\n
zamiast\n
strumieni tekstowych).Skomentowana wersja
Martin z n = 10:
Martin z n = 20:
Martin z n = 100:
źródło
R, 440 znaków
Z podziałami linii dla czytelności:
Przykładowe dane wejściowe:
f(2,"avatar.png")
Wyniki przy n = 2
... przy n = 10
... przy n = 20
źródło