Учитывая только линейку и компас, вписать ромб внутри данного прямоугольника, разделяя две противоположные точки.
вход
Входными данными являются размеры прямоугольника. В показанном примере это будет 125, 50
. Вы можете вводить данные любым удобным для вас способом (в виде двух целых чисел, списка, строк и т. Д.).
Чем больше размер будет минимум 100, тем меньше будет минимум 25. Обе кепки на 200.
Выход
На выходе будет изображение (отображаемое на экране или сохраненное в виде файла), показывающее
- Прямоугольник ввода
- Все «рабочие» линии / круги
- Вписанный ромб
в разных цветах. На изображении выше прямоугольник черный, рабочие линии синие, а ромб оранжевый. Линии должны быть нарисованы в порядке, указанном в списке (например, ромб перезаписывает рабочие линии и прямоугольник).
Выходное изображение должно быть достаточно большим, чтобы вместить все. Например, показанные круги не могут выходить за пределы.
метод
Метод, использованный в приведенном выше примере изображения:
- Нарисуйте круг, используя нижний левый угол в качестве центра и верхний правый как точку по периметру, давая радиус, равный диагонали прямоугольника.
- Сделайте то же самое, но поменяйте местами центр и периметр.
- Нарисуйте линию между пересечениями двух окружностей, давая перпендикулярную биссектрису диагонали прямоугольника.
- Используйте пересечения новой линии и прямоугольника, чтобы нарисовать ромб.
Это работает, потому что внутренние диагонали ромба всегда перпендикулярно делят друг друга. Я не привожу здесь полное доказательство этого.
Это не единственный способ получить свой ромб, и вы можете использовать другой, учитывая, что вы объясняете, что делаете. Я считаю, что это, вероятно, самый простой, хотя.
правила
Вы можете рисовать только круги и линии (точнее, отрезки). Круг определяется центральной точкой и точкой периметра. Линия определяется любыми двумя точками. Линии не обязательно должны быть любой заданной длины, но они должны по крайней мере покрывать определяющие точки (обратите внимание на пример изображения: линия проходит немного через пересечения окружностей, но не к краю). Для кругов радиус от центра до выбранной точки периметра считается рабочей линией и должен быть показан.
Чтобы растеризовать линии, вы можете использовать любой распознанный алгоритм (например, алгоритм Брезенхэма) или полагаться на то, что может иметь ваш встроенный язык. Если ваши выходные данные основаны на векторах, убедитесь, что они отображаются с разрешением, по крайней мере равным входному прямоугольнику в пикселях. Кроме того, вы будете рисовать на простом холсте, поэтому, пожалуйста, подавьте любые метки сетки или посторонний вывод.
Без обмана! Вы можете только определить расположение точек / линий / кругов, используя то, что вы уже установили. Если вы не можете объяснить, как использовать ваши рабочие линии / круги, чтобы показать, что это ромб, вы делаете это неправильно.
Вы можете использовать любую пару противоположных точек, которую хотите, и прямоугольник не нужно рисовать по оси, если выходные данные верны.
Ввод всегда будет не прямоугольным прямоугольником, поэтому не беспокойтесь об этом в специальном регистре.
Наконец, это стандартный код гольф, поэтому выигрывает самый низкий размер в байтах.
источник
Ответы:
HTML + JavaScript (ES6), 34 + 353 = 387 байт
Ввод должен быть дан в формате
[125,50]
.Просто много математики и рисования ... Прямоугольник рисуется вбок, если высота больше ширины, что, я считаю, допустимо.
источник
444
: P400
;-)Mathematica,
157148158 байтСпасибо Martin Ender за комментарии с их обычным высоким качеством! 9 байтов сохранено в этом случае.
Отредактировано, как только выяснилось, что аргументы могут прийти в любом порядке; 10 байтов добавлено для компенсации.
Опять же, именно здесь Mathematica сияет: высокоуровневый графический вывод, включающий математические вычисления. Тот же код с пробелами и символами новой строки для удобства чтения:
Безымянная функция одного аргумента, который представляет собой упорядоченную пару положительных чисел; финал
@@ Sort@# &
преобразует эту пару в два числовых аргумента, где первое число меньше.Line
создает многоугольный путь от точки к точке, который превратится в замкнутый многоугольник, если первая и последняя точки совпадают;Circle
создает круг с заданным центром и радиусом. Специальные точкиo
иc
(нижний левый и верхний правый углы прямоугольника)p
(третий угол ромба, заданный математической формулой) иk
(помогая нарисовать перпендикулярный биссектрису) даны имена по пути для сохранения байтов при повторном вызове , как особая пара точекl = {o,c}
, Mathematica рада добавить точки напрямую, умножить обе координаты на один и тот же коэффициент, взять их точечное произведение и т. Д., И все это упрощает код.Пример вывода с аргументами
125
и50
:источник
{0,0}
. Поскольку нет необходимости использовать синий и оранжевый цвета, вы можете сохранять байты, используяRed
вместоOrange
. Вы используетеLine
четыре раза, что более чем достаточно для сохранения байтовi=Line;
(как правило, если в выражении естьn
символы и вы используете егоm
раз, когда вам нужно(m-1)*(n-1) > 4
, меньше, если вы можете назначить переменную при первом использовании без скобок).0{,}
трюк фантастический: D@@Sort@#&
и замены#
и в#2
течение кода или , альтернативно , адаптируя его к работе с портретной ориентации прямоугольников вместо.MetaPost, 473 (с цветом) 353 (без цвета)
Цветной (473 байта):
Неокрашенный (353 байта):
Никогда НИКОГДА не использовал это раньше, и я уверен, что я убил это ...
Но когда вы запустите это на этом сайте:
http://www.tlhiv.org/mppreview/
Он использует пересечение окружностей, чтобы нарисовать вторую ось, а затем использует пересечение оси и прямоугольника, чтобы нарисовать заключительный ромб. Хотя я мог бы обмануть и просто нарисовал линию, перпендикулярную первой оси, ха-ха.
Чтобы изменить размеры, просто измените A и B.
Независимо от этого вы получите (для L = 170, H = 100):
источник
Desmos, 375 (или 163) байтов
w
иh
являются входными данными. Попробуйте это на Desmos!Альтернативная 163-байтовая версия:
Эта версия требует, чтобы каждая строка была скопирована и вставлена в каждую отдельную строку в Desmos. Мета все еще должен решить, является ли это действительным методом подсчета, но первый метод определенно хорош.
источник
ImageMagick версия 7.0.3 + bash + sed, 496 байт
Результат с "rhombus.sh 180 120"
Точнее (используя холст 6400х6400 вместо 800х800), 570 байт
Пересечения не точны; директива strokewidth делает линии достаточно широкими, чтобы обеспечить смешивание хотя бы одного целого пикселя только с цветами двух пересекающихся линий, но в худших случаях (25x200 и 200x25) пересечения находятся под небольшим углом, поэтому облако длина смешанных пикселей составляет несколько пикселей, и поскольку мы выбираем первый и последний смешанный пиксель, возникает небольшая ошибка. Использование холста большего размера в 8 раз с той же шириной штриха, а затем масштабирование результата уменьшает ошибку до менее чем одного пикселя, но примерно в 64 раза быстрее.
Результаты нормального 800x800 против точного 6400x6400:
Ungolfed:
источник
R, 290 байт
Анонимная функция, вывод отображается на экране. Слегка разгоряченный, с комментариями:
Пример вывода для (120 100):
источник
LibreLogo , 270 байт
Код:
Результат:
Объяснение:
источник
Python 3.5 + Tkinter, 433 или 515 байт
Неокрашенный (433 байта):
Цветной (515 байт):
Именованная функция, которая принимает входные данные как 2 числа, разделенных запятыми. Вывод дается в отдельном окне, которое вам может потребоваться изменить размер, чтобы увидеть полный вывод. Вот пример цветного вывода для
V(180,130)
:источник
SmileBASIC, 280 байт
(Снимок экрана / объяснение будет опубликовано в ближайшее время) Цвет фона - черный, прямоугольник - красный, круги и линии - белый, а ромб - желтый.
источник