Напишите программу, которая принимает строку или текстовый файл, первая строка которого имеет вид
width height
и каждая последующая строка имеет вид
x y intensity red green blue
где:
width
иheight
могут быть любые натуральные числа.x
иy
могут быть любые целые числа.intensity
может быть любым неотрицательным целым числом.red
,green
иblue
могут быть любыми целыми числами от 0 до 255 включительно.
Ваша программа должна выводить полноцветных изображений в любом общем без потерь формат файла изображения, размеры которых width
по height
. Каждая x y intensity red green blue
линия представляет собой красочную звезду или шар, который должен быть нарисован на изображении. Можно нарисовать любое количество звездочек, включая 0. Можно предположить, что строка или файл имеют завершающий символ новой строки.
Алгоритм рисования изображения следующий, хотя вы можете реализовать его любым удобным вам способом, если результат будет одинаковым:
Для каждого пикселя ( X , Y ) в изображении (где X равно 0 на крайнем левом краю и width-1 на крайнем правом краю, а Y равно 0 на верхнем крае и height-1 на нижнем краю), цветовой канал C ϵ { красный , зеленый , синий } (значение от 0 до 255) определяется по формуле:
Где функция dist является евклидовым расстоянием :
Или Манхэттенское расстояние :
Выберите ту функцию расстояния, которую вы предпочитаете, исходя из возможности игры в гольф или эстетики.
Каждая из строк на входе, кроме первой, является элементом множества звезд . Так, например, S х представляет собой
x
значение на одной из входных линий, а S C представляет собой либоred
,green
илиblue
, в зависимости от того, какого цвета канал в настоящее время рассчитывается.
Примеры
Пример А
Если вход
400 150
-10 30 100 255 128 0
выход должен быть
если вы используете евклидово расстояние, и
если вы используете расстояние Манхэттен.
Пример Б
Если вход
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
соответствующие выходы для евклидова и манхэттенского расстояния должны быть
и .
Пример С
Если вход
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
выход должен быть
если вы используете евклидово расстояние, и
если вы используете расстояние Манхэттен.
Пример D
Если вход
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
выход должен быть
если вы используете евклидово расстояние, и
если вы используете расстояние Манхэттен.
Пример Е
Если вход
100 1
тогда вывод должен быть полностью черным изображением шириной 100 на 1 пиксель.
Примечания
- Возьмите входную строку или имя текстового файла, который содержит его, из stdin или командной строки, или вы можете написать функцию, которая принимает строку.
- «Вывод» изображения означает либо:
- Сохранение в файл с именем по вашему выбору.
- Печать необработанных данных файла изображения в стандартный вывод.
- Отображение изображения, например, с PIL «ы
image.show()
.
- Я не буду проверять, чтобы ваши изображения были идеальными по пикселям (Stack Exchange в любом случае сжимает изображения с потерями), но я буду очень подозрительным, если смогу визуально отличить их.
- Вы можете использовать графические / графические библиотеки.
выигрыш
Самая короткая подача в байтах побеждает. В случае галстуков выигрывает самая ранняя подача.
Fun Bonus: Дайте вклад для действительно впечатляющего выходного изображения.