Problema de la espiral numérica

24

Una espiral numérica es una cuadrícula infinita cuyo cuadrado superior izquierdo tiene el número 1. Aquí están las primeras cinco capas de la espiral:

ingrese la descripción de la imagen aquí

Su tarea es encontrar el número en la fila y y la columna x.


Ejemplo:

Input: 2 3
Out  : 8
Input: 1 1
Out  : 1
Input: 4 2
Out  : 15

Nota:

  1. Cualquier lenguaje de programación está permitido.
  2. Este es un desafío de por lo que gana el código más corto.
  3. ¡La mejor de las suertes!

Fuente: https://cses.fi/problemset/task/1071

Águila Ágil
fuente
@WW ¿Qué significa eso?
Agile_Eagle
1
Parece que sus entradas están indexadas en 1 (las coordenadas comienzan en 1,1) (aunque esto debe ser intuido a partir de los casos de prueba) ¿podemos usar indexación 0 (las coordenadas comienzan en 0,0)?
Wheat Wizard
44
¿Cuál es el razonamiento para esto?
Wheat Wizard
77
Creo que está absolutamente bien que las coordenadas comiencen en (1, 1), especialmente si el programa se publica de esa manera en CSES, y el OP no necesita justificar esto. Creo que los golfistas aquí se están acostumbrando demasiado a libertades algo arbitrarias.
Lynn
2
@ Lynn, secundo eso
Agile_Eagle

Respuestas:

19

C (gcc),  44  43 bytes

f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?y-x:x-y)-z;}

Pruébalo en línea!

La espiral tiene varios "brazos":

12345
22345
33345
44445
55555

La posición se encuentra en el brazo max ( x , y ) (asignado a la variable ). Entonces, el número más grande en el brazo n es n 2 , que alterna entre estar en la posición inferior izquierda y superior derecha del brazo. Restando x de y da la secuencia - n + 1 , - n + 2 , , - 1 , 0 , 1 , , n(x,y)max(x,y)znn2xy moviéndose a lo largo del brazo n , por lo que elegimos el signo apropiado en función de la paridad de n , ajustamos por n - 1 para obtener una secuencia que comienza en 0, y restamos este valor de n 2 .n+1,n+2,,1,0,1,,n1,n2nnn1n2

Gracias al Sr. Xcoder por guardar un byte.

Pomo de la puerta
fuente
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}ahorra 1 byte.
Sr. Xcoder
@ Mr.Xcoder Truco genial, gracias!
Pomo de la puerta
3
@RobertS. Sí, eso es lo que hace la función que definí (en la sección Código en TIO). Por ejemplo, f(1, 1)devuelve el valor1 . La sección de pie de página recorre x = 1 a 5 e y = 1 a 5, llama a la función para todos esos valores e imprime su salida en una cuadrícula, para demostrar que la función es correcta para todas las entradas que se muestran en la pregunta.
Pomo de la puerta
1
@Agile_Eagle La función devuelve el número (no pudo generar la espiral, ¡ni siquiera tiene ningún bucle!).
Pomo de la puerta
7

Python,  54   50  49 bytes

def f(a,b):M=max(a,b);return(a-b)*(-1)**M+M*M-M+1

-4 bytes gracias a @ChasBrown

-1 bytes gracias a @Shaggy

Pruébalo en línea!

Primera vez jugando al golf! Soy más que consciente de que esto no es óptimo, pero lo que sea.

Esencialmente se ejecuta con el mismo principio que el código @Doorknob C.

Don mil
fuente
2
Bienvenido a PPCG! En este caso, puede guardar 4 bytes utilizando el def f(a,b):enfoque, consulte aquí .
Chas Brown
@ChasBrown Muy interesante, gracias!
Don Thousand
@ Shaggy Gracias! He publicado algunos desafíos, pero nunca he sido lo suficientemente bueno para jugar golf
Don Thousand
En ese caso, ¡bienvenido a Golf! :) No soy un tipo de Python, pero estoy bastante seguro de que M**2se puede reemplazar M*M.
Shaggy
@ Shaggy Gracias! Se solucionará ahora mismo
Don Thousand
7

MATL , 15 bytes

X>ttq*QwoEqGd*+

Pruébalo en línea!
Recoger e imprimir como una matriz

¿Cómo?

Editar: La misma técnica que la respuesta de @ Doorknob, acaba de llegar de manera diferente.

La diferencia entre los elementos diagonales de la espiral es la secuencia aritmética . La suma de n términos de esto es n ( n - 1 ) (según la fórmula AP habitual). Esta suma, incrementada en 1, da el elemento diagonal en la posición ( n , n ) .0 0,2,4 4,6 6,8,...nortenorte(norte-1)(norte,norte)

Dado , encontramos el máximo de estos dos, que es la "capa" de la espiral a la que pertenece este punto. Luego, encontramos el valor diagonal de esa capa como v = n ( n - 1 ) + 1 . Para las capas pares, el valor en ( x , y ) es entonces v + x - y , para las capas impares v - x + y .(X,y)v=n(n1)+1(x,y)v+xyvx+y

X>        % Get the maximum of the input coordinates, say n
ttq*      % Duplicate that and multiply by n-1
Q         % Add 1 to that. This is the diagonal value v at layer n
wo        % Bring the original n on top and check if it's odd (1 or 0)
Eq        % Change 1 or 0 to 1 or -1
Gd        % Push input (x, y) again, get y - x
*         % Multiply by 1 or -1
          % For odd layers, no change. For even layers, y-x becomes x-y
+         % Add that to the diagonal value v
          % Implicit output

Solución alternativa de 21 bytes:

Pdt|Gs+ttqq*4/QJb^b*+

Pruébalo en línea!
Recopilar e imprimir como una matriz
De lo anterior, sabemos que la función que queremos es

f=m(m1)+1+(1)m(xy)

donde m=max(x,y) .

Algunos cálculos básicos mostrarán que una expresión para un máximo de dos números es

m=max(x,y)=x+y+abs(xy)2

F

F=(X-y)yok+14 4((k-2)k)+1

k=unasis(X-y)+X+y

Esta es la función que implementa la solución.

sundar - Restablece a Monica
fuente
5

Japt , 16 bytes

Adaptado de la solución de Doorknob con unas pocas cervezas.

wV
nU²ÒNr"n-"gUv

Intentalo


Explicación

                  :Implicit input of integers U=x and V=y
wV                :Maximum of U & V
\n                :Reassign to U
 U²               :U squared
   Ò              :-~
      "n-"        :Literal string
           Uv     :Is U divisible by 2? Return 0 or 1
          g       :Get the character in the string at that index
    Nr            :Reduce the array of inputs by that, where n is inverse subtraction (XnY = Y-X)
n                 :Subtract U from the result of the above
Lanudo
fuente
3

Pyth, 20 bytes

A~Qh.MZQh-+*-GH^_1Q*

Banco de pruebas

Una traducción casi literal de Rushabh Mehta respuesta 's .

Explicación:
A~Qh.MZQh-+*-GH^_1Q*    | Full code
A~Qh.MZQh-+*-GH^_1Q*QQQ | Code with implicit variables filled
                        | Assign Q as the evaluated input (implicit)
A                       | Assign [G,H] as
 ~Q                     |  Q, then assign Q as
   h.MZQ                |   Q's maximal value.
                        | Print (implicit)
        h-+*-GH^_1Q*QQQ |  (G-H)*(-1)^Q+Q*Q-Q+1
hakr14
fuente
2

Jalea , 13 12 bytes

ṀḂḤ’×I+²_’ṀƲ

Pruébalo en línea!

Calcula el término diagonal con ²_’Ṁy suma / resta al valor de índice correcto con ṀḂḤ’×I.

dylnan
fuente
2

05AB1E , 12 11 bytes

ZÐ<*>ŠGR}¥+

-1 byte gracias a @Emigna cambiando Èia G.

Puerto de @sundar 's respuesta MAT , ¡así que asegúrese de votarlo!

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

Z              # Get the maximum of the (implicit) input-coordinate
               #  i.e. [4,5] → 5
 Ð             # Triplicate this maximum
  <            # Decrease it by 1
               #  i.e. 5 - 1 → 4
   *           # Multiply it
               #  i.e. 5 * 4 → 20
    >          # Increase it by 1
               #  i.e. 20 + 1 → 21
     Š         # Triple swap the top threes values on the stack (a,b,c to c,a,b)
               #  i.e. [4,5], 5, 21 → 21, [4,5], 5
      G }      # Loop n amount of times
       R       #  Reverse the input-coordinate each iteration
               #   i.e. 5 and [4,5] → [5,4]→[4,5]→[5,4]→[4,5] → [5,4]
         ¥     # Calculate the delta of the coordinate
               #  [5,4] → [1]
          +    # And add it to the earlier calculate value (output the result implicitly)
               #  21 + [1] → [22]
Kevin Cruijssen
fuente
1
Èipodría ser G.
Emigna
@Emigna Oh, inteligente, ¡gracias! : D
Kevin Cruijssen
0

Mathematica 34 bytes

x = {5, 8};

asi que:

m = Max[x];
Subtract @@ x (-1)^m + m^2 - m + 1

(*

54

*)

David G. Stork
fuente
0

JavaScript (ES6), 46 bytes

f=(r,c,x)=>r<c?f(c,r,1):r%2-!x?r*r-c+1:--r*r+c
James
fuente