Учитывая только линейку и компас, вписать ромб внутри данного прямоугольника, разделяя две противоположные точки.
вход
Входными данными являются размеры прямоугольника. В показанном примере это будет 125, 50
. Вы можете вводить данные любым удобным для вас способом (в виде двух целых чисел, списка, строк и т. Д.).
Чем больше размер будет минимум 100, тем меньше будет минимум 25. Обе кепки на 200.
Выход
На выходе будет изображение (отображаемое на экране или сохраненное в виде файла), показывающее
- Прямоугольник ввода
- Все «рабочие» линии / круги
- Вписанный ромб
в разных цветах. На изображении выше прямоугольник черный, рабочие линии синие, а ромб оранжевый. Линии должны быть нарисованы в порядке, указанном в списке (например, ромб перезаписывает рабочие линии и прямоугольник).
Выходное изображение должно быть достаточно большим, чтобы вместить все. Например, показанные круги не могут выходить за пределы.
метод
Метод, использованный в приведенном выше примере изображения:
- Нарисуйте круг, используя нижний левый угол в качестве центра и верхний правый как точку по периметру, давая радиус, равный диагонали прямоугольника.
- Сделайте то же самое, но поменяйте местами центр и периметр.
- Нарисуйте линию между пересечениями двух окружностей, давая перпендикулярную биссектрису диагонали прямоугольника.
- Используйте пересечения новой линии и прямоугольника, чтобы нарисовать ромб.
Это работает, потому что внутренние диагонали ромба всегда перпендикулярно делят друг друга. Я не привожу здесь полное доказательство этого.
Это не единственный способ получить свой ромб, и вы можете использовать другой, учитывая, что вы объясняете, что делаете. Я считаю, что это, вероятно, самый простой, хотя.
правила
Вы можете рисовать только круги и линии (точнее, отрезки). Круг определяется центральной точкой и точкой периметра. Линия определяется любыми двумя точками. Линии не обязательно должны быть любой заданной длины, но они должны по крайней мере покрывать определяющие точки (обратите внимание на пример изображения: линия проходит немного через пересечения окружностей, но не к краю). Для кругов радиус от центра до выбранной точки периметра считается рабочей линией и должен быть показан.
Чтобы растеризовать линии, вы можете использовать любой распознанный алгоритм (например, алгоритм Брезенхэма) или полагаться на то, что может иметь ваш встроенный язык. Если ваши выходные данные основаны на векторах, убедитесь, что они отображаются с разрешением, по крайней мере равным входному прямоугольнику в пикселях. Кроме того, вы будете рисовать на простом холсте, поэтому, пожалуйста, подавьте любые метки сетки или посторонний вывод.
Без обмана! Вы можете только определить расположение точек / линий / кругов, используя то, что вы уже установили. Если вы не можете объяснить, как использовать ваши рабочие линии / круги, чтобы показать, что это ромб, вы делаете это неправильно.
Вы можете использовать любую пару противоположных точек, которую хотите, и прямоугольник не нужно рисовать по оси, если выходные данные верны.
Ввод всегда будет не прямоугольным прямоугольником, поэтому не беспокойтесь об этом в специальном регистре.
Наконец, это стандартный код гольф, поэтому выигрывает самый низкий размер в байтах.