Introducción (puede ser ignorado)
Poner todos los enteros positivos en su orden regular (1, 2, 3, ...) es un poco aburrido, ¿no? Así que aquí hay una serie de desafíos en torno a las permutaciones (reorganizaciones) de todos los enteros positivos. Este es el sexto desafío de esta serie (enlaces al primero , segundo , tercero , cuarto y quinto desafío).
Este desafío tiene un tema suave de Pascua (porque es Pascua). Me inspiré en este huevo de ganso altamente decorado (y en mi opinión personal bastante feo).
Me recordó a la espiral de Ulam , donde todos los enteros positivos se colocan en una espiral en sentido antihorario. Esta espiral tiene algunas características interesantes relacionadas con los números primos, pero eso no es relevante para este desafío.
Llegamos a la permutación de enteros positivos de este desafío si tomamos los números en la espiral de Ulam y trazamos todos los enteros en una espiral que gira en sentido horario , comenzando en 1. De esta manera, obtenemos:
1, 6, 5, 4, 3, 2, 9, 8, 7, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, etc.
Si dibujara ambas espirales, obtendría una especie de malla infinita de espirales (cáscara de huevo) ( tenga en cuenta la referencia del Nuevo Orden allí ).
Esta secuencia está presente en el OEIS con el número A090861 . Como se trata de un desafío de "secuencia pura", la tarea es generar para un dado como entrada, donde es A090861 .
Tarea
Dada una entrada entera , salida en formato entero, donde es A090861 .
Nota: aquí se supone una indexación basada en 1; puede usar indexación basada en 0, entonces , etc. Mencione esto en su respuesta si elige usar esto.
Casos de prueba
Input | Output
---------------
1 | 1
5 | 3
20 | 10
50 | 72
78 | 76
123 | 155
1234 | 1324
3000 | 2996
9999 | 9903
29890 | 29796
Reglas
- La entrada y la salida son enteros.
- Su programa debería al menos admitir entradas en el rango de 1 hasta 32767).
- La entrada no válida (0, flotantes, cadenas, valores negativos, etc.) puede generar salidas imprevistas, errores o un comportamiento (no) definido.
- Se aplican las reglas de E / S predeterminadas .
- Las lagunas predeterminadas están prohibidas.
- Este es el código de golf , por lo que gana la respuesta más corta en bytes
JavaScript (ES7),
46 4541 bytes0 indexado.
Pruébalo en línea!
¿Cómo?
Esto se basa en la fórmula indexada 1 utilizada en los programas de ejemplo de A090861 .
Pruébalo en línea!
Pruébalo en línea!
Pruébalo en línea!
Que se puede traducir a:
Hacerlo indexado en 0 ahorra 5 bytes de inmediato:
La fórmula se puede simplificar aún más mediante el uso de:
que se puede expresar como:
llevando a:
y finalmente:
fuente
Wolfram Language (Mathematica) , 60 bytes
Pruébalo en línea!
fuente
MATL ,
1211 bytesPruébalo en línea!
Muy ineficiente de memoria. Prepending lo
X^k
hace más eficiente .fuente
C # (compilador interactivo de Visual C #) , 67 bytes
Pruébalo en línea!
fuente
Python 3.8,
10474656057 bytesEditar: ¡Gracias a Johnathan Allan por obtenerlo de 74 a 57 bytes!
Esta solución utiliza indexación basada en 0.
fuente
>
en lugar de<=
yx*x
en lugar dex**2
... así:def f(n):x=((n-1)**.5+1)//2;return 8*x**2+(-2,6)[n>4*x*x+2*x]*x+2-n
... TIOPython 3.8 (prelanzamiento) , 53 bytes
Un puerto directo de la respuesta de JavaScript de Arnauld, vota a favor y / o la respuesta de Mathematica de J42161217 , y / o la respuesta de Python de Kapocsi :)
0 indexado.
Pruébalo en línea!
fuente
Befunge,
6757 bytesEsta solución supone una indexación basada en 0 para los valores de entrada.
Pruébalo en línea!
Explicación
Comenzamos calculando el "radio" en el que se encuentra la entrada n con un bucle:
Al final del ciclo, el valor anterior de n es el desplazamiento en la espiral en ese radio:
Luego podemos determinar si estamos en la sección superior o inferior de la espiral de la siguiente manera:
Y una vez que tengamos todos estos detalles, el valor en espiral se calcula con:
El radio es el único valor que necesitamos almacenar como una "variable", limitándolo a un valor máximo de 127 en Befunge-93, por lo que este algoritmo puede manejar entradas de hasta 65024.
fuente
Japt , 15 bytes
Solución de gelatina del puerto de Jonathan. 1 indexado.
Intentalo
fuente
x+(1-x%2)
esx|1
(guardar un byte en Jelly), de lo que esta respuesta también puede beneficiarse, apuesto.C ++ (gcc) , 88 bytes
1 indexado; usa la fórmula en la página OEIS, pero manipulada para guardar algunos bytes.
Pruébalo en línea!
fuente
sqrt(n-1)/2+.5
lugar de(sqrt(n-1)+1)/2