Inspiré par la question précédente .
La séquence auto-descriptive de Golomb g (n) est une séquence où tout nombre naturel n
est répété dans la séquence g (n) fois.
Les premiers chiffres de la séquence sont les suivants:
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
g(n) 1 2 2 3 3 4 4 4 5 5 5 6 6 6 6 7 7 7 7 8
Vous pouvez voir que g (4) = 3 et que "4" est répété 3 fois dans la séquence.
Étant donné une entrée de n
, une sortie g(n)
.
Limitations: n <100000.
Le plus petit code gagne.
n
plutôt que2 - n % 1
. Avez-vous des raisons de vous attendre à ce que les réponses soient sensiblement différentes?golomb=1:2:2:concat(zipWith replicate(drop 2 golomb)[3..])
Réponses:
GolfScript (31 caractères)
Démo
la source
Gelée , non compétitive
10 octets Cette réponse n'est pas concurrente, car le défi est antérieur à la création de Jelly.
Cela utilise la formule récursive a (1) = 1, a (n + 1) = 1 + a (n + 1 - a (a (n))) de la page OEIS.
Essayez-le en ligne!
Comment ça fonctionne
la source
PHP - 63 caractères
Rapide ET court.Il me semble avoir eu la mauvaise séquence en tête. Derp.
C'est CORRECT, rapide et court.
La précision peut souffrir au-delà de la barre des 100 000, mais je l'ai en fait atteinte.
la source
PHP
Cette version récursive est plus courte (60) mais inefficace sur le plan des calculs:
C'est beaucoup plus rapide mais plus long (78):
Beaucoup plus rapide, mais à 89 caractères serait:
Qui est O (n)
la source
Haskell,
3027 caractèresla source
Oasis , 7 octets (non concurrent)
Code:
Essayez-le en ligne!
Oasis est un langage conçu par Adnan qui est spécialisé dans les séquences.
Actuellement, cette langue peut faire récursivité et forme fermée.
Le
T
à la fin est un raccourci pour10
, ce qui indique quea(0) = 0
eta(1) = 1
. Pour ajouter plus de tests, ajoutez simplement à la liste à la fin.Maintenant, nous avons essentiellement calculé
a(n-a(a(n-1))+1
.la source
Perl, 48 caractères
Entrée sur stdin, sortie sur stdout. Nécessite Perl 5.10+ et le
-M5.010
pour activer lasay
fonctionnalité. Prend environ O ( n 2 ) en raison d'une manipulation de tableau inefficace, mais toujours assez rapide pour calculer facilement jusqu'au 100 000e terme.la source
Julia - 28
De manière récursive :
Production:
la source
Python - 64 caractères
la source
[i]*g[i-1]
ferait ça, alors je me suis penché en arrière pour le faire d'une autre manière; Je pensais que cela se comporterait plus comme multiplier une matrice par un scalaire pour une raison quelconque ...Javascript, 93 caractères
la source
J, 43 caractères
Définit une fonction en utilisant l'expression asymptotique donnée sur la page wikipedia.
De façon ennuyeuse, 9 caractères sont utilisés en arrondissant à l'entier le plus proche.
la source
Prélude ,
695554 octetsSi un interpréteur conforme standard est utilisé, cela prend l'entrée et la sortie comme valeurs d'octet . Pour utiliser réellement des nombres décimaux sur STDIN / STDOUT, vous auriez besoin de l'interpréteur Python avec
NUMERIC_OUTPUT = True
et d'une option supplémentaireNUMERIC_INPUT = True
.Explication
Le squelette du programme est
Nous lisons l'entrée
N
sur la première voix et la décrémentons pour l'obtenirN-1
. Nous initialisons également la deuxième voix pour1
. Ensuite, nous bouclonsN-1
une fois, dont chaque itération obtient la valeur suivante de la séquence sur la deuxième pile. À la fin, nous imprimons leN
numéro e.L'idée du programme est de mettre chaque élément de la séquence dans une file d'attente sur la troisième voix, et de décrémenter la tête de cette file d'attente à chaque itération. Lorsque la tête atteint
0
, nous incrémentons la valeur de la séquence et la supprimons0
.Maintenant, le problème est que Prelude utilise des piles et non des files d'attente. Nous devons donc déplacer un peu cette pile pour l'utiliser comme une file d'attente.
Cela copie la valeur actuelle de la séquence sur la première voix (en tant que copie temporaire), pousse a
0
sur la deuxième voix (pour marquer la fin de la file d'attente). Et effectue ensuite une boucle pour décaler (et ainsi inverser) la troisième pile sur la seconde. Après la boucle, nous mettons la copie de la valeur de séquence actuelle au-dessus de la deuxième pile (qui est la queue de notre file d'attente).Cela semble un peu moche, mais c'est essentiellement une boucle qui ramène la pile sur la troisième voix. Étant donné que le
)
est dans la même colonne que les instructions de décalage, le0
nous avons mis sur la deuxième voix plus tôt se retrouvera également sur la troisième voix, nous devons donc le supprimer avec un autre#
. Puis décrémentez le haut de la 3ème voix, c'est-à-dire la tête de file d'attente.Maintenant, cela devient un peu ennuyeux - nous voulons exécuter du code lorsque cette valeur est
0
, mais la seule structure de contrôle de Prelude (la boucle) ne répond qu'aux valeurs non nulles.Notez que le haut de la deuxième voix est véridique (puisque la séquence de Golomb ne contient aucun
0
s). La charge de travail va donc dans cette voix (la dernière paire de parenthèses). Nous devons juste empêcher cela de se produire si le chef de file d'attente n'est pas0
encore. Donc, d'abord, nous avons une "boucle" sur la troisième voix qui pousse a0
sur la deuxième voix si la tête de la file d'attente est toujours non nulle. Nous avons également mis une0
troisième voix pour quitter la boucle immédiatement. Le#
sur la troisième voix , puis supprime non plus que0
, ou supprime le chef de la file d' attente si c'était déjà nul. Maintenant, cette deuxième boucle n'est entrée que si la tête de la file d'attente était nulle (et le0
sur la deuxième voix n'a jamais été poussé). Dans ce cas, nous incrémentons la valeur actuelle de la séquence et appuyons sur a0
pour quitter la boucle. Enfin, il y aura toujours un0
sur le dessus de la pile, que nous devons jeter.Je vous ai dit que la négation logique est ennuyeuse dans Prelude ...
la source
Mathematica, 27 octets
Une autre solution récursive.
la source
CJam, 14 octets
CJam est beaucoup plus jeune que ce défi, donc cette réponse n'est pas éligible pour la coche verte. Cependant, il est assez rare que vous puissiez l'utiliser
j
correctement, donc je voulais quand même le poster.Testez-le ici.
Explication
j
est fondamentalement "l'opérateur de récursion mémorisé". Il prend un entierN
, un tableau et un blocF
. Le tableau est utilisé pour initialiser la mémoisation: l'élément à indexi
sera retourné pourF(i)
.j
calcule ensuiteF(N)
, soit en le recherchant, soit en exécutant le bloc (avecn
sur la pile) si la valeur n'a pas encore été mémorisée. La fonctionnalité vraiment astucieuse est que dans le bloc,j
ne prend qu'un entieri
et appelleF(i)
récursivement. Voici donc le code:la source
J, 16 octets
Cette solution est fortement basée sur la solution d' Algorithmshark à un problème similaire. Vous pouvez trouver des explications sur cette méthode ici.
J, 33 octets
Dans cette approche, je construis une séquence
h(k)
avec les valeurs des premiers indexi
où leg(i)=k
soh = 1 2 4 6 9 12 16...
. Nous pouvons obtenirh(k)
assez simplementh(1..k-1)
avec l'expression({:+1+[:+/#<:])
où se trouve l'entréeh(1..k-1)
.Le calcul de la sortie de
h
est simple.h ([:+/]>:[) input
la source
Brachylog , 13 octets (non concurrent)
Essayez-le en ligne!
Explication
la source
Python - 76 caractères
la source
None
s. Semble être la quantité «correcte» deNone
s tho :)None
type. Je viens d'utiliser les compréhensions de listes imbriquées pour réaliser une boucle imbriquée. Le seul but des compréhensions de liste ici est de faire en sorte que le code boucle le bon nombre de fois - ce sont des valeursJavaScript - 48 caractères
Crée un tableau indexé 1
g
contenant les valeurs de séquence.Édition - JavaScript - 46 caractères
Crée un tableau indexé 1
v
contenant les valeurs de séquence.Édition 2 - ECMAScript 6 - 27 caractères
Les deux premiers sont assez rapides - le troisième est très lent
la source
Haskell, 63 octets
Ceci est l'approche naïve, je n'étais pas au courant de la récurrence très courte quand j'ai écrit ceci, mais j'ai pensé que je la publierais de toute façon, même difficile, elle est plus longue que toutes les autres implémentations Haskell, comme par exemple
Calculer le nième terme de la séquence auto-descriptive de Golomb
et
/codegolf//a/23979/24877
la source