Dengan bilangan bulat Gaussian mana , adalah bilangan bulat dan adalah unit imajiner, kembalikan yang terdekat (wrt ke jarak Euclidean) Bilangan bulat Eisenstein mana , berada bilangan bulat dan .
Latar Belakang
Hal ini mungkin cukup jelas bahwa setiap bilangan bulat Gaussian dapat unik ditulis sebagai dengan , bilangan bulat. Itu tidak begitu jelas tetapi tetap benar: Setiap integer Eisenstein dapat secara unik ditulis sebagai dengan , integer. Keduanya membentuk modul dalam bilangan kompleks, dan keduanya bilangan bulat c-thotomic untuk masing-masing atau . Perhatikan bahwa
Sumber: commons.wikimedia.org
Detail
Dalam hal bilangan kompleks yang diberikan memiliki dua atau tiga titik terdekat, salah satu dari mereka dapat dikembalikan.
Bilangan kompleks diberikan dalam koordinat persegi panjang (basis ), tetapi selain itu dalam format yang mudah seperti
(A,B)
atauA+Bi
atauA+B*1j
dll.- Bilangan bulat Eisenstein harus dikembalikan sebagai koordinat basis tetapi selain itu dalam format yang mudah seperti
(K,L)
atauK+Lω
atauK+L*1ω
dll.
Contohnya
Semua bilangan bulat nyata jelas harus dipetakan ke bilangan bulat nyata lagi.
6,14 -> 14,16
7,16 -> 16,18
-18,-2 ->-19,-2
-2, 2 -> -1, 2
-1, 3 -> 1, 4
(1,w)
dengan(-1,1+w)
. Dan saya juga mengganti nama bagian ini menjadi Contoh untuk menjelaskan bahwa tidak cukup hanya memberikan hasil yang tepat untuk kasus ini.Jawaban:
APL (Dyalog Extended) , 16 byte SBCS
Cobalah online!
Sebuah program penuh yang mengambil
y
makax
dari input standar dan mencetak vektor 2-unsur bilangan bulat.Cara kerjanya: matematika
Pertama-tama, perhatikan bahwa bilangan bulat Gaussian akan ditempatkan pada diagonal vertikal berlian, dengan titikZ ditempatkan pada (x,3–√y) untuk beberapa bilangan bulatx,y .
Dalam gambar,WZ¯¯¯¯¯¯¯¯¯=3–√ danWX¯¯¯¯¯¯¯¯¯¯=XY¯¯¯¯¯¯¯¯=YZ¯¯¯¯¯¯¯=XV¯¯¯¯¯¯¯¯=YV¯¯¯¯¯¯¯¯=13√ . Jadi, mengingat posisi vertikal suatu titik, kita dapat mengidentifikasi titik Eisenstein terdekat sebagai berikut:
Diberi Gaussian pointP , pertama-tama kita menentukan berlian P milik, diukur dengan berapa banyak berlian (dilambangkan h ) Z jauh dari x sumbu.
Kemudian koordinat Eisenstein dariZ adalah
Using the identities forh and w , we can further simplify to:
How it works: the code
sumber
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
.sumber
MATL,
393835 bytesInput format is
6 + 14*1j
(space is optional). Output format is14 16
.Try it online!
Explanation
The code first takes the input as a complex number. It then generates a big enough hexagonal grid in the complex plane, finds the point that is closest to the input, and returns its Eisenstein "coordinates".
sumber
Haskell, 128 bytes
Try it online!
For input Gaussian integer (a,b), convert it into Eisenstein coordinates, floor and ceil both components to get four candidates for closest Eisenstein integer, find the one with minimal distance and return it.
sumber
Tcl,
124116106 bytesTry it online!
This is somewhat inspired by the three-year old post from @Neil
The floor function returns the corner of the rhombus whose edges are the vectors 1 andω . With respect to this rhombus, the Gaussian integer lies on the perpendicular bi-sector of either the top (if l is even) or bottom (if l is odd). This is important because it means that either the lower left corner or the upper right corner will be an acceptable solution. I compute k for the lower left corner, and do one test to see if the Gaussian integer lies above or below the diagonal separating the two corners; I add 1 to k when above the diagonal, and I do likewise for l.
Saved 10 bytes by using the "sign of the cross-product v x d of the diagonal d with the vector v joining the lower right corner and (a,b)" as the test for which side of the diagonal the point lies.
sumber
Burlesque, 24 bytes
Try it online!
Pretty sure this can be shorter. Input read as
a b
sumber
05AB1E, 13 bytes
Port of Bubbler's APL answer
Try it online!
Input and output are both y first, x second.
sumber