introduction
A229037 a une intrigue assez intrigante (au moins pour les premiers termes):
Il y a la conjecture, qu'il pourrait en effet avoir une sorte de propriété fractale.
Comment se construit cette séquence?
Définissez a(1) = 1, a(2) = 1
ensuite pour chaque n>2
recherche un entier positif minimal a(n)
tel que pour chaque séquence n,n+k,n+2k
d'indices arithmétique à 3 termes , les valeurs correspondantes de la séquence nea(n),a(n+k),a(n+2k)
soient pas une séquence arithmétique.
Défi
Étant donné un entier positif n
en entrée, sortez les premiers n
termes a(1), ... , a(n)
de cette séquence. (Avec tout formatage raisonnable. Les caractères / chaînes de début / de fin possibles ne sont pas pertinents.)
Il existe des extraits pour générer cette séquence, mais je pense que d'autres approches pourraient être plus adaptées au golf / plus adaptées à certaines langues.
Veuillez nous faire savoir comment fonctionne votre programme. Si vous croisez un algorithme particulièrement efficace, vous voudrez peut-être également le mentionner, car cela permettrait de tracer plus de termes de la séquence en un temps plus court.
Premiers cas de test:
1, 1, 2, 1, 1, 2, 2, 4, 4, 1, 1, 2, 1, 1, 2, 2, 4, 4, 2, 4, 4, 5, 5, 8, 5, 5, 9, 1, 1, 2, 1, 1, 2, 2, 4, 4, 1, 1, 2, 1, 1, 2, 2, 4, 4, 2, 4, 4, 5, 5, 8, 5, 5, 9, 9, 4, 4, 5, 5, 10, 5, 5, 10, 2, 10, 13, 11, 10, 8, 11, 13, 10, 12, 10, 10, 12, 10, 11, 14, 20, 13
Plus de tests:
a(100) = 4
a(500) = 5
a(1000) = 55
a(5000) = 15
a(10000) = 585
Tous les termes jusqu'à n=100000
sont disponibles ici: https://oeis.org/A229037/b229037.txt
Merci @ MartinBüttner pour l'aide et les encouragements.
Réponses:
Python 2, 95 octets
L'astuce principale consiste à générer les nombres que la nouvelle valeur doit éviter. En gardant la séquence inversée jusqu'à présent
l
, regardons quels éléments pourraient former une progression arithmétique à trois termes avec la valeur que nous sommes sur le point d'ajouter.Les autres nombres sont les membres appariés de
l
et chaque deuxième élément del
, donczip(l,l[1::2])
. Si cette paire est(b,c)
alors la progression arithmétique(a,b,c)
se produit poura=2*b-c
. Après avoir généré l'ensemble dea
's à éviter, le code prend le minimum du complément, l'imprime et l'ajoute à la liste. (En fait, le calcul se fait avec des nombres diminués de 1, et imprimés 1 plus haut, pour laisserrange(n)
servir d'univers de candidats.)la source
Mathematica, 95 octets
Certainement pas l'approche la plus golfique, mais c'est en fait assez efficace, par rapport aux algorithmes que j'ai essayés depuis la page OEIS.
Au lieu de vérifier toutes les valeurs interdites pour chaque s (n) lorsque nous y arrivons, j'utilise une approche basée sur un tamis. Lorsque nous trouvons une nouvelle valeur s (n), nous vérifions immédiatement quelles valeurs cela interdit pour m> n . Ensuite, nous résolvons simplement le s (n + 1) en recherchant la première valeur qui n'était pas interdite.
Cela peut être rendu encore plus efficace en changeant le conditionnel
--i>0
en2n-#<=--i>0
. Dans ce cas, nous évitons de vérifier les valeurs interdites pour n supérieur à l'entrée.Pour une version un peu plus lisible, j'ai commencé avec ce code, qui stocke les résultats jusqu'à
max
dans une fonctionf
, puis je l'ai joué à la fonction pure d'une ligne ci-dessus:la source
Haskell,
90,89,84, 83 octetsPeut probablement être joué au golf plus, mais c'est toujours une
premièretentative décente :Ungolfed:
Il s'agit d'une implémentation simple qui renvoie «0» pour hors limites. Ensuite, pour chaque valeur possible, il vérifie que pour tous les k <= n et aux bornes, [x, a (xk), a (x-2k)] n'est pas une séquence arithmétique.
Limite supérieure de la complexité temporelle (en utilisant le fait de la page OEIS que a (n) <= (n + 1) / 2:
Je ne sais pas à quel point cette limite est bonne car le calcul des premières valeurs de 1k de 't' et l'utilisation d'un modèle linéaire sur les journaux des valeurs ont donné appx. O (22 ^ n), avec une valeur de p <10 ^ (- 1291), au cas où cela compte.
Au niveau de l'implémentation, en compilant avec '-O2', il a fallu ~ 35 min pour calculer les 20 premières valeurs.
la source
Brachylog ,
3331 octetsEssayez-le en ligne!
Au cas où cela compte: Le golf sur 2 octets a été possible grâce à une fonctionnalité que j'ai demandée après avoir travaillé sur ce défi.
Explication
Nous générons de manière itérative la séquence sous forme de liste dans l'ordre inverse, par exemple
[2,2,1,1,2,1,1]
, et l'inversons à la fin.Il y a quelques prédicats imbriqués ici. Regardons-les de l'intérieur. Le premier,,
ġh₃hᵐs₂ᶠ-ᵐ=
prend une sous-séquence candidatea(n),a(n-1),...,a(0)
et détermine s'ila(n),a(n-k),a(n-2k)
s'agit d'une séquence arithmétique pour certainsk
.Par exemple, avec l'entrée de
[1,2,1,1,2,1,1]
:Le prédicat suivant vers l'extérieur, entre
~b.hℕ₁≜∧.¬{...}∧
une sous-séquencea(n-1),a(n-2),...,a(0)
et sort la prochaine sous-séquence plus grandea(n),a(n-1),a(n-2),...,a(0)
.Enfin, le prédicat principal
;Ė{...}ⁱ⁽↔
prend un numéro d'entrée et génère autant de termes de la séquence.la source
Rubis , 71 octets
Essayez-le en ligne!
Génère toutes les valeurs interdites, puis prend le complément de ce tableau dans (1..n) et prend la première valeur du résultat. Cela signifie que je suppose que
a[n] <= n
pour tout n, ce qui est facilement prouvé par induction (si les premiers n / 2 termes sont tous inférieurs à n / 2, il ne peut pas y avoir de progression arithmétique conduisant à n).L'astuce syntaxique ici est également légèrement intéressante:
*a
est utilisée pour initialiser un tableau d'arguments supplémentaires (qui seraient ignorés si nous en transmettions), puisa.fill
mute le tableau d'arguments et le renvoie implicitement.la source
a[s-o]
eta[s-2*o]
, vous pouvez utilisera[s-=1]
eta[s-o]
APL (Dyalog Extended) , 37 octets SBCS
Un grand merci à Adám pour son aide dans la rédaction et le golf de cette réponse dans The APL Orchard , un excellent endroit pour apprendre la langue APL. Essayez-le en ligne!
Edit: -6 octets grâce à Adám
Explication
APL (Dyalog Unicode) ,
433938 octets SBCSVoici une solution plus rapide mais moins golfique qui peut calculer
⍺(10000)
en quelques secondes.Essayez-le en ligne!
la source
MATLAB,
156147 octetsJ'ai finalement pu jouer un peu au golf:
Ungolfed:
L'entrée est lue à partir de STDIN et l'impression se fait automatiquement avec des
ans=
éléments ajoutés. J'espère que cela peut être qualifié de sortie "raisonnable".Ceci est également une solution à base de tamis: la variable
s(i,:)
conserve la trace de ces valeurs de séquence qui sont interdits poura(i)
. Letry-catch
bloc est nécessaire pour traiter le cas d'unes
matrice vide (c'est-à-dire plein zéro) : dans ce cas, la valeur la plus basse de1
est déjà autorisée.Cependant, le besoin de mémoire (ou d'exécution?) Devient assez désordonné ci-dessus
N=2000
. Voici donc une solution non compétitive et plus efficace:Dans cette implémentation, la
s
matrice contient à nouveau des valeurs interdites, mais de manière bien ordonnée, sans aucun bloc zéro (qui sont présents dans la version concurrente). Le vecteur d'indexi
garde une trace du nombre de vecteurs interdits danss
. À première vue, les cellules seraient utiles pour garder une trace des informations stockéess
, mais elles seraient lentes et nous ne pourrions pas en indexer un tas en même temps.Une caractéristique désagréable de MATLAB est que, bien que vous puissiez dire
M(1,end+1)=3;
et développer automatiquement une matrice, vous ne pouvez pas faire de même avec l'indexation linéaire. Cela a du sens (comment MATLAB devrait-il connaître la taille du tableau résultant, dans le cadre duquel il devrait interpréter les indices linéaires?), Mais cela m'a quand même surpris. C'est la raison de la ligne superflues(N,max(i(j))) = 0;
: cela élargira las
matrice pour nous chaque fois que nécessaire. La supposition de la taille de départN*0.07+20
provient d'un ajustement linéaire aux premiers éléments, soit dit en passant.Afin de tester l'exécution, j'ai également vérifié une version légèrement modifiée du code, où j'ai initialisé la
s
matrice pour avoir la tailleN/2
. Pour les premiers1e5
éléments, cela semble être une supposition très généreuse, j'ai donc supprimé l'étape d'extensions
mentionnée dans le paragraphe précédent. Ensemble, cela implique que le code sera plus rapide, mais aussi moins robuste à très haut niveauN
(car je ne sais pas à quoi ressemble la série là-bas).Voici donc quelques runtimes, comparant
J'ai mesuré ceux-ci sur R2012b, en prenant le meilleur des 5 exécutions dans une définition de fonction nommée avec
tic/toc
.N=100
:0.011342 s
0.015218 s
0.015076 s
N=500
:0.101647 s
0.085277 s
0.081606 s
N=1000
:0.641910 s
0.187911 s
0.183565 s
N=2000
:5.010327 s
0.452892 s
0.430547 s
N=5000
:2.021213 s
1.572958 s
N=10000
:6.248483 s
5.812838 s
Il semblerait que la
v3
version soit considérablement, mais pas extrêmement rapide. Je ne sais pas si un élément d'incertitude (pour très grandN
) vaut la légère augmentation du temps d'exécution.la source
M=1;M(end+1)=2;
fonctionne parfaitement bien pour moi?M=rand(2); M(end+1)=2
plutôt :)Gelée ,
2419 octetsCeci est ma première réponse Jelly depuis un bon moment. Heureux d'être de retour.
Ceci est un port de ma réponse APL qui est lui-même une adaptation de la plupart des algorithmes utilisés ici. La principale différence est qu'elle est indexée sur 0.
Edit: -5 octets grâce à Jonathan Allan.
Essayez-le en ligne!
Explication
la source
ḟ
fera aussi bien queœ-
sauver un octet“”
par la1
sortie d'une représentation Jelly d'une liste à partir d'un programme complet, en enregistrant une de plus.Œœị@2
peut être joué au golf pourḊm2
sauver deux.L‘R
peut être joué au golf pour enŻJ
sauver un.ES6, 114 octets
Renvoie un tableau des n premiers éléments de la séquence, donc les indices sont à 1 de la version non golfée ci-dessous. J'ai utilisé l'approche tamis. Cette version ralentit après environ n = 2000; une version précédente évitait de lire le début du tableau, ce qui signifiait qu'il ne ralentissait pas jusqu'à environ n = 2500. Une ancienne version utilisait le tableau sieve comme une liste de valeurs interdites plutôt qu'un tableau booléen dont les valeurs étaient interdites; cela pourrait atteindre environ n = 5000 sans casser la sueur. Ma version originale a essayé d'utiliser des bitmasks mais cela s'est avéré inutile (et était également beaucoup trop long à 198 octets).
La version pas tout à fait aussi lente non golfée:
la source