Considere una cuadrícula regular, donde cada celda tiene coordenadas enteras. Podemos agrupar las células en "anillos" (de forma cuadrada) donde las células en cada anillo tienen la misma distancia de Chebyshev (o distancia del tablero de ajedrez) desde el origen. Su tarea es tomar dicha coordenada de celda y rotar esa celda una posición en sentido antihorario dentro de su anillo. Esto implementa la siguiente asignación:
Entonces, por ejemplo, si la entrada es (3, -2)
, debe salir (3, -1)
. Tenga en cuenta que (0, 0)
es la única entrada que debe asignarse a sí misma.
Reglas
El formato de E / S es bastante flexible. Puede usar dos números individuales, un par / lista / matriz / tupla de números, un único número complejo, una cadena que contiene dos números, etc.
Puedes suponer eso -128 < x,y < 128
.
Puede escribir un programa o una función y utilizar cualquiera de nuestros métodos estándar para recibir entradas y proporcionar salidas.
Puede usar cualquier lenguaje de programación , pero tenga en cuenta que estas lagunas están prohibidas de forma predeterminada.
Este es el código de golf , por lo que gana la respuesta válida más corta, medida en bytes .
Casos de prueba
(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)
Respuestas:
JavaScript (ES6),
6059 bytesToma datos con la sintaxis de curry
(x)(y)
y devuelve una matriz[new_x, new_y]
.Cómo funciona
Nuestra tarea principal es determinar en qué cuadrante estamos, para saber en qué dirección debemos movernos.
Podemos usar esta fórmula como primera aproximación:
Esto es lo que obtenemos:
Casi ahi. Pero las esquinas inferiores izquierda e inferior derecha de los anillos no son válidas. Necesitamos desplazar la mitad inferior de la matriz una posición hacia la izquierda, por lo que definimos
z
como:Y reemplazamos
x
conz
en nuestra fórmula:Lo que lleva a:
Ahora toda la matriz es correcta, excepto el caso especial
[0, 0]
(sin movimiento) que debe abordarse por separado.Casos de prueba
Mostrar fragmento de código
fuente
Jalea ,
201412 bytesLa entrada y la salida están en forma de matrices. Pruébalo en línea! o verificar todos los casos de prueba .
Fondo
Para determinar en qué dirección tenemos que movernos, podemos observar la posición relativa del punto de inicio de los bisectores del cuadrante x + y = 0 (azul) y x - y = 0 (rojo).
El origen es fijo. Avanzamos agregando [0, 0] al punto de inicio.
Los puntos en el triángulo superior, incluida la bisectriz del primer cuadrante, tienen una suma positiva y un delta no negativo ( y - x ). Avanzamos agregando [-1, 0] al punto de inicio.
Los puntos en el triángulo más a la izquierda, incluida la bisectriz del segundo cuadrante, tienen una suma no positiva y un delta positivo. Avanzamos agregando [0, -1] al punto de inicio.
Los puntos en el triángulo inferior, incluida la bisectriz del tercer cuadrante, tienen una suma negativa y un delta no positivo. Avanzamos agregando [1, 0] al punto de inicio.
Los puntos en el triángulo más a la derecha, incluida la bisectriz del cuarto cuadrante, tienen una suma no negativa y un delta negativo. Avanzamos agregando [0, 1] al punto de inicio.
Para determinar la dirección correcta, calculamos [-sign (x + y), -sign (y - x)] , que tiene solo nueve resultados posibles.
La siguiente tabla ilustra qué resultados deben asignarse a qué direcciones.
Esto deja tres casos.
Si al menos uno de los signos es 0 , [Δx, Δy] = [-sign (x + y), -sign (yx)] .
Si los signos son iguales y distintos de cero, [Δx, Δy] = [-sign (x + y), 0] .
Si los signos son diferentes y no son cero, [Δx, Δy] = [0, -sign (yx)] .
Cómo funciona
fuente
Pyth , 19 bytes
Pruébalo en línea!
Traducción de mi respuesta de Julia :
fuente
Python, 55 bytes
Detecta los cuatro cuadrantes diagonales y desplaza la coordenada adecuada.
fuente
Haskell,
777169 bytesEsto es solo verificar cada uno de esos cuadrantes inclinados y modificar la entrada en consecuencia. Tenga en cuenta que los espacios son necesarios, de lo contrario
>-
, se entendería como un operador (que no está definido).¡Gracias @nimi por eliminar algunos bytes más!
fuente
,
en lugar de&&
dentro del primer guardia guarda un byte. Y luego puede cambiar la segunda comparación a-x<y
otro byte.,
!Rubí, 68
La función Lambda toma un número complejo como argumento, devuelve un número complejo.
Rotamos el punto 90 grados 4 veces multiplicando por
i
. Por lo tanto, pasa a través de los 4 cuadrantes, y se devolvería sin cambios, excepto por el hecho de que lo modificamos cuando está en uno específico de ellos. El hecho de que siempre se modifique en el mismo cuadrante simplifica la modificación.Es más fácil de seguir si lo modificamos
z
cuando está en el cuadrante derecho. en este caso, necesitamos aumentar la coordenada y en 1 (es decir, agregari
az
).Verificamos
x.abs>=y.abs
comparando los cuadrados dex
yy
. Esto nos dice que el punto está en el cuadrante derecho o izquierdo, no arriba o abajo. Para comprobar que es, de hecho, en el cuadrante derecha, comprobamos también quex>y
(estrictamente mayor porque queremos excluir el casox=y
que pertenece al cuadrante "top".) Cuando esto es cierto añadimosi
az
.Por razones de golf, agregar
i
no es deseable. En su lugar, modificamos el número cuando está en el cuadrante inferior, en cuyo caso tenemos que agregar 1 a lax
coordenada (agregar 1 az
). En este caso, comprobamos quey*y>=x*x
para verificar que esté en el cuadrante superior o inferior. Para asegurarnos de que esté en el cuadrante inferior, debemos verificary<-x
(excluyendo estrictamente el caso de la esquina inferior derecha dondey=-x
).Una ventaja de esta comprobación es que no hay un caso especial para la coordenada 0,0. Desafortunadamente, se descubrió que mover el punto puede desplazarlo a un cuadrante diferente y esto significa que se debe suprimir un segundo movimiento en caso de que se vuelva a verificar ese cuadrante, lo que probablemente niega la ventaja.
Ejemplo 1
Ejemplo 2
En programa de prueba
Diagrama
La siguiente imagen muestra (azul) el área donde
x*x>=y*y
, (amarillo) el área dondey<-x
y (verde) la intersección de estos, que es la región donde la transformación correcta es la suma de 1 az
.fuente
Python, 52 bytes
Entrada y salida complejas. Para probar que el punto se encuentra en el cuadrante diagonal inferior, primero gírelo 135 en sentido antihorario para mover ese cuadrante al cuadrante estándar (x> 0, y> 0), y pruebe si el resultado no tiene un símbolo menos en la representación de la cadena. Restar 1 primero se ocupa de la condición de contorno.
Si no está en ese cuadrante, gire todo el problema 90 grados. La entrada es cero, se maneja especialmente para salir.
Otros intentos con números complejos:
fuente
Mathematica, 34 bytes
Esto define un operador unario
±
que toma y devuelve un número complejo cuyos componentes representanx
yy
.Ahora que Lynn ha revelado la solución de números complejos y Dennis ha superado mi puntaje, no me siento tan mal por publicar mi implementación referenciada de golf. :) (Resulta ser prácticamente idéntico a la respuesta de Lynn).
fuente
MATL ,
1917 bytesEsto usa números complejos como entrada y salida.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
Tomemos la entrada
-127+42j
como un ejemplo.fuente
Ruby, 51 bytes
Forma original
Forma alternativa por comentario de Xnor
Utiliza el mismo tipo de desigualdades que mi otra respuesta, pero de una manera diferente.
En programa de prueba
fuente
d
Vale la pena la tarea? Parece que solo puedes compararx*x>y*y
.y*y
y?
lo que es exactamente la misma longitud. Lo he incluido ya que creo que tu manera es más ordenada. Creo que Ruby está tratando de pasarlo, yay?
que sería un nombre de función legal.Julia,
3834 bytesDennis ahorró cuatro bytes. ¡Gracias!
Pruébalo en línea!
fuente
int(2angle(z)/pi+5)
el mismo número de bytes (las potencias negativas causan un error por cualquier motivo).!z=z+(z!=0)im^...
en todas las versiones.C ++, 94 bytes
Sin golf:
Uso:
Pruébalo en línea
fuente
(x>0?x:-(x))
puede ser(x>0?x:-x)
.R,
131110 bytesUna función que toma los dos enteros,
x,y
como entradas y escribe la salida en stdout. La solución sigue el esquema de flujo de control de @Dennis, pero probablemente podría jugar golf.EDITAR: Código actualizado basado en las sugerencias de @ JDL y guardado un montón de bytes.
Sin golf
fuente
as.logical(-1)
esTRUE
, entoncesX==0|Y==0
puede volverse!X|!Y
, y la condiciónif(X!=Y...)
puede volverseif(X-Y)
. Además, siX==Y
yX!=0
luegoY!=0
es redundante. En realidad, todas las!=0
partes son redundantes;if(X!=0)
es equivalente aif(X)
.c(x,y)
lugar decat(x,y)
.JavaScript (ES6), 57 bytes (55–63 †)
Acepta una matriz [x, y], la modifica in situ y la devuelve.
Cómo funciona
Esta es una función de flecha de un solo parámetro con un
return
cuerpo conciso libre.El parámetro se desestructura de inmediato en
x
yy
variables.El operador de coma combina múltiples expresiones en una, utilizando el resultado de la última.
i
se usa para diferenciar casos de incremento y decremento. Cuandox
es mayor quey
, estamos en el cuadrante inferior o derecho, y necesitamos avanzar en una dimensión (i=1
por coerción booleana a número). Del mismo modo, cuando estamos en la parte negativa de la división x = y diagonal. En todos los demás casos, incluido el origen, no se requiere ningún incremento (i=0
).Usamos una expresión algo similar para controlar qué índice de matriz ajustar. Cuando estamos incrementar y no en los cuadrantes izquierdo o inferiores (o cuando estamos no incrementar y en la izquierda o la parte inferior), entonces el XOR bit a bit producirá
1
y ajustará la y valor. Del mismo modo para cuando estamos en la división x = -y diagonal (incluido el origen). En todos los demás casos, el índice será0
( x ).Cuando
i
es así1
, lo agregaremos al valor especificado. Cuandoi
es así0
, restaremos 1 del valor si y solo si no estamos en el origen. Este último se detecta alx|y
producir un valor distinto de cero, recortado a {0, 1} por coerción booleana, y la negación dei
nos permite utilizar OR bit a bit en lugar de lógico (ya que-1
no tiene bits cero, está a salvo de modificaciones).La matriz es la última, por lo que se devolverá.
Pruebas
Mostrar fragmento de código
† Variaciones
Podemos guardar dos bytes más omitiendo un valor de retorno significativo y usando solo la mutación de entrada:
… O podemos omitir la mutación de entrada y hacer que todas las variables sean locales para una función pura, al costo de seis bytes:
fuente
JavaScript (ES6),
8076 bytesfuente
Haskell, 53 bytes
Toma dos números, emite una tupla. Si el punto está en la sección este
-x<=y<x
, aumente la segunda coordenada en 1. De lo contrario, realice un ciclo de los cuadrantes girando el punto de entrada 90 grados, llamando a la función en él y luego girando hacia atrás.fuente
Raqueta 191 bytes
Sin golf (traduciendo directamente las direcciones de las figuras al código sin usar ninguna fórmula intermedia):
Pruebas:
Salida:
fuente
Actualmente , 16 bytes
Esto toma un número complejo como entrada y genera otro número complejo. Sugerencias de golf bienvenidas! Pruébalo en línea!
Ungolfing
fuente
Scala, 184 bytes
Sin golf:
Explicación:
fuente