La secuencia SUDSI ( su m, d ifference, s wap, i ncrement) es una secuencia entera curiosa que parece exhibir un comportamiento bastante caótico. Se puede generar de la siguiente manera:
Deje que S sea una lista infinita de los números naturales: 1 2 3 4 5 6 ...
. Let S i denota el uno indexados i -ésimo elemento de S . Inicialmente, S 1 es 1, S 2 es 2, etc. (no hay S 0 ).
Comenzando con S 1 y S 2 ...
- Calcule su suma:
sum = S1 + S2
- Calcule su diferencia absoluta (la más grande menos la más pequeña):
diff = |S1 - S2|
Cambie los dos valores en S en los índices de la suma y la diferencia:
swap(Ssum, Sdiff)
Incremente los índices de S con los que está trabajando. Entonces, la próxima vez calculará la suma y la diferencia de S 2 y S 3 , y el tiempo posterior será S 3 y S 4 , etc.
- Repita este proceso indefinidamente.
Aquí están las primeras etapas de S a medida que se aplica este proceso. Los corchetes []
rodean los dos valores que están a punto de sumarse y diferenciarse.
S original :
[1 2] 3 4 5 6 7 8 9 10 11 12 ...
Después de intercambiar S 3 ( 3 = 1 + 2
) y S 1 ( 1 = |1 - 2|
):
3 [2 1] 4 5 6 7 8 9 10 11 12 ...
Después de intercambiar S 3 y S 1 :
1 2 [3 4] 5 6 7 8 9 10 11 12 ...
Después de intercambiar S 7 y S 1 :
7 2 3 [4 5] 6 1 8 9 10 11 12 ...
Después de intercambiar S 9 y S 1 :
9 2 3 4 [5 6] 1 8 7 10 11 12 ...
Después de intercambiar S 11 y S 1 :
11 2 3 4 5 [6 1] 8 7 10 9 12 ...
Después de intercambiar S 7 y S 5 :
11 2 3 4 1 6 [5 8] 7 10 9 12 ...
etc.
La secuencia SUDSI se define como la secuencia de los primeros elementos en cada una de estas listas. Entonces, los primeros términos de la secuencia SUDSI son 1 3 1 7 9 11 11
.
Aquí están los primeros 200 términos de la secuencia SUDSI (20 por línea):
1 3 1 7 9 11 11 11 15 15 19 19 19 19 19 19 19 19 19 19
19 19 19 19 19 19 19 19 57 59 59 59 59 59 59 59 59 59 77 79
81 83 85 87 89 91 91 91 91 91 91 91 91 91 91 91 91 91 115 115
121 123 125 127 127 127 127 127 137 139 141 143 145 147 147 147 147 147 147 147
147 147 147 147 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167
167 167 167 167 209 211 211 211 211 211 221 223 223 223 223 223 223 223 223 223
223 223 243 243 243 243 243 243 257 259 261 263 263 263 263 263 263 263 263 263
263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263
263 263 325 327 329 331 331 331 331 331 331 331 331 331 349 351 351 351 351 351
361 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363
No está claro (al menos para mí) cómo uno podría predecir términos futuros. Solo se siente seguro decir que los términos son siempre impares, no decrecientes (después del segundo término), y que algunos números se repiten muchas veces.
Desafío
Escribir un programa o función que toma en un número entero positivo n y grabados o devuelve el n º término de la secuencia de SUDSI. Por ejemplo, si n es 1, la salida es 1
, si n es 2, la salida es 3
, si n es 200, la salida es 363
.
Tome la entrada de la forma habitual (stdin / línea de comando / función arg).
La respuesta más corta en bytes gana.
(Ese sitio codifica cosas en UTF-8, pero puede usar cualquier codificación existente que desee).
Bono Mathy: (potencialmente elegible para recompensa)
- Cuéntame más sobre la secuencia SUDSI. ¿Cuál es el patrón subyacente de qué números son parte de él y cuántos hay (y cosas así)? (Por cierto, no pude encontrar SUDSI en OEIS ).
fuente
Respuestas:
Pyth,
45414038 bytesNoté (como lo hizo Martin Büttner), que el número máximo afectado de un paso de permutación
k
es2k + 1
. Pero como solo tenemosn - 1
pasos, solo necesitamos una lista de los números hasta2n - 1
.Pruébelo en línea: demostración
fuente
Mathematica, 88 bytes
Este es un programa completo, que lee la entrada de un mensaje. Es una implementación muy directa de la definición, donde hago un seguimiento de la secuencia actual en
f
(cuyos valoresf[n]
predeterminados sonn
).Aquí hay una versión un poco más legible:
Un poco de análisis
He trazado los primeros 2000 elementos de la secuencia (realmente no se vuelve más interesante después):
Entonces, la secuencia es esencialmente lineal con pendiente 2 y siempre tiene algunos de esos pasos. Parece que los pasos crecen sublinealmente (si ni siquiera están delimitados), ya que apenas se notan a medida que aumenta la cantidad de puntos que traza.
Podemos justificar el crecimiento lineal con bastante facilidad (esto es un poco ondulado, pero creo que resistiría una prueba rigurosa por inducción): inicialmente, el número máximo afectado de un paso de permutación
n
esn + (n+1) = 2n + 1
. También tenga en cuenta que estos números siempre se moverán a1
, desde entonces|n - (n+1)| = 1
. Por lo tanto, no es sorprendente que obtengamos números que están aproximadamente2n
en la secuencia. Sin embargo, también podemos observar que para los pasos hasta n , S n + 1 siempre está limitado por n + 1 , lo que significa que ningún paso de intercambio puede intercambiar dos números que sean mayores que n . Por lo tanto, los números que aún deben procesarse serán menores o iguales a su valor inicial. Por lo tanto,2n + 1
es también el límite de la secuencia misma.Creo que encontrar un argumento para la longitud de los pasos será más complicado.
fuente
CJam,
45 4039 bytesSolo un enfoque ingenuo.
Se puede jugar más al golf.Falta una función de intercambio de matriz demasiado.Cómo funciona:
Pruébalo en línea aquí
fuente
Haskell, 95 bytes
Ejemplo de uso:
p 70
->139
No almaceno la secuencia en una lista o matriz. Actualizo repetidamente la función de identidad a una función con los dos elementos del paso actual intercambiados. Después de los
n
pasos, llamo a la función resultante con parámetro1
.fuente
J, 63 bytes
Uso y pruebas:
Pruébelo en línea aquí.
fuente
Pyth
555351Probablemente se pueda jugar más al golf.
Podría ser muy lento para los grandes,n
ya que era flojo para averiguar cuánto tiempo necesitaría una matriz y simplemente utilicé unan^n
.Gracias a Volatility y Martin Büttner por señalar que puedo usar un máximo de
3n
.Explicación
fuente
2*n
para granden
, con un máximo de3*n
paran=1
.2n+1
, que como usted dice tiene su máximo en3
paran=1
y (de manera) converge hacia2n
. Esto no es demasiado sorprendente, ya que es el máximo para la secuencia no permutada, y ningún paso en el proceso puede aumentar un número que aún está por delante. Podría agregar esto a mi respuesta..a
extensión en buen trabajo! Hay muchas más cosas en camino, pero Isaac está durmiendo en este momento: github.com/isaacg1/pyth/pull/32doc.txt
en GitHub para un manual) y vi la actualización. Afortunadamente, como podría haberlo omitido y escrito una implementación personalizada ...Python 2,
117106101Utiliza undict
(mapa) para guardar los valores para usar índices arbitrarios.g(n)
es una función que devuelve eln
elemento th. Luego solo iterainput-1
veces y genera el primer elemento.Resulta que es más corto usando los métodos de mi respuesta Pyth.
Gracias a xnor por guardar 5 bytes.
fuente
b,c=a[i:i+2]
. Además,b+c
es lo suficientemente corto como para que guardarlo en una variables
pierda caracteres al escribirlo dos veces.Ir 150
Sin golf, nada complicado, mayormente robado de @ Pietu1998
http://play.golang.org/p/IWkT0c4Ev5
fuente
Java, 162
Explicación
fuente
corriente continua,
134132131 bytesUso
echo $n $code | dc
, donde$n
es N y$code
es el código ... ( suspiro ). Cita al gusto.Editar: A menos que me molestes para obtener una explicación, nunca lo conseguiré.
fuente
Perl 5, 131
Una solución ingenua (es decir, una implementación directa de la definición). Una subrutina, toma la entrada como una lista de
1
s de la longitud deseada.Visualice su salida por ej
print sub...->(1,1,1,1,1)
.Explicación:
map$a[$_]=$_,1..3*@_
construye la matriz@a
, indexando cada entero por sí mismo de 1 a 3 veces el tamaño de@_
(la entrada).($a[$a[$_-1]+$a[$_]],$a[abs($a[$_-1]-$a[$_])])=($a[abs($a[$_-1]-$a[$_])],$a[$a[$_-1]+$a[$_]])for 2..@_
repite el switcheroo repetidamente (uno menos veces que el tamaño de@_
), la conmutación$a[$a[$_-1]+$a[$_]]
con$a[abs($a[$_-1]-$a[$_])]
como$_
rangos de 2 al tamaño de@_
.Y luego vuelve la subrutina
$a[1]
.fuente
Perl 5 , 90 + 1 (-p) = 91 bytes
Pruébalo en línea!
fuente