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:
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:
- Cualquier lenguaje de programación está permitido.
- Este es un desafío de código de golf, por lo que gana el código más corto.
- ¡La mejor de las suertes!
Respuestas:
C (gcc),
4443 bytesPruébalo en línea!
La espiral tiene varios "brazos":
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) n n2 x y 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,…,n−1,n−2 n n n−1 n2
z
Gracias al Sr. Xcoder por guardar un byte.
fuente
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}
ahorra 1 byte.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.Python,
545049 bytes-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.
fuente
def f(a,b):
enfoque, consulte aquí .M**2
se puede reemplazarM*M
.MATL , 15 bytes
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 , 2 , 4 , 6 , 8 , ... norte n ( n - 1 ) ( n , n )
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(n−1)+1 (x,y) v+x−y v−x+y
Solución alternativa de 21 bytes:
Pruébalo en línea!
Recopilar e imprimir como una matriz
De lo anterior, sabemos que la función que queremos es
dondem=max(x,y) .
Algunos cálculos básicos mostrarán que una expresión para un máximo de dos números es
Esta es la función que implementa la solución.
fuente
Japt , 16 bytes
Adaptado de la solución de Doorknob con unas pocas cervezas.
Intentalo
Explicación
fuente
Pyth, 20 bytes
Banco de pruebas
Una traducción casi literal de Rushabh Mehta respuesta 's .
Explicación:fuente
Jalea , 13 bytes
Pruébalo en línea!
Utiliza el método de Doorknob . Demasiado tiempo.
fuente
»Ḃ-*×_‘+»²_»ʋ
Jalea ,
1312 bytesPruébalo en línea!
Calcula el término diagonal con
²_’Ṁ
y suma / resta al valor de índice correcto conṀḂḤ’×I
.fuente
Brain-Flak , 76 bytes
Pruébalo en línea!
fuente
05AB1E ,
1211 bytes-1 byte gracias a @Emigna cambiando
Èi
aG
.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:
fuente
Èi
podría serG
.Pascal (FPC) , 90 bytes
Pruébalo en línea!
La respuesta de Port of Doorknob , pero la respuesta de Sundar me dio una idea para la
z mod 2*2-1
que me transformé1and z*2-1
para eliminar el espacio.fuente
Mathematica 34 bytes
asi que:
(*
54
*)
fuente
Julia 1.0 , 35 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 46 bytes
fuente
Java (JDK 10) , 39 bytes
Pruébalo en línea!
Créditos
fuente