Я смотрю из окна на чердаке во двор соседа. У них есть собака, прикованная к столбу в центре двора. Собака бегает по двору, но всегда находится на конце своей цепи, так что в итоге она оставляет след в грязи. Обычно эта дорожка была бы идеально круглой, но у моих соседей есть некоторые другие полюсы в их дворе, которые цепляются за цепь собаки. Каждый раз, когда цепь собаки ударяется о столб, собака начинает вращаться вокруг нового полюса с любой длиной цепи, равной ее радиусу. Поскольку полюса, собака и цепь имеют нулевую ширину (мои соседи - математики), цепь может вращаться вокруг полюса бесконечно без сокращения радиуса круга. Собака также может пройти через цепь (только не ошейник), если цепь находится на ее пути. Наблюдая за этой странностью какое-то время, я решаю написать код, имитирующий собаку моего соседа. Код будет принимать местоположения центрального полюса, к которому прикована собака, местоположения других полюсов во дворе моих соседей, длину цепи и начальное местоположение собаки, и выводит диаграмму, указывающую путь, где собака стерла траву. Вы можете предположить, что любая комбинация из следующих является постоянной (и, следовательно, не принимать их в качестве входных данных):
Расположение полюса, к которому прикована собака
Длина цепи
Исходное местоположение собаки
Солнце встает, поэтому пространство на полу моего чердака, освещаемое окном, сокращается, давая мне все меньше и меньше места для написания моего кода. Пожалуйста, постарайтесь свести к минимуму количество байтов в вашем коде, чтобы у меня было место для черновика на моем чердаке.
Контрольные примеры
Здесь я предполагаю, что собака начинается в 3 единицах к югу от того полюса, к которому она прикована (красная точка), расположенной в 0,0
. Я указал, где полюса с точками для ясности, вам не нужно включать их в свой вывод.
Poles at 1,2 -1,2
Poles at 0,.5
Poles at 0,1 1,1 -2,1 -1,-.5
Poles at 0,1 1,1
источник
{0,-.5}
?{0,.5}
переворачивается по вертикали без наибольшего круга. Собака по сути начинает зацепляться за второй столб.Ответы:
Python 3 с использованием matplotlib, 457 байт
Поскольку ваши соседи математики, я предположил, что сад вашего соседа занимает сложную область, и поэтому любые координаты объектов в саду являются комплексными числами. Чтобы использовать эту функцию, вы должны передать ей список комплексных чисел, обозначающих расположение полюсов в саду вашего соседа. Было выбрано представление системы координат по умолчанию, где справа - положительные действительные числа, а вверх - положительные мнимые числа. Это означает, что примеры становятся:
Кроме того, программа предполагает следующее: привязь привязана к точке 0, длина привязи составляет 3 единицы, а площадь графика равна 10 на 10 с центром в районе 0. Для этих параметров результаты точно совпадают с примерами, и вот как выглядит результат (для последнего примера):
Алгоритм довольно прост, требуется только одно условие, чтобы различать поиск по часовой стрелке и против часовой стрелки. Состояние алгоритма определяется текущей точкой вращения и ориентацией / оставшейся длиной поводка, когда он достигает текущей точки вращения. Это работает следующим образом:
Затем этот алгоритм выполняется сначала в направлении по часовой стрелке, после чего состояние сбрасывается и выполняется в направлении против часовой стрелки. Простота алгоритма означает, что около половины всей программы тратится на функции рисования. Если бы процедуры рисования были удалены, он бы удалил 218 байт из размера программы.
Ниже приведена версия, не содержащая гольф, которая также содержит отладочный код, который также отображает точки и столкновения поводка:
Выходные данные выглядят так:
источник
Обработка 3, 815,
833,835,876,879байтов.Благодаря @ZacharyT удалось сэкономить два байта, удалив ненужные скобки
Запустите эту программу так:
(функция
s
принимает вfloat[][]
). По сути, это тестовый пример № 3, но умноженный на 100, чтобы соответствовать окну.Несколько вещей на заметку:
pushMatrix()
и работаpopMatrix()
могут содержать только 32 матрицы.Пример вывода для приведенного выше теста.
Если вы хотите увидеть предварительно подтвержденный вывод, добавьте эту строку сразу после
translate(w,w);
функции ins
.И это дает нам такой результат:
Неуправляемый
f()
и объяснение(также содержит отладочный код)
Короче говоря, программа отправляет двух «искателей», один идет против часовой стрелки, а другой по часовой стрелке. Каждый из этих искателей находит ближайший полюс и рисует дугу к нему, если цепь достаточно длинная, в противном случае он рисует круг. Как только он рисует дугу, он отправляет другого искателя к этому полюсу, и процесс продолжается.
f()
содержит процесс каждого ищущего. Более подробное объяснение придет, как только я пойду в гольф.источник
L-d
?LOGO,
305298297293 байтаПопробуйте код на FMSLogo.
Определите функцию
draw
(как «гольф»d
), которая при вводе в виде списка координат полюса (напримерdraw [[0 100] [100 100] [-200 100] [-100 -50][0 0]]
, отобразит на экране результат).Требования:
[0 0]
должен быть включен в список полюсов. Если включен код отладки (отрисовки полюсов), то он[0 0]
должен быть последним.x=0, y=-300
(как в описании проблемы)Возможные оптимизации:
>=
на>
Гольф-код:
Развернутый код (
;
запускает встроенный комментарий (используется для пояснения) и:
запускает имя переменной):источник
Python 2 + PIL, 310 байт
Скрипт читает список точек из стандартного ввода в виде списка комплексных чисел.
источник