Este é um desafio inspirado pela rotação de Chebyshev . Sugiro que procure respostas para obter inspiração para esse desafio.
Dado um ponto no plano, há um quadrado único (um retângulo com lados iguais) centralizado na origem e cruzando esse ponto ( demonstração interativa ):
Dado um ponto p e uma distância d , retorne o ponto obtido movendo a distância d de p , no sentido anti-horário (e no sentido horário para d negativo ), ao longo do perímetro do quadrado centrado na origem que cruza p . Sua resposta deve ter precisão de pelo menos 4 dígitos decimais.
Casos de teste:
(0, 0), 100 -> (0, 0)
(1, 1), 81.42 -> (-0.4200, 1.0000)
(42.234, 234.12), 2303.34 -> (-234.1200, 80.0940)
(-23, -39.234), -234.3 -> (39.2340, -21.8960)
Os seguintes casos de teste são do desafio original de Martin Ender e todos estão com d = 1 :
(0, 0) -> (0, 0)
(1, 0) -> (1, 1)
(1, 1) -> (0, 1)
(0, 1) -> (-1, 1)
(-1, 1) -> (-1, 0)
(-1, 0) -> (-1, -1)
(-1, -1) -> (0, -1)
(0, -1) -> (1, -1)
(1, -1) -> (1, 0)
(95, -12) -> (95, -11)
(127, 127) -> (126, 127)
(-2, 101) -> (-3, 101)
(-65, 65) -> (-65, 64)
(-127, 42) -> (-127, 41)
(-9, -9) -> (-8, -9)
(126, -127) -> (127, -127)
(105, -105) -> (105, -104)
Respostas:
Python 2,
363335296266262258256233 bytesWoo, 130 bytes perdidos! Agradecemos a Neil por salvar 4 bytes, Nathan Merrill por salvar 2 bytes e xnor por salvar ridículos 23 bytes!
A idéia geral é a seguinte: podemos reduzir a distância percorrida tomando o módulo dela contra o perímetro da praça. O perímetro é definido como 8 vezes a maior das duas coordenadas, pois o ponto deve estar sobre ele. Depois que o módulo é tomado, garantimos que não temos sobreposição. Ele também garante que só precisamos avançar no sentido anti-horário, pois o módulo fornece um resultado positivo.
A partir daí, basta usar o que sabemos das coordenadas x e y fornecidas para descobrir onde estamos: superior, inferior, esquerda, direita ou em um canto e determinar a direção, que pode ser uma das seguintes
0, 1, 2, 3
:Depois disso, é tão simples quanto fazer um loop enquanto ainda temos distância a percorrer, e com base na direção em que subtraímos ou adicionamos à coordenada apropriada e diz ao loop em qual direção vamos seguir.
Embora bastante longo, certamente funciona. Aqui está um exemplo de E / S:
Experimente online ou execute casos de teste .
fonte
s=max(x,y,-x,-y)
?(s>0)*(d>0)
és>0<d
. A saída pode ser"%.4f "*2%tuple(p)
.if s:d=d%(8*s)
pode serd%(s*8or 1)
.(r+1)
pode ser~-r
.1*(x>-s)
pode ser apenas(x>-s)
.abs(y)==abs(x)
pode sery*y==x*x
(x>-s)
não precisavam de parênteses e~-r
decrementos, então usei-~r
.JavaScript (ES6), 147 bytes
Explicação: Funciona tentando adicionar o vetor de direção, mantendo-o dentro dos limites do quadrado. Qualquer superação é recursivamente passada de volta com a direção girada no sentido anti-horário em 90 °. A direção é realmente codificada usando uma flag vertical
v
e uma unidadew
para que os vetores (1, 0), (0, 1), (-1, 0) e (0, -1) sejam codificados comv
0, 1, 0 , 1 ew
de 1, 1, -1, -1, respectivamente. O vetor de direção pode não apontar inicialmente para uma direção adequada, mas nunca aponta para trás e, por fim, girará para uma direção utilizável.fonte
f(42.234, 234.12, 2303.34) -> [-234.12, 80.09399999999988]
significa que ele não tem precisão de 4 dígitos. Talvez adicionar alguma formatação de saída corrija isso? Boa resposta embora! :)