Напишите программу, которая принимает строку или текстовый файл, первая строка которого имеет вид
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: Дайте вклад для действительно впечатляющего выходного изображения.
источник
Ответы:
Pyth - 46 байт
Это было весело! Наконец-то я получил возможность использовать функции ввода / вывода Pyth. Есть евклидово расстояние из-за игры в гольф, хотя Манхэттен - только короткое изменение.
Это просто перебирает все пиксели с формулой, хотя он конденсирует пиксельный цикл в один цикл и использует,
divmod
так как Pyth поддерживает только 3 вложенные карты, а вычисления занимают два (один для RGB и один для звезд).Сохраняет изображение как
o.png
. Довольно медленно, первые 2 теста проходят менее чем за 2 минуты, а остальные 2 занимают порядка получаса.Есть ошибка вОбъединенное!.w
том, что никто не заметил, потому что никто не использует ее;), но я вставил запрос на извлечение, так что используйте мой форк, чтобы проверить, не скоро ли слится.Примеры Выходы
Пример А
Пример Б
Пример С
Пример D
источник
JavaScript
394344Изменить: значительно сократить код, применяя удивительные предложения волкхаммера .
Контрольная работа
Примечание. Подождите несколько секунд, пока фрагмент кода будет показан ниже (на моем компьютере это займет ~ 4 секунды).
Показать фрагмент кода
Вы также можете запустить его в JSFiddle .
Бонус: Голубое затмение
Вы также можете запустить его в JSFiddle .
Описание
Это простая реализация холста JavaScript + HTML5: функция, которая принимает строковый аргумент (без конечных пробелов и переносов) и отображает вывод в DOM. Он использует евклидово расстояние.
Вот читаемый код:
источник
Ява - 627 байт
Ява действительно один из лучших языков для игры в гольф :)
Используя приведенные ниже данные, вы можете создать несколько реалистичную модель нашей солнечной системы (размер некоторых планет неправильный, но расстояние между ними должно быть точным). Я пытался дать кольца Сатурну, но это не сработало ... Источник
Изображение в формате Full HD , которое выглядит не очень хорошо ... Был бы рад, если бы кто-то смог улучшить его!
источник
Баш,
147145 байтImageMagick используется для управления изображениями. Евклидово расстояние используется.
источник
$w\x$h
.o=o.png
.Python 3, 189 байт
Я ничья идея эксперта в гольф, но здесь идет.
stdin
и поступаютstdout
в формате PPM .python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm
Во-первых, расстояние Манхэттен:
А во-вторых, евклидово расстояние:
Я мог бы сэкономить четыре байта, используя целочисленное деление вместо
int()
, и на самом деле это похоже на то, что делают исходные изображения - вы можете едва различить полоски на темных полосах звездного свечения, которые отсутствуют в строго правильном код. Тем не менее, этот код следует описанию, а не изображениям.Ungolfed версия, и моя оригинальная игра в гольф до многих оптимизаций , что другие указывали , или что я споткнулся на себя, в этом суть .
РЕДАКТИРОВАТЬ: я сохранил 7 байтов путем перемещения
for x
иfor y
в однуprint
(илиo
) функцию, но это создает файл PNM с очень длинной строкой, что может вызвать или не вызвать некоторые проблемы.РЕДАКТИРОВАТЬ 2: Maltysen спас мне еще 20 байтов. Спасибо!
РЕДАКТИРОВАТЬ еще раз: теперь, когда есть только один
print
,o
псевдоним является обязательством, а не экономия. Еще 4 байта.РЕДАКТИРОВАТЬ еще немного: Sp3000 сэкономил мне еще 2 байта. Между тем, псевдоним
map
дляm
ничего не спасал, поэтому в интересах читабельности (!) Я снова расширил его. Теперь это хороший раунд 2 8 байтов.РЕДАКТИРУЙТЕ последний (?): Теперь с евклидовой дистанционной поддержкой - и злоупотребляя комплексными числами, я сделал это в точно таком же количестве байтов!
РЕДАКТИРОВАТЬ, перезагрузка Голливуда: следующее предложение Sp3000 сбило 5 байтов.
РЕДАКТИРОВАТЬ, глупо названное продолжение: 6 байтов обрезано, благодаря предложению, которое Мальтисен сделал, что я не понял, пока Sp3000 не повторил это ... затем еще 8 байтов от
%
злоупотребления. И общение в чате сбило с толку2126 байтов. Я унижен.источник
EOF
s вы можете использоватьiter()
со значениями sentinel: docs.python.org/2/library/functions.html#iter asiter(raw_input,'')
, также поместитеw,h,S
в ту же строку с расширенной распаковкой.EOFError
(и поэтому мне нуженtry
блок), потому что во входном файле нет пустой строки, и я не уверен, что задача позволяет мне добавить одну. Или я что-то упустил?stdin
это не был итератор.C ++, 272 байта
Нуждается в мягком компиляторе C ++ 11 (GCC 4.9.2 только слегка недоволен) и библиотеке png ++ , которая сама по себе требуется
libpng
. Манхэттенское расстояние используется. Вводит данныеstdin
, выводит в файл с именем «a» в текущем каталоге в формате PNG.Пример D:
источник
PCG
изображение :) (хотяPPCG
это мое любимое сокращение;))Python 2,
240232228 байтИспользует манхэттенское расстояние. Возможно, это будет еще короче в Python 3, но я недавно испортил свои пакеты Python, и у меня возникли проблемы с переустановкой Pillow. PPM, вероятно, будет еще короче, но мне нравится PIL.
Ради интереса я попытался применить алгоритм как есть в цветовом пространстве L * a * b * , думая, что это даст лучшее смешение цветов (особенно в примере B). К сожалению, алгоритм Calvin позволяет каналам превышать свои максимальные значения, что делает изображения выглядят немного менее круто, чем я надеялся ...
источник
Mathematica, 146 байт
Чистая функция, принимающая строку. Для того, чтобы запустить его в разумном количестве времени, замените
1
ин1+#~ManhattanDistance...
с1.
; это вызывает числовые вычисления вместо символических.Ungolfed:
источник
Python 2,
287251 байтГольф-версия исходного кода, который я использовал для создания изображений. Возможно, можно играть в гольф немного больше (от лучшего игрока в гольф, чем я). Это функция, которая принимает полную строку ввода. Обработка изображений осуществляется с PIL «s модуля Image . Использует манхэттенское расстояние.
Использование евклидова расстояния на 5 байт длиннее (256 байт):
Вот полный набор тестов, который запускает примеры от A до E из вопроса для обеих метрик расстояния:
Все они выглядят неразличимо. Большие из них могут занять несколько секунд.
источник
for x in r(I[0]):...for y in r(I[1]):
, изменив его наfor x in r(I[0]*I[1]):
. Вы можете взять каждый уровень отступа в пределах вниз на 1, и заменитьx
сx/I[1]
иy
сy%I[1]
.from PIL import Image
наfrom PIL import*
C 247 байт
Не собираюсь побеждать, но мне нравится играть в гольф на языке C. Не используется внешняя библиотека изображений, выводится на стандартный вывод в формате PPM. Принимает вход на стандартный ввод. Использует манхэттенское расстояние для игры в гольф.
Вот евклидово расстояние (257 байт):
источник
CJam, 86 байт
Хотя это может выглядеть довольно долго для языка игры в гольф, я считаю, что из представленных решений, это самое короткое, которое не использует функцию вывода изображения. Это создает файл PPM в форме ASCII. Изображение ниже было преобразовано из PPM в PNG с использованием GIMP.
Я не рекомендую запускать код в онлайн-интерпретаторе CJam. По крайней мере, не для полноразмерных изображений. Мой браузер заблокирован, скорее всего из-за использования памяти. Он дополняет изображения 400x400 во втором диапазоне автономной версией.
Объяснение:
источник
C # 718 байт
Я понимаю, что C # ужасно для игры в гольф, но вот моя попытка 718 байт
Если у кого-нибудь есть предложения по его сокращению, дайте мне знать.
источник
Python, 259 байт
Наконец, сделали! Первый кодовый гольф, который я пробовал, решил использовать Python и прошел путь до Манхэттена. Привет Мальтисену, который помог мне с итераторами, уменьшил общий размер почти до половины!
источник
k[0]
иk[1]
в расчетах.CJam, 70 байтов
Евклидово расстояние, выход ASCII PPM. Попробуйте онлайн
Должно быть возможно сжать еще несколько байтов, но я не хочу тратить слишком много времени.
источник