Napisz program, który pobiera ciąg lub plik tekstowy, którego pierwszy wiersz ma postać
width height
a każda kolejna linia ma formę
x y intensity red green blue
gdzie:
width
iheight
mogą być dodatnimi liczbami całkowitymi.x
iy
mogą być dowolnymi liczbami całkowitymi.intensity
może być dowolną liczbą całkowitą nieujemną.red
,green
iblue
mogą być dowolnymi liczbami całkowitymi od 0 do 255 włącznie.
Twój program musi wyprowadzić obraz truecolor w dowolnym popularnym bezstratnym formacie pliku obrazu, którego wymiary są width
zgodne height
. Każda x y intensity red green blue
linia reprezentuje kolorową gwiazdę lub kulę, którą należy narysować na obrazie. Można narysować dowolną liczbę gwiazdek, w tym 0. Możesz założyć, że ciąg lub plik ma nową linię końcową.
Algorytm rysowania obrazu jest następujący, ale możesz go zaimplementować w dowolny sposób, o ile wynik jest identyczny:
Dla każdego piksela ( X , Y ) na obrazie (gdzie X to 0 przy skrajnej lewej krawędzi i szerokość-1 przy skrajnej prawej krawędzi, a Y to 0 przy górnej krawędzi i wysokość-1 przy dolnej krawędzi), kanał koloru C ϵ { czerwony , zielony , niebieski } (wartość przypięta od 0 do 255) jest podane równaniem:
Gdzie funkcją dist jest albo odległość euklidesowa :
Lub odległość na Manhattanie :
Wybierz dowolną funkcję odległości, którą preferujesz, w oparciu o możliwości gry w golfa lub estetykę.
Każda z linii na wejściu oprócz pierwszej jest elementem zestawu Gwiazdy . Tak więc, na przykład, S x oznacza
x
wartość na jednej z linii wejściowych i S, C oznacza albored
,green
alboblue
, w zależności od aktualnie kanału koloru obliczana.
Przykłady
Przykład A
Jeśli dane wejściowe to
400 150
-10 30 100 255 128 0
wyjście powinno być
jeśli używasz odległości euklidesowej, i
jeśli korzystasz z odległości Manhattan.
Przykład B
Jeśli dane wejściowe to
200 200
100 100 10 255 255 255
20 20 40 255 0 0
180 20 40 255 255 0
180 180 40 0 255 0
20 180 40 0 0 255
odpowiednie wartości wyjściowe dla odległości euklidesowej i Manhattanu powinny wynosić
a .
Przykład C
Jeśli dane wejściowe to
400 400
123 231 10 206 119 85
358 316 27 170 47 99
95 317 3 202 42 78
251 269 17 142 150 153
43 120 3 145 75 61
109 376 6 230 231 52
331 78 21 31 81 126
150 330 21 8 142 23
69 155 11 142 251 199
218 335 7 183 248 241
204 237 13 112 253 34
342 89 18 140 11 123
wyjście powinno być
jeśli używasz odległości euklidesowej, i
jeśli korzystasz z odległości Manhattan.
Przykład D
Jeśli dane wejściowe to
400 400
123 231 5 206 119 85
358 316 5 170 47 99
95 317 5 202 42 78
251 269 5 142 150 153
43 120 5 145 75 61
109 376 5 230 231 52
331 78 5 31 81 126
150 330 5 8 142 23
69 155 5 142 251 199
218 335 5 183 248 241
204 237 5 112 253 34
342 89 5 140 11 123
wyjście powinno być
jeśli używasz odległości euklidesowej, i
jeśli korzystasz z odległości Manhattan.
Przykład E
Jeśli dane wejściowe to
100 1
wtedy wyjście powinno być obrazem o szerokości 100 pikseli na 1 piksel, który jest całkowicie czarny.
Uwagi
- Weź ciąg wejściowy lub nazwę pliku tekstowego, który go zawiera ze standardowego wiersza poleceń lub wiersza poleceń, albo możesz napisać funkcję, która przyjmuje ciąg znaków.
- „Przesyłanie” obrazu oznacza albo:
- Zapisywanie go do pliku o wybranej nazwie.
- Drukowanie danych surowego pliku obrazu na standardowe wyjście.
- Wyświetlanie obrazu, takie jak z PIL „s
image.show()
.
- Nie będę sprawdzać, czy twoje obrazy są idealnie w pikselach (Stack Exchange i tak kompresuje stratnie obrazy), ale będę bardzo podejrzliwy, jeśli mogę wizualnie odróżnić.
- Możesz używać bibliotek graficznych / obrazkowych.
Zwycięski
Najkrótsze przesłanie w bajtach wygrywa. W przypadku remisu wygrywa najwcześniejsze zgłoszenie.
Zabawna premia: daj wejściowy obraz, aby uzyskać naprawdę spektakularny obraz wyjściowy.
źródło
Odpowiedzi:
Pyth - 46 bajtów
To była zabawa! W końcu mogłem użyć funkcji We / Wy obrazu Pytha. Czy odległość euklidesowa z powodu golfa, choć Manhattan to tylko krótka zmiana.
To po prostu zapętla wszystkie piksele z formuły, chociaż skrapla pętlę pikseli w jedną pętlę i wykorzystuje,
divmod
ponieważ Pyth obsługuje tylko 3 zagnieżdżone mapy, a obliczenia zajmują dwa (jeden dla RGB i jeden dla gwiazd).Zapisuje obraz jako
o.png
. Dość powoli, pierwsze 2 testy trwają mniej niż 2 minuty, ale pozostałe 2 trwają pół godziny.Jest błąd wScalono!.w
tym, że nikt tego nie zauważył, bo nikt go nie używa;) Ale wysłałem żądanie ściągnięcia, więc użyj mojego rozwidlenia, aby sprawdzić, czy nie zostanie wkrótce połączone.Przykłady wyników
Przykład A
Przykład B
Przykład C
Przykład D
źródło
JavaScript
394344Edycja: znacznie skróciłem kod, stosując niesamowite sugestie wolfhammera .
Test
Uwaga: Zaczekaj kilka sekund, aż poniższy fragment się wyrenderuje (zajmuje to około 4 sekund na moim komputerze).
Pokaż fragment kodu
Możesz także uruchomić go w JSFiddle .
Bonus: Niebieskie Zaćmienie
Możesz także uruchomić go w JSFiddle .
Opis
Jest to prosta implementacja kanwy JavaScript + HTML5: funkcja, która pobiera argument ciągu (bez spacji / znaków nowej linii) i wyświetla dane wyjściowe w DOM. Wykorzystuje odległość euklidesową.
Oto czytelny kod:
źródło
Java - 627 bajtów
Java jest rzeczywiście jednym z najlepszych języków golfowych :)
Korzystając z danych wejściowych poniżej, możesz stworzyć nieco realistyczny model naszego Układu Słonecznego (wielkość niektórych planet jest nieprawidłowa, ale odległość między nimi powinna być dokładna). Próbowałem nadać pierścienie saturnowi, ale to nie zadziałało ... Źródło
Obraz Full HD , który nie wygląda świetnie ... Byłby szczęśliwy, gdyby ktoś mógł go poprawić!
źródło
Bash,
147145 bajtówImageMagick służy do manipulowania obrazami. Stosowana jest odległość euklidesowa.
źródło
$w\x$h
.o=o.png
.Python 3, 189 bajtów
Nie mam pojęcia o golfistach-ekspertach, ale proszę bardzo.
stdin
i są przekazywanestdout
w formacie PPM .python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm
Po pierwsze, odległość na Manhattanie:
Po drugie, odległość euklidesowa:
Mógłbym zaoszczędzić cztery bajty, stosując zamiast tego dzielenie liczb całkowitych
int()
, i faktycznie wydaje się, że tak właśnie wyglądają oryginalne obrazy - ledwo dostrzegasz niektóre prążki na ciemnych obrzeżach blasku gwiazdy, które nie są obecne w ścisłej poprawności kod. W obecnej postaci ten kod jest zgodny z opisem, a nie z obrazkami.Wersja bez golfa i moje oryginalne gry w golfa przed wieloma optymalizacjami, które inni zauważyli lub na których natknąłem się, są w tym sensie .
EDIT: Uratowałem 7 bajtów przesuwając
for x
ifor y
do jednegoprint
(lubo
funkcji), ale ta produkuje PNM pliku o bardzo długiej linii, które mogą lub nie mogą powodować pewne problemy.EDYCJA 2: Maltysen zaoszczędził mi kolejne 20 bajtów. Dzięki!
EDYCJA ponownie: Teraz, gdy jest tylko jeden
print
,o
alias jest zobowiązaniem, a nie oszczędnością. Jeszcze 4 bajty mniej.EDYTUJ trochę więcej: Sp3000 zaoszczędził mi jeszcze 2 bajty. Tymczasem aliasing
map
dom
niczego nie zapisywał, więc w trosce o czytelność (!) Ponownie go rozwinąłem. Teraz jest ładna okrągła 2 8 bajtów.EDYCJA ostatniego (?): Teraz z obsługą odległości euklidesowych - i nadużywając liczb zespolonych, zrobiłem to dokładnie w tej samej liczbie bajtów!
EDIT, restart Hollywood: kolejna sugestia Sp3000 straciła 5 bajtów.
EDYCJA, głupio nazwana kontynuacja: obcięte 6 bajtów, dzięki sugestii Maltysen, że nie zrozumiałem, dopóki Sp3000 go nie powtórzy ... potem kolejne 8 bajtów od
%
nadużycia. A mówienie o tym na czacie wywołało fenomenalne zjawisko2126 bajtów. Jestem upokorzony.źródło
EOF
s można użyćiter()
wartości wartowników: docs.python.org/2/library/functions.html#iter asiter(raw_input,'')
, także umieścićw,h,S
tę samą linię z rozszerzonym rozpakowywaniem.EOFError
(i dlatego potrzebowałemtry
bloku), ponieważ w pliku wejściowym nie ma pustej linii i nie jestem pewien, czy wyzwanie pozwala mi go dodać. A może coś mi brakuje?stdin
to nie był iterator.C ++, 272 bajty
Potrzebuje łagodnego kompilatora C ++ 11 (GCC 4.9.2 jest tylko trochę niezadowolony) oraz biblioteki png ++ , która sama w sobie wymaga
libpng
. Wykorzystana odległość Manhattanu. Pobiera dane wejściowestdin
, dane wyjściowe do pliku o nazwie „a” w bieżącym katalogu w formacie PNG.Przykład D:
źródło
PCG
obraz :) (ChociażPPCG
jest to mój ulubiony skrót;))Python 2,
240232228 bajtówWykorzystuje odległość na Manhattanie. Prawdopodobnie byłoby to jeszcze krótsze w Pythonie 3, ale ostatnio zepsułem swoje pakiety Pythona i mam problem z ponowną instalacją Pillow. PPM prawdopodobnie byłby jeszcze krótszy, ale lubię PIL.
Dla zabawy próbowałem zastosować algorytm taki jak w przestrzeni kolorów L * a * b * , myśląc, że dałoby to lepsze mieszanie kolorów (szczególnie w przykładzie B). Niestety algorytm Calvina pozwala kanałom przekroczyć ich maksymalne wartości, co sprawia, że obrazy wyglądają trochę mniej niesamowicie niż się spodziewałem ...
źródło
Mathematica, 146 bajtów
Czysta funkcja pobierająca ciąg znaków. Aby uruchomić go w rozsądnym czasie, zamień
1
w1+#~ManhattanDistance...
na1.
; wymusza to obliczenia numeryczne zamiast symbolicznych.Nie golfowany:
źródło
Python 2,
287251 bajtówGolfowa wersja oryginalnego kodu, którego użyłam do wygenerowania obrazów. Prawdopodobnie można by trochę bardziej zagrać w golfa (przez lepszego golfistę niż ja). Jest to funkcja, która pobiera pełny ciąg wejściowy. Przetwarzanie obrazu odbywa się z PIL jest moduł obrazujący . Wykorzystuje odległość na Manhattanie.
Korzystanie z odległości euklidesowej jest o 5 bajtów dłuższe (256 bajtów):
Oto kompletny zestaw testów z przykładami od A do E z pytania dla obu wskaźników odległości:
Wszystkie wyglądają nie do odróżnienia. Większe mogą potrwać kilka sekund.
źródło
for x in r(I[0]):...for y in r(I[1]):
je, zmieniając nafor x in r(I[0]*I[1]):
. Następnie można wziąć każdy poziom wcięcia w dół o 1, i wymienićx
zx/I[1]
iy
zy%I[1]
.from PIL import Image
tofrom PIL import*
C, 247 bajtów
Nie zamierzam wygrywać, ale lubię grać w golfa w C. Nie jest używana zewnętrzna biblioteka obrazów, wyjścia na standardowe wyjście w formacie PPM. Pobiera dane wejściowe na standardowe wejście. Wykorzystuje odległość do golfa dla golfisty.
Oto wariant odległości euklidesowej (257 bajtów):
źródło
CJam, 86 bajtów
Chociaż może to wydawać się dość długie w przypadku języka golfowego, uważam, że spośród opublikowanych dotychczas rozwiązań jest to najkrótszy, który nie korzysta z funkcji wyświetlania obrazu. To tworzy plik PPM w formie ASCII. Poniższy obraz został przekonwertowany z PPM do PNG przy użyciu GIMP.
Nie polecam uruchamiać kodu w internetowym tłumaczu CJam. Przynajmniej nie dla zdjęć w pełnym rozmiarze. Moja przeglądarka została zablokowana, najprawdopodobniej z powodu użycia pamięci. Uzupełnia obrazy 400 x 400 w drugim zakresie w wersji offline.
Wyjaśnienie:
źródło
C # 718 bajtów
Zdaję sobie sprawę, że c # jest straszny dla gry w golfa, ale oto moja próba na 718 bajtów
Jeśli ktoś ma jakieś sugestie dotyczące skrócenia, daj mi znać.
źródło
Python, 259 bajtów
Wkońcu zrobione! Pierwszy kod golfa, którego próbowałem, zdecydowałem się użyć Pythona i poszedłem na odległość Manhattanu. Krzycz Maltysenowi za pomoc w iteratorach, zmniejszając całkowity rozmiar do prawie połowy!
źródło
k[0]
ik[1]
w obliczeniach.CJam, 70 bajtów
Odległość euklidesowa, wyjście ASCII PPM. Wypróbuj online
Powinno być możliwe ściśnięcie jeszcze kilku bajtów, ale nie chcę spędzać zbyt wiele czasu.
źródło