La séquence SUDSI ( su m, d ifference, s wap, i ncrement) est une suite d'entiers curieux qui semble présenter un comportement chaotique. Il peut être généré comme suit:
Que S soit une liste infinie des nombres naturels: 1 2 3 4 5 6 ...
. Soit S i désignent celui-indexé i ème élément de S . Donc au départ, S 1 est 1, S 2 est 2, etc. (il n'y a pas S 0 ).
À partir de S 1 et S 2 ...
- Calculez leur somme:
sum = S1 + S2
- Calculez leur différence absolue (la plus grande moins la plus petite):
diff = |S1 - S2|
Échangez les deux valeurs de S aux indices de la somme et de la différence:
swap(Ssum, Sdiff)
Augmentez les indices de S avec lesquels vous travaillez. Donc, la prochaine fois, vous calculerez la somme et la différence de S 2 et S 3 , et le temps après ce sera S 3 et S 4 , etc.
- Répétez ce processus indéfiniment.
Voici les premières étapes de S lorsque ce processus est appliqué. Les crochets []
entourent les deux valeurs qui sont sur le point d'être additionnées et différenciées.
S d' origine :
[1 2] 3 4 5 6 7 8 9 10 11 12 ...
Après l' échange de S 3 ( 3 = 1 + 2
) et S 1 ( 1 = |1 - 2|
):
3 [2 1] 4 5 6 7 8 9 10 11 12 ...
Après l' échange de S 3 et S 1 :
1 2 [3 4] 5 6 7 8 9 10 11 12 ...
Après l' échange de S 7 et S 1 :
7 2 3 [4 5] 6 1 8 9 10 11 12 ...
Après l' échange de S 9 et S 1 :
9 2 3 4 [5 6] 1 8 7 10 11 12 ...
Après l' échange de S 11 et S 1 :
11 2 3 4 5 [6 1] 8 7 10 9 12 ...
Après l' échange de S 7 et S 5 :
11 2 3 4 1 6 [5 8] 7 10 9 12 ...
etc.
La séquence SUDSI est définie comme la séquence des premiers éléments de chacune de ces listes. Les premiers termes de la séquence SUDSI sont donc 1 3 1 7 9 11 11
.
Voici les 200 premiers termes de la séquence SUDSI (20 par ligne):
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
On ne sait pas (du moins pour moi) comment on pourrait prédire les termes futurs. Il semble juste de dire que les termes sont toujours impairs, non décroissants (après le deuxième terme), et que certains nombres sont répétés beaucoup de fois.
Défi
Écrire un programme ou une fonction qui prend en un nombre entier positif n et imprime ou retourne le n ième terme de la suite SUDSI. Par exemple, si n est 1, la sortie est 1
, si n est 2, la sortie est 3
, si n est 200, la sortie est 363
.
Prenez l'entrée de n'importe quelle manière habituelle (stdin / ligne de commande / fonction arg).
La réponse la plus courte en octets l' emporte.
(Ce site code les choses en UTF-8, mais vous pouvez utiliser n'importe quel encodage existant que vous souhaitez.)
Bonus Mathy: (potentiellement éligible à la prime)
- Parlez-moi de la séquence SUDSI. Quel est le modèle sous-jacent à quels nombres en font partie et combien il y en a (et des trucs comme ça)? (Au fait, je n'ai pas trouvé SUDSI sur OEIS .)
la source
Réponses:
Pyth,
45414038 octetsJ'ai remarqué (comme Martin Büttner), que le nombre maximal affecté d'une étape de permutation à
k
est2k + 1
. Mais comme nous n'avons que desn - 1
étapes, nous n'avons besoin que d'une liste des nombres jusqu'à2n - 1
.Essayez-le en ligne: Démonstration
la source
Mathematica, 88 octets
Il s'agit d'un programme complet, lisant l'entrée à partir d'une invite. C'est une implémentation très directe de la définition, où je garde la trace de la séquence actuelle
f
(dont les valeursf[n]
par défaut sontn
).Voici une version légèrement plus lisible:
Quelques analyses
J'ai tracé les 2000 premiers éléments de la séquence (ça ne devient pas vraiment plus intéressant par la suite):
La séquence est donc essentiellement linéaire avec la pente 2 et comporte toujours quelques-unes de ces étapes. Il semble que les étapes se développent de façon sublinéaire (si elles ne sont même pas limitées), car elles deviennent à peine perceptibles lorsque vous augmentez le nombre de points que vous tracez.
Nous pouvons justifier la croissance linéaire assez facilement (c'est un peu ondulé, mais je pense que cela résisterait à une preuve rigoureuse par induction): au départ, le nombre maximum affecté d'une étape de permutation à
n
estn + (n+1) = 2n + 1
. Notez également que ces numéros seront toujours déplacés vers1
, depuis|n - (n+1)| = 1
. Il n'est donc pas surprenant que nous obtenions des nombres qui sont approximativement2n
dans la séquence. Cependant, nous pouvons également noter que pour les étapes jusqu'à n , S n + 1 est toujours limité par n + 1 , ce qui signifie qu'aucune étape de permutation ne peut échanger deux nombres qui sont tous les deux supérieurs à n . Par conséquent, les nombres qui doivent encore être traités seront inférieurs ou égaux à leur valeur initiale. Par conséquent,2n + 1
est également la limite de la séquence elle-même.Je pense que trouver un argument pour la longueur des étapes sera plus difficile.
la source
CJam,
45 4039 octetsJuste une approche naïve.
Peut être joué plus loin.Manque trop une fonction d'échange de tableau.Comment ça fonctionne:
Essayez-le en ligne ici
la source
Haskell, 95 octets
Exemple d'utilisation:
p 70
->139
Je ne stocke pas la séquence dans une liste ou un tableau. Je mets à jour à plusieurs reprises la fonction d'identité en fonction avec les deux éléments de l'étape actuelle échangés. Après les
n
étapes, j'appelle la fonction résultante avec paramètre1
.la source
J, 63 octets
Utilisation et tests:
Essayez-le en ligne ici.
la source
Pyth,
555351Peut probablement être joué plus loin.
n
Cela pourrait devenir très lent pour les grands, car j'étais paresseux pour savoir combien de temps j'avais besoin d'un tableau et j'en ai juste utilisé unn^n
.Merci à Volatility et Martin Büttner d' avoir souligné que je peux utiliser un maximum de
3n
.Explication
la source
2*n
grandn
, avec un maximum de3*n
pourn=1
.2n+1
, qui, comme vous le dites, a son maximum3
pourn=1
et (en quelque sorte) converge vers2n
. Ce n'est pas trop surprenant car c'est le maximum pour la séquence non permutée, et aucune étape du processus ne peut augmenter un nombre qui reste à venir. Je pourrais ajouter ceci à ma réponse..a
extension au bon travail! Il y a beaucoup plus de cadeaux, mais isaac dort en ce moment: github.com/isaacg1/pyth/pull/32doc.txt
le GitHub pour un manuel) et j'ai vu la mise à jour. Heureusement, comme j'aurais pu l'ignorer et écrire une implémentation personnalisée ...Python 2,
117106101Utilise undict
(carte) pour enregistrer les valeurs afin d'utiliser des indices arbitraires.g(n)
est une fonction renvoyant len
e élément. Il suffit ensuite d'itérer lesinput-1
heures et de sortir le premier élément.Il s'avère qu'il est plus court en utilisant les méthodes de ma réponse Pyth.
Merci à xnor pour avoir économisé 5 octets.
la source
b,c=a[i:i+2]
. En outre, ilb+c
est suffisamment court pour que l'enregistrer dans une variables
perd les caractères au lieu de simplement l'écrire deux fois.Aller 150
Non golfé, rien de délicat, principalement volé à @ Pietu1998
http://play.golang.org/p/IWkT0c4Ev5
la source
Java, 162
Explication
la source
dc,
134132131 octetsUtilisez
echo $n $code | dc
, où$n
est n et$code
est ... le code ( halètement ). Devis au goût.Edit: À moins que vous ne me harceliez pour une explication, je n'y arriverai jamais.
la source
Perl 5, 131
Une solution naïve (c'est-à-dire une mise en œuvre directe de la définition). Un sous-programme, il prend l'entrée comme une liste de
1
s de la longueur souhaitée.Visualisez sa sortie par exemple
print sub...->(1,1,1,1,1)
.Explication:
map$a[$_]=$_,1..3*@_
construit le tableau@a
, indexant chaque entier de 1 à 3 fois la taille de@_
(l'entrée).($a[$a[$_-1]+$a[$_]],$a[abs($a[$_-1]-$a[$_])])=($a[abs($a[$_-1]-$a[$_])],$a[$a[$_-1]+$a[$_]])for 2..@_
répète la switcheroo plusieurs fois (une fois moins que la taille de@_
), la commutation$a[$a[$_-1]+$a[$_]]
avec$a[abs($a[$_-1]-$a[$_])]
comme$_
va de 2 à la taille@_
.Et puis le sous-programme revient
$a[1]
.la source
Perl 5 , 90 + 1 (-p) = 91 octets
Essayez-le en ligne!
la source