Considere una permutación de los valores enteros de 1
a N
. Por ejemplo, este ejemplo para N = 4
:
[1, 3, 4, 2]
Vamos a considerar que esta lista sea cíclico, de tal manera que 1
y 2
son tratados como adyacente. Una cantidad que podemos calcular para dicha lista es la diferencia al cuadrado total de los valores adyacentes:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
Su tarea es encontrar una permutación que maximice esta cantidad, dado un número entero positivo N
. En el caso del N = 4
ejemplo anterior, no es óptimo (de hecho, es mínimo). Podemos lograr una diferencia al cuadrado total de 18
con la siguiente permutación (así como varias otras):
[1, 4, 2, 3]
Su algoritmo debe ejecutarse en tiempo polinómico (de N
). En particular, no puede simplemente calcular la diferencia al cuadrado total de todas las permutaciones.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
La salida puede estar en cualquier formato de cadena o lista conveniente, inequívoca y plana. Puede elegir devolver una lista con valores de 0
a en N-1
lugar de 1
a N
.
Aplican reglas estándar de código de golf .
Datos de prueba
Hay una buena solución analítica para este problema. Por ejemplo, todas las soluciones válidas N = 10
son equivalentes a la siguiente lista (hasta cambios cíclicos y reversión):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
No quiero revelar mucho más allá de eso (aunque probablemente sea suficiente para descubrir el patrón), por lo que en lugar de dar más ejemplos, puede verificar que sus resultados tengan las siguientes diferencias cuadradas totales para un determinado N
:
N Total squared difference
1 0
2 2
3 6
4 18
5 36
6 66
7 106
8 162
9 232
10 322
33 11936
100 333202
333 12308236
1000 333332002
Esta es la entrada OEIS A064842 (que también contiene una referencia a un documento con una solución a este desafío si está atascado).
(i<n/2||n%2)^i%2?i+1:n-i
.