Desafío
Dado un entero n ≥ 4 , genera una permutación de los enteros [0, n-1] con la propiedad de que no hay dos enteros consecutivos uno al lado del otro. El valor de una permutación pi
es la suma de abs(pi[i] - i)
todos los índices i
.
Ejemplos
(1, 3, 0, 2)
tiene valor6
(0, 2, 4, 1, 3)
tiene valor6
(0, 2, 4, 1, 3, 5)
tiene valor6
(0, 2, 4, 1, 5, 3, 6)
tiene valor8
Puntuación de tu respuesta
El puntaje de su respuesta es la suma de los valores de sus permutaciones para n = 4 .. 14
más el número de bytes que toma su código. Cuanto más bajo sea el puntaje, mejor. Su código debe dar una salida válida para todos esos valores de n
.
Debe poder ejecutar su envío hasta su finalización en su máquina.
En caso de empate, el momento de la última edición que resultó en la puntuación relevante será el decisivo.
¿No es esta la misma pregunta que esta? ?
Las respuestas a la pregunta vinculada no serán competitivas para esta pregunta ya que no hacen ningún esfuerzo para optimizar el valor de una permutación. Por ejemplo para n=10
, la permutación[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
dada por la mayoría de las respuestas allí da un valor de 30
. Puedes hacerlo mucho mejor que eso.
Para la parte de permutación de la pregunta, el valor óptimo general es como máximo 120
. (Gracias a @Laikoni.) Mientras que la respuesta de Dennis a la pregunta anterior es 222 . (Gracias a @ user202729.)
fuente
[6,6,6,8,10,12,12,12,14,16,18]
para una puntuación de 120. Curiosamente, este patrón se puede encontrar en A078706 .A078706
withn=17
, que puede tener una puntuación de20
.Respuestas:
Gelatina ,
363433323130 bytes, resultado: 120¡Gracias a Dennis por -1 byte! (implícitamente arreglando un error Jelly, aunque la característica es posterior al desafío)
Nueva característica: suma acumulada (
Ä
).Pruébalo en línea!
Utilice la indexación 1.
Toma tiempo lineal, también.
Este programa C ++ genera la permutación lexicográficamente más pequeña, suponiendo que | i - p i | ≤ ancho (donde el ancho es una constante codificada) para todos 0 ≤ i <n , con una complejidad temporal de O (ancho 2 × 2 2 × ancho × n) (que es solo O (n) para ancho fijo ): Pruébelo en línea !
¿Cómo?
Observa el patrón. Observamos que la secuencia de todos los elementos, excepto los 4 últimos, es un prefijo de
Calcula la diferencia incremental de la secuencia.
Tenga en cuenta el período 5.
La implementación de Jelly:
Para 4 últimos elementos,
solo fuerza bruta las 24 posibilidades. O (1) .(nota: ya no fuerza bruta las 24 posibilidades de la versión de 32 bytes)
fuente
0 2 4 1 3 5 8 6
y tiene un factor de ramificación mayor, pero no tiene un patrón tan simple.CJam (60 bytes + 120 = 180 puntaje)
Conjunto de pruebas en línea con puntuación integrada
Extensión hasta n = 24
Disección
fuente
Haskell , 146 + 89 puntaje + bytes
Repite el patrón [1,3,0,2], los últimos
mod i 4
elementos se ajustan a mano.Algoritmo anterior (132 + 116):
Fuerza bruta el número correcto de saltos de longitud ± 2 o ± 3. Selecciona el último que tiene los números correctos, parece funcionar bien y es mucho más barato que implementar la puntuación. Tio acaba el tiempo antes del último puntaje, que es 18.
Pruébalo en línea!
fuente
Japt, 120 + 20 = 140
(Copiar una de mis soluciones del otro desafío me hubiera marcado 227)
Pruébelo o use esta versión para verificar los puntajes. Ambas versiones pueden comenzar a arruinarte alrededor de las 9.
Explicación
fuente
Ruby , puntaje 120 +
112106 9182 bytesPruébalo en línea!
La secuencia es básicamente
(a-2)+(a+2)%5
.Si n mod 5 no es 0 o 1, los últimos 3 o 4 elementos son diferentes.
Esto todavía está medio codificado, siempre encuentra la mejor solución, tal vez podría jugar un poco más, pero me he quedado sin ideas.
fuente
JavaScript (Node.js) , 148 puntaje +
10973 bytesPruébalo en línea! Explicación:
l
realiza un seguimiento del último número generado ym
realiza un seguimiento del siguiente número de la paridad opuesta al
; una vez quel
excedem+2
las variables se intercambian. Se realiza un ajuste al comienzo de la secuencia para que las secuencias cuyas longitudes no sean múltiplos de 5 no pierdan ningún número, y se realiza otro ajusten=4
.fuente