Целью этой задачи является создание анимации системы цепного привода , состоящей из набора звездочек, соединенных вместе цепью .
основные требования
Ваша программа получит список звездочек , указанных в виде (x, y, radius)
триплетов. В результате чего система цепного привода состоит из этих цепных колес, соединенных друг с другом посредством замкнутой цепи тугой , проходящей через каждый из них, в порядке . Ваша цель - создать бесконечно цикличную анимацию , показывающую систему в движении. Например, учитывая вход
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
, вывод должен выглядеть примерно так
,
Система координат должна быть такой, чтобы ось x указывала вправо, а ось y была направлена вверх. Вы можете предположить, что радиусы являются четными числами, большими или равными 8 (мы увидим, почему это важно позже.) Вы также можете предположить, что есть как минимум две звездочки и что звездочки не пересекаются друг с другом. В блокахвходные данные не слишком критичны. Все примеры и тестовые случаи в этом посте используют пиксели в качестве входных единиц (поэтому, например, радиус средней звездочки на предыдущем рисунке равен 24 пикселям;) старайтесь не слишком сильно отклоняться от этих единиц. В остальной части задачи пространственные величины понимаются в тех же единицах, что и входные данные - обязательно соблюдайте правильные пропорции! В размерах продукции должны быть немного больше , чем ограничительная рамка всех звездочек, достаточно большой , так что вся система видна. В частности, абсолютные положения звездочек не должны влиять на производительность; только их относительные положения (так, например, если бы мы сместили все звездочки в приведенном выше примере на одну и ту же величину, результат останется прежним.)
Цепь должна касаться звездочек, через которые она проходит во всех точках контакта, и прямо везде. Цепь должна проходить через звездочки так, чтобы соседние сегменты цепи (то есть части цепи между двумя звездочками, которые встречаются в одной звездочке) не пересекались друг с другом.
,
Например, хотя приведенная выше левая система действительна, средняя - нет, поскольку два соседних сегмента цепи, которые проходят через нижнюю левую звездочку, пересекаются. Тем не менее, отметим , что правая система является действительным, так как две пересекающиеся сегменты цепи не являются смежными (эта система производится на другой вход , чем два других, хотя.)
Для простоты (r), вы можете предположить, что никакая звездочка не пересекает выпуклую оболочку двух соседних звездочек или выпуклую оболочку каждого из ее соседей и другого соседа. Другими словами, верхняя звездочка на приведенной ниже схеме не может пересекать какие-либо затененные области.
Цепные сегменты могут пересекать звездочки, отличные от тех, через которые они проходят (например, в последнем тестовом примере). В этом случае цепь всегда должна появляться перед звездочками.
Визуальные требования
Цепочка должна состоять из ряда звеньев переменной ширины. Ширина узкой ссылки должна составлять около 2, а ширина широкой ссылки должна составлять около 5. Длина обоих типов ссылок должна быть примерно одинаковой. периодцепи, то есть общая длина широкой / узкой пары звеньев, должна быть ближайшим к 4π числом, которое соответствует целому числу раз в длине цепочки. Например, если длина цепочки равна 1000, то ее период должен быть 12,5, что является ближайшим числом к 4π (12,566 ...), которое соответствует целому числу раз (80) в 1000. Важно, чтобы период соответствовал целому числу раз в длине цепочки, чтобы не было артефактов в точке, где цепочка оборачивается.
Звездочка радиуса R должна состоять из трех концентрических частей: центральной оси , которая должна быть окружностью с радиусом около 3; в теле звездочки в , вокруг оси, которая должна быть окружностью радиуса около R - 4,5; и ободок звездочки вокруг корпуса, который должен быть окружностью с радиусом около
R - 1,5. Обод также должен содержать зубцы звездочки , которые должны иметь ширину около 4; размер и расстояние между зубцами должны соответствовать размерам звеньев цепи, чтобы они аккуратно соприкасались.
Период зубьев звездочки, то есть расстояние между двумя последовательными зубцами вдоль окружности звездочки, должно соответствовать периоду цепи. Поскольку период составляет около 4π, а радиус звездочки гарантированно равен, период должен соответствовать размеру звездочки почти целое число раз, чтобы не было заметных артефактов в точке, где зубы звездочки обвиваются вокруг.
Вы можете использовать любую комбинацию цветов для цепи, различных частей звездочки и фона, если они легко различимы . Фон может быть прозрачным. Примеры в этом посте используют #202020
для цепи, #868481
для оси и обода #646361
звездочки , а также для тела звездочки.
Требования к анимации
Первая звездочка в списке ввода должен вращаться по часовой стрелке ; остальные звездочки должны вращаться соответственно. Цепь должна двигаться со скоростью около 16π (около 50) единиц в секунду; частота кадров зависит от вас, но анимация должна выглядеть достаточно плавно.
Анимация должна проходить без проблем .
Соответствие
Некоторые из визуальных атрибутов и пропорций преднамеренно указаны только приблизительно - вам не нужно точно их сопоставлять . Вывод вашей программы не обязательно должен быть точной копией приведенных здесь примеров, но он должен выглядеть примерно так. В частности, точные пропорции цепи и звездочек, а также точная форма звеньев цепи и зубьев звездочки являются гибкими.
Наиболее важные моменты для подражания:
- Цепь должна проходить через звездочки в порядке ввода в правильном направлении.
- Цепь должна касаться звездочек во всех точках контакта.
- Звенья цепи и зубья звездочек должны быть аккуратно заделаны, по крайней мере, до правильного расстояния и фазы.
- Расстояние между звеньями цепи и зубьями звездочек должно быть таким, чтобы не было заметных артефактов в месте их наматывания.
- Звездочки должны вращаться в правильном направлении.
- Анимация должна проходить без проблем.
В заключение, хотя технически цель этой задачи состоит в том, чтобы написать кратчайший код, если вы хотите проявить творческий подход и создать более сложный результат, во что бы то ни стало, сделайте это!
Вызов
Напишите программу или функцию , взяв список звездочек и создав соответствующую анимацию системы цепного привода, как описано выше.
Вход и выход
Вы можете принять ввод через командную строку , через STDIN , как аргументы функции , или используя эквивалентный метод . Вы можете использовать любой удобный формат для ввода, но не забудьте указать его в своем посте.
В качестве вывода вы можете отобразить анимацию напрямую , создать файл анимации (например, анимированный GIF- файл ) или создать последовательность файлов кадров (однако в этом случае существует небольшое наказание; см. Ниже.) Если вы используете вывод файла, убедитесь, что количество кадров разумно (примеры в этом посте используют очень мало кадров;) количество кадров не должно быть минимальным, но вы не должны создавать слишком много лишних кадров. Если вы выводите последовательность кадров, обязательно укажите частоту кадров в своем посте.
Гол
Это код-гольф . Самый короткий ответ , в байтах, выигрывает.
Штраф + 10% Если ваша программа выдает последовательность кадров в качестве выходных данных, вместо непосредственного отображения анимации или создания одного файла анимации, добавьте 10% к вашему счету.
Тестовые случаи
Тест 1
(0, 0, 26), (120, 0, 26)
Тест 2
(100, 100, 60), (220, 100, 14)
Тест 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
Тест 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
Тест 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
Тест 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)
Ответы:
JavaScript (ES6),
2557191518971681 байтЭто не супер-пупер- гольф ; это минимизировано - частично вручную - но в этом нет ничего особенного. Без сомнения, было бы короче, если бы я играл в гольф больше перед минификацией, но я потратил (более) достаточно времени на это уже.
Изменить: Хорошо, так что я потратил больше времени на это и больше играл в коде, прежде чем минимизировать (очень на этот раз вручную). Код все еще использует тот же подход и общую структуру, но я все равно сэкономил 642 байта. Не так уж плохо, если я сам так скажу. Вероятно, упустили некоторые возможности сохранения байтов, но на данный момент даже я не уверен, как это работает больше. Единственное, что отличается с точки зрения вывода, это то, что теперь он использует немного другие цвета, которые можно написать более кратко.
Редактировать 2 (намного позже): сохранено 18 байт. Спасибо ConorO'Brien в комментариях за то, что они указали на очевидное, что я полностью пропустил.
Редактировать 3: Итак, я решил, что перепроектирую свой собственный код, потому что, честно говоря, я не мог вспомнить, как я это сделал, и я потерял версии без гольфа. Итак, я прошел, и вот нашел еще 316 байтов для экономии путем реструктуризации и выполнения некоторого микро-гольфа.
Приведенная выше функция добавляет элемент SVG (включая анимацию) к документу. Например, для отображения второго контрольного примера:
Кажется, работает удовольствие - по крайней мере, здесь, в Chrome.
Попробуйте это в приведенном ниже фрагменте (нажатие на кнопки приведет к созданию каждого из тестовых примеров OP).
Показать фрагмент кода
Код рисует зубья цепи и зубчатой передачи штриховыми штрихами. Затем он использует
animate
элементы для анимацииstroke-dashoffset
атрибута. Результирующий элемент SVG является автономным; нет анимации на основе JS или CSS-стилей.Чтобы все выстроилось в ряд, зубчатое кольцо каждого зубчатого колеса фактически нарисовано как путь, состоящий из двух дуг, поэтому путь может начинаться прямо в точке касания, где цепочка касается. Это значительно упрощает его выравнивание.
Кроме того, кажется, что при использовании штриховых штрихов SVG возникает много ошибок округления. По крайней мере, это то, что я видел; чем длиннее цепь, тем хуже она будет сцепляться с каждым последующим механизмом. Таким образом, чтобы свести к минимуму проблему, цепь на самом деле состоит из нескольких путей. Каждый путь состоит из дугообразного сегмента вокруг одной передачи и прямой линии на следующую передачу. Их рычаги рассчитываются для соответствия. Тонкая «внутренняя» часть цепочки, однако, представляет собой просто петлю, поскольку она не анимирована.
источник
R=g=>...
<g>
, а помещал прямо в корень svg. Также найдено место, где вы преобразовали флаг развертки и большой флаг дуги из логического значения в число1*x
, но вы могли бы использовать+x
C # 3566 байт
Не гольф, ноработает (я думаю)Неуправляемый в истории редактирования.
Использует Magick.NET для рендеринга GIF.
Класс P имеет функцию F; Пример:
источник
public
модификатор перед каждым полем в вашем классе?using
должны быть включены соответствующие пункты или полностью квалифицированные типы при использовании, а также ссылка на System.Drawing. в ответе (должно ли это прибавиться к счету, я не знаю). Впечатляющий ответ в любом случае.JavaScript (ES6) 1626 байт
Это решение является результатом реверс-инжиниринга решения @ Flambino, я публикую его с его согласия.
Негольфированная версия:
источник