Если дано гауссово целое число где , - целые числа, а - мнимая единица, вернуть самое близкое (относительно евклидова расстояния) целое Эйзенштейна где , - целые числа и .
Фон
Вероятно, совершенно очевидно, что каждое гауссово целое число может быть однозначно записано как с целыми числами , . Это не так очевидно , но тем не менее верно: любое целое Эйзенштейна можно однозначно записать в виде с , целых чисел. Оба они образуют модуль внутри комплексных чисел и оба являются p-тыми циклотомическими целыми числами для или соответственно. Обратите внимание, что
Источник: commons.wikimedia.org
Детали
Если у данного комплексного числа есть две или три ближайших точки, любая из них может быть возвращена.
Комплексное число дается в прямоугольных координатах (основание ), но кроме этого в любом удобном формате, таком как
(A,B)
илиA+Bi
илиA+B*1j
и т. Д.- Целое число Эйзенштейна должно быть возвращено в качестве координат базиса но в любом удобном формате, например,
(K,L)
или,K+Lω
иK+L*1ω
т. Д.
Примеры
Все действительные целые числа, очевидно, должны быть снова сопоставлены с действительными целыми числами.
6,14 -> 14,16
7,16 -> 16,18
-18,-2 ->-19,-2
-2, 2 -> -1, 2
-1, 3 -> 1, 4
(1,w)
на(-1,1+w)
. И я также переименовал этот раздел в Примеры, чтобы прояснить, что недостаточно просто предоставить правильные результаты для этих случаев.Ответы:
APL (Dyalog Extended) , 16 байтов SBCS
Попробуйте онлайн!
Полная программа , которая принимает
y
затемx
из стандартного ввода и выводит 2-элементный вектор целых чисел а.Как это работает: математика
Прежде всего, обратите внимание, что любое гауссово целое число будет помещено на вертикальную диагональ ромба, а точкаZ расположена в (x,3–√y) для некоторого целого числаx,y .
На рисунке,WZ¯¯¯¯¯¯¯¯¯=3–√ иWX¯¯¯¯¯¯¯¯¯¯=XY¯¯¯¯¯¯¯¯=YZ¯¯¯¯¯¯¯=XV¯¯¯¯¯¯¯¯=YV¯¯¯¯¯¯¯¯=13√ . Итак, учитывая вертикальное положение точки, мы можем определить ближайшую точку Эйзенштейна следующим образом:
Учитывая гауссову точкуP , мы сначала определяем, к какому алмазупринадлежитP , и измеряем, сколько алмазов (обозначеноh )Z находится внеосиx .
Тогда координаты ЭйзенштейнаZ являются
Теперь мы определяем из сегментовWX¯¯¯¯¯¯¯¯¯¯,XY¯¯¯¯¯¯¯¯,YZ¯¯¯¯¯¯¯ P принадлежит. Для этого мы можем рассчитать показательw следующим образом:
How it works: the code
источник
JavaScript (ES6), 112 bytes
ES7 can obviously trim 9 bytes. Explanation:
k
andl
initially represent the floating-point solution tok+ωl=a+ib
. However, the coordinates needed to be rounded to the nearest integer by Euclidean distance. I therefore take the floor ofk
andl
, then perform some tests on the fractional parts to determine whether incrementing them would result in a nearer point toa+ib
.источник
MATL,
393835 bytesInput format is
6 + 14*1j
(space is optional). Output format is14 16
.Try it online!
Explanation
Сначала код принимает входные данные как комплексное число. Затем он генерирует достаточно большую гексагональную сетку в комплексной плоскости, находит точку, ближайшую к входу, и возвращает его «координаты» Эйзенштейна.
источник
Haskell , 128 байт
Попробуйте онлайн!
Для ввода гауссовского целого числа (a, b), конвертируйте его в координаты Эйзенштейна, задайте для пола и потолка оба компонента, чтобы получить четыре кандидата на ближайшее целое число Эйзенштейна, найдите тот с минимальным расстоянием и верните его.
источник
Tcl ,
124116106 байтПопробуйте онлайн!
Это несколько вдохновлено трехлетней записью от @Neil
Функция floor возвращает угол ромба, ребрами которого являются векторы 1 иω , Относительно этого ромба гауссово целое число лежит на перпендикулярном би-секторе либо вершины (если l четное), либо основания (если l нечетное). Это важно, потому что это означает, что либо нижний левый угол, либо верхний правый угол будет приемлемым решением. Я вычисляю k для левого нижнего угла и делаю один тест, чтобы увидеть, находится ли гауссово целое число выше или ниже диагонали, разделяющей два угла; Я добавляю 1 к k, когда выше диагонали, и я делаю то же самое для л.
Сохранение 10 байтов с использованием «знака перекрестного произведения vxd диагонали d с вектором v, соединяющим нижний правый угол и (a, b)», в качестве теста, для которого лежит сторона диагонали.
источник
Бурлеск , 24 байта
Попробуйте онлайн!
Уверен, это может быть короче. Ввод читать как
a b
источник
05AB1E , 13 байтов
Ответ APL порта Bubbler
Попробуйте онлайн!
Вход и выход - у первого, х второго.
источник