Wyzwanie polega na stopniowym zmienianiu odcieni na obrazie w celu uzyskania ładnych zdjęć:
( oryginał )
Wyzwanie
Napisz program lub funkcję, która przyjmuje dwie nieujemne liczby całkowite i obraz w dowolnym wybranym przez siebie formacie pliku obrazu (możesz wybrać ścieżkę do obrazu lub surowych danych obrazu).
Pierwszą liczbę całkowitą nazywamy cyklami, a drugą liczbą całkowitą - przesunięcie .
Zdefiniujemy również krok zmiennoprzecinkowy jako cykle 360 razy podzielone przez obszar obrazu lub step = 360 * cycles / (image width * image height)
.
Dla każdego piksela P na obrazie, przesuwając jeden rząd na raz, od lewej do prawej, od góry do dołu (tj. W kolejności odczytu, jeśli piksele były literami), wykonaj następujące czynności:
Zwiększyć odcień z P przez offsetowych stopni (zapętlenie około od 360 do 0, jeśli to konieczne).
Następnie zwiększ przesunięcie krok po kroku .
Zapisz, wyświetl lub wyślij nieprzetworzony obraz wynikowy w dowolnym popularnym formacie pliku obrazu.
Ta procedura stopniowo zwiększa odcień wszystkich pikseli na obrazie, czyniąc cykle pełnymi pętlami wokół tęczy odcienia , zaczynając od początkowego przesunięcia odcienia przez przesunięcie .
Kiedy cykle wynoszą 1, a przesunięcie wynosi 0, jak na powyższym obrazie Gwieździstej nocy, górne i dolne rzędy pikseli praktycznie nie mają przesunięcia odcienia, ale pomiędzy nimi jest pełny cykl kolorów.
Detale
Cykle mogą być dowolnymi liczbami całkowitymi nieujemnymi, ale można założyć, że przesunięcie wynosi od 0 do 359 włącznie.
Gdy liczba cykli wynosi 0, każdy piksel na obrazie zostanie przesunięty o dokładnie przesunięcie, ponieważ krok musi również wynosić 0. (W takim przypadku, jeśli przesunięcie wynosi 0, obraz w ogóle się nie zmienia).
Możesz założyć, że cykle i przesunięcia są wprowadzane jako
1.0
liczby zmiennoprzecinkowe, jeśli jest to pożądane (tzn. Zamiast1
). (Zdaję sobie sprawę, że wcale nie muszą to być liczby całkowite, to po prostu upraszcza wyzwanie).„Barwa” oznacza wersję przestrzeni kolorów RGB, powszechną w modelach kolorów HSL / HSV .
Przykłady
Oryginalny:
Cykle = 1, przesunięcie = 0:
Cykle = 1, przesunięcie = 180:
Oryginalny:
Cykle = 2, przesunięcie = 60:
Oryginalny:
(Dzięki ArtOfCode .)
Cykle = 1, przesunięcie = 120:
Oryginalny:
(Dzięki Klamka .)
Cykle = 1, przesunięcie = 0:
Cykle = 4, przesunięcie = 0:
Cykle = 200, przesunięcie = 0:
Cykle = 30000, przesunięcie = 0:
(Te obrazy mogą nie być idealnie w pikselach z powodu kompresji ich przez Imgur.)
Punktacja
Najkrótszy kod w bajtach wygrywa. Tiebreaker jest wyżej głosowaną odpowiedzią.
Odpowiedzi, które opublikują własne fajnie wyglądające obrazy testowe, dostaną ode mnie więcej punktów brownie.
źródło
Odpowiedzi:
Pyth, 86 bajtów, pełny program
Pyth nie ma wbudowanych konwersji przestrzeni kolorów - to prawdziwa okazja.
Pobiera dane wejściowe w następującym formacie na stdin:
Obraz wyjściowy jest zapisywany
o.png
.Działa to poprzez obrócenie kostki koloru wokół jej przekątnej, a następnie zaciśnięcie dowolnych wartości poza zakresem.
Jeśli
a
jest to kąt obrotu ir, g, b
kolor wejściowy, nowy kolor obliczamy nar', g', b'
podstawie:źródło
Python, 379 bajtów
To prowadzi do
.jpg
wejścia jako. To nie będzie działać z png, chociaż można zmienićr,g,b=i.split();
, abyr,g,b=i.split()[:3];
załadować obraz PNG.Oto kilka zdjęć:
Oryginalny:
Przesunięcie: 0, Cykle: 4
Oryginalny:
Przesunięcie 0, 1 cykl:
Oryginalny:
Przesunięcie 0, 2,5 cykli:
źródło
Java (pełny program),
491488 bajtów (Dzięki @Geobits)Bez golfa
Wyjaśnienie
Zastosowanie: dość proste. Kompiluj z
java -c Q.java
. Uruchom zjava Q <cycles> <offset> <imagepath>
. Zastąpi istniejący obraz, więc bądź ostrożny.Na początku zamierzałem stworzyć rozwiązanie oparte tylko na metodzie, ale nie do końca wiedziałem, jak sobie z nimi poradzić, więc pomyślałem, że przejdę do pełnej wersji Java , prawdopodobnie i tak nie wygra: ^)
Wyniki:
Image 1: 1 cycle, 0 offset
Image 1: 1 cycle, 180 offset
Image 2: 2 cycles, 60 offset
Image 3: 1 cycle, 120 offset
Image 4: 1 cycle, 0 offset
Image 4: 4 cycles, 0 offset
Image 4: 200 cycles, 0 offset
Bonus: The Starry Night, 1 cycle, 0 offset
źródło
java.io.File
zamiastjava.io.*
?import
**static
**, nie tylkoimport
?ImageIO::read
iImageIO::write
bez koniecznościImageIO.
dodawania: To dodaje 9 bajtów (static .*
), ale oszczędza 16 (ImageIO.
dwa razy).