Гаус до Айзенштейна


18

Враховуючи ціле число Гаусса де , цілі числа, а є уявною одиницею, поверніть найближчу (wrt на евклідову відстань) ціле число Ейзенштейна де , цілі числа і .a+biabi=exp(πi/2)k+lωklω=exp(2πi/3)=(1+i3)/2

Фон

Напевно, цілком очевидно, що кожне ціле число Гаусса можна однозначно записати як з цілими числами , . Це не так очевидно, але, тим не менш, правда: будь-яке ціле число Айзенштейна однозначно може бути записане як з , цілими числами. Вони обидва утворюють -модуль в межах складних чисел і є обома p -ми циклотомними цілими числами для або відповідно. Зауважте, щоa+biabk+lωklZp=233+2i3+2ω

Джерело: commons.wikimedia.org

Деталі

  • Якщо вказане комплексне число має дві або три найближчі точки, будь-яку з них можна повернути.

  • Комплексне число задається в прямокутних координатах (основи ), але крім цього в будь-якому зручному форматі , як і чи т.п.(1,i)(A,B)A+BiA+B*1j

  • Ціле число Ейзенштейна має бути повернуто в якості координат базису , але крім цього в будь-якому зручному форматі , як або чи т.п.(1,ω)(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

Приємно, я не пам'ятаю, як бачив шестикутну сітку з codegolf.stackexchange.com/q/70017/17602
Ніл



Ви також повинні включати тестові випадки, коли а і b мають протилежні ознаки.
SmileAndNod

@SmileAndNod додав один. Але можна також просто використовувати симетрію відносно реальної осі та просто замінити (1,w)на (-1,1+w). І я також перейменував цей розділ у Приклади, щоб зрозуміти, що недостатньо просто забезпечити правильні результати для цих випадків.
недолік

Відповіді:


7

APL (Dyalog Extended) , 16 байт SBCS

0+⌈3÷⍨1 2×⌊⎕×√3

Спробуйте в Інтернеті!

Повна програма, яка приймає yтоді xзі стандартного введення та друкує двоелементний вектор цілих чисел.

Як це працює: математика

Z(x,3y)x,y

      + W
     /|\
    / | \
   /  |  \
  /   + X \
 /    |    \
+-----|-----+V
 \    |    /
  \   + Y /
   \  |  /
    \ | /
     \|/
      + Z

WZ¯=3WX¯=XY¯=YZ¯=XV¯=YV¯=13

Given a point PWZ¯,{PWX¯the nearest point is WPXY¯the nearest point is VPYZ¯the nearest point is Z

PPhZx

h=P.y÷3

Z

Z.xE=P.x+h,Z.yE=2h

WX¯,XY¯,YZ¯ Pw

w=P.y×3%3

w=0,1,2YZ¯,XY¯,WX¯PZVX

PE.xE=P.x+h+w2,PE.yE=2h+w

hw

y=P.y×3,PE.xE=P.x+y÷3,PE.yE=2y÷3

Як це працює: код

0+⌈3÷⍨1 2×⌊⎕×√3
           ⌊⎕×√3   Take the first input (P.y) and calculate y'
   ⌈3÷⍨1 2×       ⍝ Calculate [ceil(y'/3), ceil(2y'/3)]
⎕0+  ⍝ Take the second input(P.x) and calculate [P.x+ceil(y'/3), ceil(2y'/3)]

2

JavaScript (ES6), 112 байт

(a,b,l=b/Math.pow(.75,.5),k=a+l/2,f=Math.floor,x=k-(k=f(k)),y=l-(l=f(l)),z=x+y>1)=>[k+(y+y+z>x+1),l+(x+x+z>y+1)]

ES7 може очевидно обрізати 9 байт. Пояснення: kі lспочатку представляють рішення з плаваючою комою для k+ωl=a+ib. Однак координати необхідно округлити до найближчого цілого числа на евклідовій відстані. Тому я беру слово kі lпотім виконую кілька тестів на дробові частини, щоб визначити, чи призведе до їх збільшення ближчий момент a+ib.


Я думаю, що ваші тести на дробові частини використовують переваги фактів, що x завжди .2887 або 0.577, а y - це завжди .1547 або .577
SmileAndNod

@SmileAndNod 3 роки тому? Я насправді не можу згадати, але я не думаю, що це так складно, я просто опрацьовую, який найближчий кут алмазу.
Ніл

2

MATL , 39 38 35 байт

t|Ekt_w&:2Z^tl2jYP3/*Zeh*!sbw6#YkY)

Формат введення є 6 + 14*1j(пробіл необов’язковий). Формат виводу є 14 16.

Спробуйте в Інтернеті!

Пояснення

Код спочатку приймає введення як комплексне число. Потім він генерує досить велику шестикутну сітку в складній площині, знаходить точку, яка є найближчою до входу, і повертає Ейзенштейна "координати".

t         % Take input implicitly. This is the Gauss number, say A. Duplicate
|Ek       % Absolute value times two, rounded down
t_        % Duplicate and negate
w&:       % Range. This is one axis of Eisenstein coordinates. This will generate
          % the hexagonal grid big enough
2Z^       % Cartesian power with exponent 2. This gives 2-col 2D array, say B
t         % Duplicate
l         % Push 1
2jYP3/*   % Push 2*j*pi/3
Ze        % Exponential
h         % Concatenate. Gives [1, exp(2*j*pi/3)]
*         % Multiply by B, with broadcast.
!s        % Sum of each row. This is the hexagonal grid as a flattened array, say C
bw        % Bubble up, swap. Stack contains now, bottom to top: B, A, C
6#Yk      % Index of number in C that is closest to A
Y)        % Use as row index into B. Implicitly display

2

Haskell , 128 байт

i=fromIntegral;r=[floor,ceiling];a!k=(i a-k)**2;c(a,b)|l<-2*i b/sqrt 3,k<-i a+l/2=snd$minimum[(x k!k+y l!l,(x k,y l))|x<-r,y<-r]

Спробуйте в Інтернеті!

Для введення цілого числа Гаусса (a, b) перетворіть його в координати Айзенштейна, підлогу та перекриття обох компонентів, щоб отримати чотири кандидати на найближче ціле число Айзенштейна, знайдіть той, що має мінімальну відстань, і поверніть його.


1

Tcl , 124 116 106 байт

{{a b f\ int(floor(2*$b/3**.5)) {l "[expr $f+(1-$f%2<($b-$f)*3**.5)]"}} {subst [expr $l+$a-($f+1)/2]\ $l}}

Спробуйте в Інтернеті!

Це дещо надихнуло трирічну посаду від @Neil

ω

Збережено 10 байтів, використовуючи "знак поперечного добутку vxd діагоналі d з вектором v, що приєднується до правого нижнього кута, та (a, b)" як тест, для якої сторони діагоналі лежить точка.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.