Маленький Чендлер грустный. Нарисуй ему облако, чтобы подбодрить его.
Примечание: рисование облака на самом деле не поднимет его настроение.
Круг может быть определен как 3-кортеж, (x,y,r)
где x
- это положение x круга на декартовой плоскости, y
это положение y круга на декартовой плоскости и r
радиус этого круга. x
и y
может быть отрицательным. r
всегда позитивно Вход представляет собой список окружностей в виде разделенных пробелами 3-х кортежей. Например:
3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8
В 3,1,1
означает «круг с центральной точкой на 3,1
1 радиус. 3,2,1.5
Означает» круг с центральной точкой на 3,2
1,5 радиуса.
Если мы нарисуем все эти круги ввода на графике, это будет выглядеть так (я добавил линии сетки и метки только для ясности; они не обязательны):
Обратите внимание, как все круги сплочены . То есть все они перекрываются друг с другом, так что он образует одну большую группу без каких-либо маленьких групп кругов, отделенных от остальных. Вход гарантированно будет согласованным.
Предположим теперь, что мы нарисуем линию, которая проходит вокруг «границы», образованной этими кругами, без каких-либо других линий. Это все равно что нарисовать границу силуэта, образованного всеми кругами. Получившееся облако будет выглядеть примерно так:
Таким образом, это облако было сформировано путем рисования только дуг окружностей на входе, которые образуют границу, в результате чего получается единая фигура. Другими словами, облако формируется только путем рисования дуг, которые не находятся внутри другого круга. Ваша программа примет входные данные в форме, описанной выше, и выведет изображение, отображающее полученное облако. Общая форма облака должна быть правильной, но масштаб, цвет, толщина линий и то, как они выглядят на вершинах, зависит от вас. Обратите внимание, что облако должно быть видимым, поэтому вы не можете нарисовать что-то вроде «Эта программа рисует белое облако на белом фоне», «Эта программа рисует облако в бесконечно малом масштабе», «Эта программа рисует облако с 0 толщина линии »и т. д. Также обратите внимание, что цвет рамки должен отличаться от цвета заливки или фона.
Другой пример. Входные данные:
1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7
Выход:
Если в облаке есть «дыра», вы также должны нарисовать эту дыру. Входные данные:
0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4
Выход:
Вот важное правило: ваша программа должна рисовать только те линии, которые образуют границу. Это означает, что вы НЕ МОЖЕТЕ просто нарисовать круги полностью, а затем нарисовать круги немного меньшего размера с белой заливкой - потому что этот метод по-прежнему рисует линии, которые не образуют границы, он просто покрывает их впоследствии. Цель правила состояла в том, чтобы предотвратить реализацию «нарисовать круги, а затем снова нарисовать круги с белой заливкой» или что-нибудь подобное. Ожидается, что ответ на самом деле рассчитать, где рисовать вещи, прежде чем рисовать его.
Это код гольф, поэтому выигрывает самое короткое число персонажей.
источник
Ответы:
Mathematica
177 126 121119Решение по регионам диска: подход математика
Логика заключается в
Это именно тот подход, который принят ниже. Он произвел 3 цифры выше.
Неявная область # 1 является объединением кругов. Неявная область № 2 представляет собой объединение дисков, лежащих внутри окружностей. Их разница - это граница.
Решение по регионам диска: подход инженера (119 символов)
Следующее берет объединение областей диска, дискретизирует эту область и находит ее границу. Точки на диаграмме разграничивают интервалы сетки Делоне. Мы отображаем дискретизированную область ниже, чтобы выделить объект, представляющий интересующую границу (контур облака).
«3,1,1 3,2,1,5 1,2,0,7 0,9,1,2,1,2 1,0,0,8»
Граница области дискретизирована.
Решая, обнаруживая края: подход фотографа - 121 символ
Он рисует диски в черном цвете, растеризует изображение, обнаруживает края и инвертирует черно-белое изображение.
источник
RegionBoundary@DiscretizeRegion@RegionUnion[{#,#2}~Disk~#3&@@@ToExpression[#~s~","]&@s@InputString[s=StringSplit]]
s=StringSplit
внутри подсказки? Попробуйте переместить это вперед, должно быть все еще короче, чем ваша текущая версия.T-SQL
23523422921217173 байтаЭто использует пространственную функциональность в SQL Server 2012+. При запуске в SSMS (SQL Server Management Studio) создается пространственная панель результатов.
Ввод от переменной @i. Я мог бы уменьшить его дальше, если бы вход мог быть взят из таблицы.Так как вход в таблицу теперь разрешен.
Я оставил предыдущее решение ниже.
Редактировать : Удалить свободное пространство, излишки в и подзапрос
171: Создание таблицы заменено на CTE, а @s на @.
Разрушение динамического SQL
источник
'A' has fewer columns than were specified in the column list
DECLARE @i VARCHAR(100) = '1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7'
, К сожалению, я не могу проверить в данный момент, и SQLfiddle не очень хорошо играет в 2012 году.Mathematica,
175158149 байтИз обсуждения в песочнице я помню, что этот подход должен был быть действительным, но я не совсем уверен, как он сочетается с новой формулировкой правил, поэтому @Lilac, дайте мне знать, если вы считаете, что это нарушает правила.
По сути, я создаю логическое условие, которое верно для всех точек внутри облака и ложно для всех точек за его пределами. Я кормлю то,
RegionPlot
что затем отображает область всех точек, где находится выражение,True
а также контур вокруг него.Ungolfed:
источник
ImplicitRegion
автоматически находит правильные значения x и y для построения графика. 122s = StringSplit; RegionPlot@ ImplicitRegion[ Or @@ (((x - #)^2 + (y - #2)^2 < #3^2) & @@@ (ToExpression[#~s~","] &@(s@InputString[]))), {x, y}]
RegionPlot
до сих пор.),AspectRatio-> 1
код возвращается к 149 байтам, именно там, где он сейчас стоит.Python 3.3 (
183177164160 байт)Требуется консоль шириной 80 символов, которую я знаю по умолчанию в Windows. Это работает лучше всего, если ваша консоль имеет квадратный шрифт. Вот некоторые выдержки из некоторых тестовых входов.
Оригинал:
Другая:
Отверстие:
источник
Питон -
253249215199Это объявление об удивительной красивой библиотеке, чьи геометрические операции упрощают написание решения путем рисования контура (ов) объединения перекрывающихся кругов (= буферизованные точки):
Выход:
Edit (ы):
sys.argv[1:]
наraw_input().split()
, экономяimport sys
k={'color':'k'}
роскошь, замененаsavefig
наshow
map(float,s.split(','))
наeval(s)
источник
Питон - 535
источник
from math import*
удаления ненужных пробелов, использования только однобуквенных имен переменных, с использованием понимания списка (например,cc=[z for z in a if z!=a2 and (z[0]…)]
). Также взгляните на советы по игре в гольф на Python .a2
.Питон -
296249231223212Авторы обращаются к @ richard-green (разрешение было дано) за оригинальное решение, я просто немного его урезал.
источник
pylab
вместоmatplotlib.pyplot
.from pylab import *
, смогу ли я позвонитьshow()
иscatter()
без каких-либо ссылок?[eval(i)for i in raw_input().split()]
как питонeval
превращается1,2,3
в кортеж. Вы также , конечно , придется изменить[x,y,r]
к(x,y,r)
.JavaScript (E6) + HTML 322
JSFiddle
Каждый круг делится примерно на 100 маленьких дуг, и каждая дуга рисуется, если его средняя точка не находится внутри других окружностей.
источник
Python 274 байта
Он принимает входные данные от стандартного ввода и проверяет каждую точку на экране, рисуя пиксели один за другим. Не совсем эффективно, но следует всем правилам.
Обратите внимание, что отображение Pygame прекратится, как только рисунок будет завершен, я не был уверен, стоит ли включать его как часть моего ответа, но для его просмотра вы можете либо добавить
raw_input
в конце, либо добавить небольшой цикл, если вы хочу, чтобы ОС не жаловалась на то, что она не отвечает, и такие:Примеры изображений:
1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7, 1,2,0.7
0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4
источник
Perl - 430
Записывает файл pbm в стандартный вывод.
Тестовое изображение (преобразуется в png):
источник