Dans Gödel, Escher, Bach , Douglas Hofstadter introduit une séquence entière qui est communément appelée la séquence figure-figure:
2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, ...
Vous pouvez apprécier d'élaborer la définition de la séquence vous-même dans le cadre du défi, mais si vous ne pouvez pas ou ne voulez pas la comprendre, vous pouvez la trouver sur OEIS en tant que séquence A030124 et une définition légèrement plus claire sur Wikipédia .
Écrivez un programme ou une fonction qui, donné n
via STDIN, ARGV ou argument de fonction, imprime une liste des premiers n
nombres de la séquence dans STDOUT dans n'importe quel format de liste raisonnable.
Il s'agit du code golf, la solution la plus courte en octets gagne.
code-golf
number
number-theory
sequence
Martin Ender
la source
la source
Haskell,
676160565553 caractèresretour au premier algorithme.
cette solution calcule la séquence du complément en additionnant les éléments de départ de la séquence. il calcule ensuite la séquence comme tous les nombres entre les numéros de séquence du complément.
(#)
est la fonction qui calcule les nombres entre la séquence du complément.h
est la séquence elle-même.g
est la fonction qui répond à la question.la fonction g est définie pour prendre juste la quantité nécessaire d'éléments de h.
subtilités:
h
est en fait la séquence de figure figure à l'exception des 2 premiers éléments.non pas la séquence du complément est calculée, mais la séquence du complément avec 1 ajouté pour chaque élément.
ces deux subtilités sont la raison
scanl(+)8h
(qui est le code de la séquence complémentaire (à l'exception des 2 premiers éléments) avec des 1 ajoutés)8
. c'est pour le troisième élément de la séquence du complément avec 1 ajouté.la raison pour laquelle le calcul ne manque pas les deux premiers éléments est qu'ils sont ajoutés
g
dans2:4:h
.exemple:
la source
Rubis,
5448Démo
Edit: J'ai joué au golf un peu plus une fois que j'ai réalisé que je n'avais pas besoin de garder la séquence complète du complément en mémoire. Voici comment cela fonctionne maintenant: nous utilisons
x
pour garder une trace du plus grand nombre calculé dans la séquence complémentaire, etb
est un pool de candidats pour la séquence.n
fois, nous sortons le plus petit élément restant dansb
et l'ajoutons àx
pour calculer le nombre suivant dans la séquence du complément. Ensuite, nous supprimons les deux nombres du pool de candidats, donc nous émettons toujours le plus petit nombre qui n'a pas déjà été ajouté à l'une ou l'autre séquence.Astuces de golf Ruby: La syntaxe lambda Stabby est plus courte qu'une définition de méthode. L'exigence que la sortie soit donnée à STDOUT au lieu d'une valeur de retour m'a inspiré à utiliser le fait que la valeur de retour de
p(x)
estx
, ce dont je ne me souviens pas normalement car ce n'est pas le cas dans la version Ruby utilisée dans Anarchy Golf.la source
2..2*n
. Je dois utilisern*n
parce que je fais efficacementb = [x]^b
, j'ai donc besoin que le plus grand élément deb
soit plus grand que la plus grande valeur dex
, mais votreb -= [x]
juste requiert queb
contient la plus grande valeur possible de la séquence de sortie.GolfScript (
2421 octets)Démo en ligne
Cela a commencé tout à fait différemment, mais a fini par converger vers un port GolfScript de la solution Ruby d ' histocrat avant que Dennis ne fasse quelques suggestions qui l' amènent dans une direction légèrement différente. En particulier, l'impression des numéros tels que nous les identifions permet d'économiser un peu plus que de les rassembler dans un tableau pour l'impression à la fin; la raison en est que cela signifie qu'à aucun moment nous n'avons à nous soucier de plus de 3 objets sur la pile.
Dissection
la source
^
par\-
, vous pouvez remplacer).*
par3*
. Cela n'économisera aucun octet, mais cela réduira considérablement le temps d'exécution et l'utilisation de la mémoire. - Vous devriez pouvoir enregistrer un octet en gardant l'entier au-dessus du tableau. La boucle aura le même nombre d'octets, mais l'initialisation sera plus courte d'un octet.~.3*,1>\{(\(.p@+\|}*;
J - 28 caractères
Prise de fonction
n
comme argument.Nous exécutons une fonction, avec
n
comme argument gauche, sur son argument droit à plusieurs reprises jusqu'à ce qu'elle ne produise aucun changement. L'argument pour commencer est la liste2 4
.Dans la fonction elle-même, nous prenons les sommes partielles
+/\
et la somme complète+/
, puis les incrémentons toutes les deux avec&:>:
. Nous générons ensuite chaque entier de 2 à un de plus que la somme totale (2+i.
), et fixons soustrayons (-.
) les sommes partielles, laissant une séquence figure-figure plus longue par définition. Enfin, nous raccourcissons ou étendons cycliquement la liste à la longueurn
.Le résultat est que cela
2 4
devient3 7
, et cela est retiré de la2..8
sortie2 4 5 6 8
. Après un autre tour,2 4 5 6 8
devient3 7 12 18 26
devientDe cette façon, nous étendons à plusieurs reprises la séquence figure-figure. Le
$
comportement de longueur est juste un moyen non trivial d'économiser des caractères d'attendre que la séquence atteigne une longueurn
ou plus, et de sortir lesn
premières valeurs lorsqu'elles cessent de changer. Nous n'avons pas non plus à attendre très longtemps: nous pouvons obtenir jusqu'à 46336 termes à partir de quatre applications du verbe intérieur.La même fonction en k:
{{x#y@&~_lin[y:1+!1+/y;1+\y]}[x]/2 4}
{{x#y@&~(y:2+!1+/y)in\:1+\y}[x]/2 4}
la source
Java -
183158C'est le plus que je n'ai jamais joué au golf, et j'en suis fier! (Bien qu'il ne soit nulle part près du haut des graphiques (car c'est Java))
Merci à Peter Taylor pour ses suggestions
plus gros -
la source
Byte.valueOf
enregistre trois, et puisque la question ne spécifie pas la plage d'entrée, je pense que cela devrait être acceptable. En dehors des boucles,m
n'est utilisé que pour initialisern
, donck++<m
pourrait l'êtrem-->0
, en éliminantk
complètement.int[] n
peut être initialisé en tant queint n[]
et fusionné dans l'initialiseur précédent.n
ne détient jamais de valeurs autres que1
,n[...]!=0
pourrait donc l' êtren[...]>0
. L'initialiseur peut alors devenir la partie initialiseur de la premièrefor
boucle.u
et utilisez simplement++w
, il n'est pas nécessaire de définirn[q]
oun[w]
. Il y a un bug, en ce que vous exécutez à la fin dun
momentm==2
, qui semble être mieux corrigé par l'initialisationn=new int[2*m*m]
, mais je pense qu'il est réduit à 157 octets.for(int q=1,w=2,m=...,n[]=...;m-->0;){...
enregistrer un point-virgule.Python 2 - 77 octets
Code:
Fonctionne de la même manière que la solution de @ histocrat, sauf que l'entrée provient de stdin.
la source
Python 2 - 68
la source
Gelée , 15 octets
Essayez-le en ligne!
Erreur de mémoire à l'entrée de 6.
Comment ça fonctionne
Version plus efficace, 16 octets
Essayez-le en ligne!
Utilise une idée de cette réponse J . Tronquez à la longueur souhaitée à chaque itération et prenez le point fixe. J'ai pensé utiliser
S
(somme) au lieu deṀ‘
(max + 1), mais je ne peux pas garantir son exactitude.la source