Dado um inteiro gaussiano onde , são inteiros e é a unidade imaginária, retorne o mais próximo (Wrt à distância euclidiana) inteiro Eisenstein onde , seja inteiros e .
fundo
Provavelmente é bastante óbvio que todo número inteiro gaussiano pode ser exclusivamente escrito como com , inteiros. Não é tão óbvio, mas mesmo assim verdadeiro: qualquer número inteiro de Eisenstein pode ser exclusivamente escrito como com , números inteiros. Ambos formam um módulo dentro dos números complexos e são ambos os números inteiros ciclotômicos para ou respectivamente. Observe que
Fonte: commons.wikimedia.org
Detalhes
Caso o número complexo fornecido tenha dois ou três pontos mais próximos, qualquer um deles poderá ser retornado.
O número complexo é dado em coordenadas retangulares (base ), mas diferente daquele em qualquer formato conveniente como
(A,B)
ouA+Bi
ouA+B*1j
etc.- O inteiro Eisenstein deve ser retornado como coordenadas da base mas que não seja em qualquer formato conveniente como
(K,L)
ouK+Lω
ouK+L*1ω
etc.
Exemplos
Todos os números inteiros reais obviamente devem ser mapeados para os números inteiros reais novamente.
6,14 -> 14,16
7,16 -> 16,18
-18,-2 ->-19,-2
-2, 2 -> -1, 2
-1, 3 -> 1, 4
(1,w)
por(-1,1+w)
. Também renomei esta seção para Exemplos para deixar claro que não é suficiente apenas fornecer os resultados corretos para esses casos.Respostas:
APL (Dyalog Extended) , SBCS de 16 bytes
Experimente online!
Um programa completo que leva
y
, em seguida,x
a partir da entrada padrão e imprime um vector de 2-elemento de números inteiros.Como funciona: a matemática
Primeiramente, observe que qualquer número inteiro gaussiano será colocado na diagonal vertical de um diamante, com o pontoZ colocado em (x,3–√y) para algum número inteirox,y .
Na figura,WZ¯¯¯¯¯¯¯¯¯=3–√ eWX¯¯¯¯¯¯¯¯¯¯=XY¯¯¯¯¯¯¯¯=YZ¯¯¯¯¯¯¯=XV¯¯¯¯¯¯¯¯=YV¯¯¯¯¯¯¯¯=13√ . Portanto, dada a posição vertical de um ponto, podemos identificar o ponto Eisenstein mais próximo da seguinte maneira:
Dado um ponto gaussianoP , primeiro determinamos a qual diamante P pertence, medido por quantos diamantes (denotados h ) Z estão afastados do eixo x .
Então as coordenadas Eisenstein deZ são
Agora, determinamos qual dos segmentosWX¯¯¯¯¯¯¯¯¯¯,XY¯¯¯¯¯¯¯¯,YZ¯¯¯¯¯¯¯ P pertence. Para isso, podemos calcular o indicadorw seguinte maneira:
Então os casosw=0,1,2 correspondem a YZ¯¯¯¯¯¯¯,XY¯¯¯¯¯¯¯¯,WX¯¯¯¯¯¯¯¯¯¯ respectivamente. Finalmente, o ponto Eisenstein mais próximo de P (que é um de Z , V ou X ) pode ser calculado como:
Usando as identidades parah e w , podemos ainda simplificar a:
Como funciona: o código
fonte
JavaScript (ES6), 112 bytes
O ES7 pode obviamente cortar 9 bytes. Explicação:
k
el
inicialmente represente a solução de ponto flutuante parak+ωl=a+ib
. No entanto, as coordenadas precisavam ser arredondadas para o número inteiro mais próximo pela distância euclidiana. Portanto, tomo a palavrak
el
, em seguida, realizo alguns testes nas partes fracionárias para determinar se incrementá-las resultaria em um ponto mais próximoa+ib
.fonte
MATL ,
393835 bytesO formato de entrada é
6 + 14*1j
(o espaço é opcional). O formato de saída é14 16
.Experimente online!
Explicação
O código primeiro recebe a entrada como um número complexo. Em seguida, gera uma grade hexagonal grande o suficiente no plano complexo, encontra o ponto mais próximo da entrada e retorna suas "coordenadas" de Eisenstein.
fonte
Haskell , 128 bytes
Experimente online!
Para o número inteiro gaussiano de entrada (a, b), converta-o em coordenadas de Eisenstein, aplique piso e teto de ambos os componentes para obter quatro candidatos ao número inteiro Eisenstein mais próximo, encontre o que tiver distância mínima e retorne-o.
fonte
Tcl ,
124116106 bytesExperimente online!
Isso é um pouco inspirado no post de três anos do @Neil
Economizou 10 bytes usando o "sinal do produto cruzado vxd da diagonal d com o vetor v unindo o canto inferior direito e (a, b)" como o teste para qual lado da diagonal o ponto está.
fonte
Burlesco , 24 bytes
Experimente online!
Certamente isso pode ser mais curto. Entrada lida como
a b
fonte
05AB1E , 13 bytes
Resposta do APL do Port of Bubbler
Experimente online!
Entrada e saída são y primeiro, x segundo.
fonte