Wyzwanie:
Napisz program, który wyświetla plik graficzny o szerokości 1920 pikseli i wysokości 1080 pikseli. Każdy z 2 073 600 pikseli w grafice musi mieć unikalny kolor i nie należy powtarzać żadnych wartości kolorów. Kolory powinny być określone w RGB i zaczynają się od 0,0,0 i liczone w górę w kierunku do 255,255,255. Przekonasz się, że obraz w rozdzielczości 1920 x 1080 pikseli będzie zawierał dużo czerni, błękitu i zieleni.
Na przykład (mniejsza wersja). Jeśli wysokość zostanie ustawiona na 5, a szerokość na 5, wydrukowana zostanie grafika o wielkości 25 pikseli i każdy piksel będzie miał unikalny kolor. Tablica kolorów RGB wyglądałaby tak:
Array (
[0] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
[1] => Array
(
[0] => 0
[1] => 0
[2] => 1
)
[2] => Array
(
[0] => 0
[1] => 0
[2] => 2
)
[3] => Array
(
[0] => 0
[1] => 0
[2] => 3
)
[4] => Array
(
[0] => 0
[1] => 0
[2] => 4
)
[5] => Array
(
[0] => 0
[1] => 0
[2] => 5
)
[6] => Array
(
[0] => 0
[1] => 0
[2] => 6
)
[7] => Array
(
[0] => 0
[1] => 0
[2] => 7
)
[8] => Array
(
[0] => 0
[1] => 0
[2] => 8
)
[9] => Array
(
[0] => 0
[1] => 0
[2] => 9
)
[10] => Array
(
[0] => 0
[1] => 0
[2] => 10
)
[11] => Array
(
[0] => 0
[1] => 0
[2] => 11
)
[12] => Array
(
[0] => 0
[1] => 0
[2] => 12
)
[13] => Array
(
[0] => 0
[1] => 0
[2] => 13
)
[14] => Array
(
[0] => 0
[1] => 0
[2] => 14
)
[15] => Array
(
[0] => 0
[1] => 0
[2] => 15
)
[16] => Array
(
[0] => 0
[1] => 0
[2] => 16
)
[17] => Array
(
[0] => 0
[1] => 0
[2] => 17
)
[18] => Array
(
[0] => 0
[1] => 0
[2] => 18
)
[19] => Array
(
[0] => 0
[1] => 0
[2] => 19
)
[20] => Array
(
[0] => 0
[1] => 0
[2] => 20
)
[21] => Array
(
[0] => 0
[1] => 0
[2] => 21
)
[22] => Array
(
[0] => 0
[1] => 0
[2] => 22
)
[23] => Array
(
[0] => 0
[1] => 0
[2] => 23
)
[24] => Array
(
[0] => 0
[1] => 0
[2] => 24
)
)
Zasady:
Do wygenerowania obrazu można użyć dowolnego języka programowania.
Odpowiedź z największą liczbą głosów pozytywnych wygrywa.
Kolory można użyć tylko raz.
Piksel w pozycji 0,0 musi zaczynać się kolorem 0,0,0
Kolory muszą mieścić się w prawdziwym zakresie 24 bitów.
Obraz musi mieć rozmiar 1920 x 1080 pikseli.
Kolory muszą być w formacie RGB.
Używanie biblioteki do generowania obrazu jest w porządku.
Dane wyjściowe muszą być w formacie pliku graficznego, np. Output.png
Wyprowadzany jako tekst reprezentujący wartości kolorów się nie liczy, kod musi generować plik graficzny.
Rozmiar pliku obrazu wyjściowego nie ma znaczenia.
Musisz być w stanie wyświetlić wynik, otwierając go jako grafikę w przeglądarce Chrome.
Byłbym pod wrażeniem, jeśli uda ci się to zrobić za pomocą naprawdę krótkiego kodu, twój program wyświetla również czas w upływających sekundach potrzebny do wygenerowania obrazu osadzonego w samym obrazie nałożonym na kolejne piksele, twój program wysyła obraz w ciągu 10 sekund. Byłbym pod wrażeniem, jeśli Twój program wyświetli obraz w ciągu 1 sekundy.
źródło
x==y==0
wydaje się nieco dowolny. W każdym razie jest to niejednoznaczne, ponieważ współrzędne te mogą odnosić się do lewego górnego lub lewego dolnego rogu obrazu.Odpowiedzi:
Python - 660+ bajtów
Wersja przyrostowa
Pełny rozmiar: http://www.pictureshack.net/images/57626_all_colors.png (4.52MB)
To jest obraz oparty na fraktali Julii . Każdy kolor jest dodawany do obrazu przyrostowo, chociaż istnieje znaczna ilość wstępnych obliczeń.
Wersja świetlistości
Pełny rozmiar: http://www.pictureshack.net/images/95389_all_colors4.png (5,24 MB)
Dodałem opcję iteracji każdego koloru według jasności, a nie według indeksu. Nie kwalifikuje się to jako „odliczanie” od zera, ale wydaje się, że jest to luźny wymóg. Interesujące jest to, że te dwa porządki ujawniają zupełnie inne struktury na obrazie. Aby tego użyć, ustaw
use_luminosity
flagę naTrue
.Źródło
Wymaga PIL .
Uwaga : wykonanie potrwa kilka minut. Używanie PyPy z Pillow działa w około jednej piątej czasu CPython z PIL, więc polecam, jeśli to możliwe.
Edycja : zaktualizowano, tak aby
#000000
znajdował się w lewym górnym rogu, jak określono.Edycja : dodano flagę do iteracji kolorów według jasności.
Edycja : przełączono na natywne złożone obliczenia i całkowite wagi jasności, które są nieco szybsze.
Rozwiązania, nad którymi pracowałem, zanim podstawowym kryterium stało się konkurs popularności
PHP - 161 bajtów
Daje to najszybszą możliwą wydajność. Żadna biblioteka nie jest używana, tylko wstępnie obliczony nagłówek i bezpośredni bajt. Działa na moim komputerze w czasie krótszym niż 2 sekundy. Zwiększając o 256 zamiast 1 , daje efekt pseudo-gradientu, bez potrzeby wykonywania prawdziwych obliczeń. Jedynym minusem jest to, że ( 0, 0 ) nie jest czarne, ale wynik wygląda o wiele ładniej.
ob_start();
iob_end_flush();
nie są absolutnie konieczne, ale buforowanie wyjścia powoduje, że działa on znacznie szybciej.Inne interesujące przyrosty obejmują:
17: http://i.stack.imgur.com/ieyyZ.png
103: http://i.stack.imgur.com/WD2wa.png
326: http://i.stack.imgur.com/c4DSF. png
557: http://i.stack.imgur.com/eTTWE.png
943: http://i.stack.imgur.com/7rrmR.png
2125: http://i.stack.imgur.com/Ct1kM .png
I wiele innych. Chociaż większość wzorów, które wyglądają jak coś, przypomina pewnego rodzaju paski
PHP - 105 bajtów
Lekkomyślnie lekceważy wersję.
Content-type
nagłówka Chrome dołoży wszelkich starań, aby dowiedzieć się, co zostało wysłane. W takim przypadku poprawnie identyfikuje to jakoimage/bmp
. Najnowsze wersje FireFox i IE są również w stanie naprawić uszkodzony nagłówek.BM
,I5S2
iCS
wygenerujeNOTICE
błąd. Aby zapobiec uszkodzeniu obrazu,php.ini
należy ustawić raportowanie błędów, aby temu zapobiec (nperror_reporting = E_ALL & ~E_NOTICE
.).PHP-CLI - 83 bajty
Uruchom bezpośrednio z wiersza poleceń i potokuj do pliku (np.
$ php all-colors.php > out.bmp
), NieContent-type
jest wymagany nagłówek. Plik wynikowy jest identyczny z wersją 105-bajtową i można go przeglądać w Chrome.źródło
C z biblioteką graficzną GD (err, około 2,5 KB?)
Reguły nie zabraniały modyfikowania istniejącego obrazu. Zrobiłem program, aby zastąpić wszystkie piksele obrazu sekwencyjnymi wartościami RGB od
#000000
do#1fa3ff
i jestem bardzo zadowolony z wyników. Oto, co wyprodukował ze zdjęcia opublikowanego na Flickr przez Michaela Cariana ( cc-by-sa 2.0 ):(Surowy obraz wyjściowy jest raczej duży (5,6 MB) )
Oto zbliżenie lewego górnego rogu (powiększone o 400%):
Czas przetwarzania wynosi około 3 sekund dla obrazu o tym rozmiarze:
i tak, wszystkie piksele mają różne kolory:
(
identify
jest narzędziem ImageMagick;-format %k
opcja liczy liczbę unikalnych kolorów na obrazie)Oto kod źródłowy:
źródło
C ++, 750 bajtów
PNG o pełnej rozdzielczości (5,1 MB)
Kod tworzy zbiór wszystkich liczb całkowitych od 0-1080 * 1920, a następnie sortuje je według ogólnej jasności. Następnie tworzy zestaw Mandelbrota i sortuje pozycje na podstawie iteracji ucieczki i wartości. Następnie przechodzi przez oba zestawy, przypisując kolory w kolejności od ciemnej do jasnej do wartości Mandelbrota od najmniejszej do największej. Na koniec zapisuje obraz BMP o rozdzielczości 32 bitów na piksel do wyjściowej nazwy pliku określonej jako parametr wiersza polecenia.
Kod nie jest w pełni golfowy, ale nie będzie zbyt duży.
źródło
C - 854 bajtów (po ściśnięciu)
Pierwotnie miałem coś z narożnikami w kolorze cyjan, magenta i żółtym i gładkimi gradacjami kolorów, które wyglądały naprawdę ładnie, ale nie spełniały specyfikacji.
Następujące elementy spełniają specyfikację: używa „pierwszych” 2 073 600 kolorów, bez powtórzeń i czarnego w lewym górnym rogu.
Jak to działa, jest całkiem fajne. Buduje tablicę z kolorami, a następnie kilka razy sortuje w pionie i poziomie według różnych kryteriów. Efektem końcowym są przyjemne przejścia między niebieskim a zielonym oraz między ciemnością a światłem. Uruchomienie zajmuje około 1,5 sekundy. Skompiluj używając:
gcc -o many many.c -lm
i uruchom używając:./many > many.ppm
Do Twojej wiadomości, to był oryginalny obraz ...
A dla osób zainteresowanych kodem użytym do wygenerowania tego obrazu:
źródło
./a.out | hexdump | head
pokazy7d ff de
powtarzane wiele razy), (2) nie używać kolejnych wartości RGB z000000
thru1dffff
, oraz (3) piksel (x = 0, y = 0) nie jest czarne. (Chociaż sam nie widzę sensu (3).)Ruby, 109
EDYCJA: Powinienem zauważyć, że przesłałem to, kiedy pytanie było jeszcze oznaczone kodem-golfem , zanim stało się konkursem popularności, więc wybrałem krótki kod. Nie jest to zbyt pomysłowe, ale uważam, że jest to prawidłowe zgłoszenie.
Wartości kolorów wahają się od
00 00 00
do1f a3 ff
, zwiększając o1
, więc brakred
wyniku nie jest zaskakujący.Na koszt dodanie 1 znak długości kodu źródłowego (wymienić
<<8
z<<11
) następujące wyjście może być miał. Obejmuje to większy zakres widma kosztemblue
rozdzielczości. Przyrasta w przestrzeni RGB z ośmiokrotną szybkością. Wartości kolorów wahają się od00 00 00
dofd 1f f8
.źródło
Rakieta
Nigdy wcześniej nie stosowałem programowania obiektowego w rakietach (przekazywanie wiadomości), więc nie jestem pewien, czy jest to optymalne, ale wydaje się, że wykonało to zadanie.
Nie używając 3 pierwszych bitów w kanale czerwonym, uzyskuję wszystkie trzy kolory na obrazie wynikowym.
Brainfuck
Kod drukuje 24-bitowy obraz BMP do STDOUT dla 8-bitowych interpreterów BF. Tworzy ten sam obraz, co wersja rakiety. Opiera się na wersji PNM.
Ubuntu
bf
zawiera 8-bitowe komórki:Stara wersja, która narusza możliwość otwierania z Chrome. To sprawia, że plik .pnm jest kompatybilny z większością przeglądarek obrazów.
źródło
Zaktualizowana, pierwsza wersja nie miała wszystkich kolorów unikalnych w przestrzeni 24-bitowej:
Mathematica: 110
Weryfikacja zasad:
Pierwszy piksel jest czarny:
Wszystkie kolory są unikalne:
Mathematica: 146Trwa 14,778 sekund.
Weryfikacja zasad:
Pierwszy piksel jest czarny:
Wszystkie kolory są unikalne:
źródło
Python - 104
To jest wersja, która byłaby przeznaczona do wyzwania golfowego. Ponieważ tylko zwiększa wartość od 0 do 2073599, zawiera tylko unikalne kolory.
Python - 110
Ponieważ nie podobała mi się powyższa wersja (zakres kolorów nie jest w pełni wykorzystywany), wypróbowałem coś takiego:
Python - 122
Kolejne rozszerzenie powyższego:
źródło
i.show()
można użyć do otwarcia obrazu w domyślnej przeglądarce. Nie ma ścisłego wymogu zapisania go w pliku..show()
nie działa dla mnie. Nie wiem dlaczego. : PPrzetwarzanie, 301
Nie jest to próba najbardziej zwięzłego rozwiązania, ale zachowuje on pełną kontrolę, aby osiągnąć pożądany układ kolorów. Tak, kolory nie są następujące po sobie, ale to nie jest zabawne.
źródło
0,0
aby piksel był RGB0,0,0
. Widzę31,31,31
. W rzeczywistości cała kolumna zero wydaje się mieć ten kolor.Visual Basic .NET, 273 bajty
To daje plik 5,61 MB:
Powyższy kod jest skompresowaną wersją tego bardziej czytelnego kodu. Spacje zostały usunięte, aby zapisać bajty.
Link do obrazu: http: //µ.pw/k
źródło
ImageMagick - Konwertuj 119
Pozwala używać
convert
z przybornika ImageMagick do tworzenia obrazów. Działa za 0 sekund. Gra w golfa do 119 znaków. Nakładam dwa gradienty (czerwono-niebieski i czarno-biały) przekonwertować je na HSL i ponownie na RGB.Przykłady nakładek gradientowych można znaleźć na stronach podręcznika ImageMagick .
źródło
identify -format %k o.png
. Mam 1762920, a nie 2073600PHP, 507
Aby uruchomić, prawdopodobnie będziesz musiał zwiększyć ilość pamięci przydzielonej PHP. Używa GD. Wygenerowanie obrazu zajmuje około 9 sekund.
Link do obrazu wyjściowego: http://i.stack.imgur.com/AAKqW.png
Zobacz, jak działa w Internecie: http://ben-paton.co.uk/portfolio/pixel.php?w=1920&h=1080
źródło
DELPHI / PASCAL (wersja nr 1), 361 bajtów
źródło
Tcl / Tk, 149
150źródło
Java
411386 + 24 bajtyGrał w golfa
Bez golfa
Wynik
Wyjaśnienie
To nie jest moja próba najkrótszego rozwiązania, ale najbardziej przenośna. Zostawił import tylko dla BufferedImage, ponieważ inne nie zapisały bajtów. Zamiast ładować obraz do pliku JPanel i pisać na nim, zaoszczędziłem czas, który upływa od początku do zapisu na dysku jako nazwa pliku. Dla mnie zajęło to w rezultacie nazwy plików około ~ 110 ms, podczas gdy czas od początku do końca zwykle zajmował ~ 500ms. Wreszcie powinien być niezależny od platformy, ponieważ testowałem zarówno w systemie Windows, jak i na maszynie Wirtualnej Ubuntu i działał (zapisuje plik na pulpicie). Musiał mieć instrukcję return z powodu śmieci składni na żądanie. Chociaż pracuję nad obejściem, wątpię, czy znajdę lepszą implementację samodzielnie ze względu na oszczędności wynikające z używania l i w dla moich pętli for. Powiedziałbym, że pół sekundy dla Javy nie jest takie złe.
Ale wierzę, że wciąż jest zatwierdzony, ponieważ można go nadal otwierać za pomocą chrome, po prostu automatycznie otwiera się do domyślnej przeglądarki png (wersja nie testowana na komputerach z systemem Unix).
Jestem świadomy możliwych zapisów bajtów, ale głównie pominąłem je, aby zakwalifikować się do bonusów. Na życzenie mogę przesłać krótsze, specyficzne dla platformy przykłady. Dziękuję Ci.
Edytować
Usunięto niepotrzebne. Spróbuj Złap blok i źle sformatowaną instrukcję return, aby zmniejszyć ~ 30 bajtów.
Usunięto,
BufferedImage.TYPE_INT_RGB
ponieważ to dosłownie tylko 1.źródło