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.