Étant donné un entier n
(où n < 10001
) en entrée, écrivez un programme qui produira les premiers n
nombres Ulam . Un nombre Ulam est défini comme suit:
- U 1 =
1
, U 2 =2
. - En effet
n > 2
, U n est le plus petit entier supérieur à U n-1 qui est la somme de deux termes antérieurs distincts d' une seule manière.
Par exemple, U 3 est 3
(2 + 1), U 4 est 4
(3 + 1) (notez que (2 + 2) ne compte pas car les termes ne sont pas distincts), et U 5 est 6
, (U 5 n'est pas 5 car 5 peut être représenté par 2 + 3 ou 4 + 1). Voici les premiers nombres d'Ulam:
1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, 28, 36, 38, 47, 48, 53, 57, 62, 69, 72, 77, 82, 87, 97, 99
C'est le golf de code, donc l'entrée la plus courte gagne.
code-golf
number
number-theory
sequence
Absinthe
la source
la source
n
nous devons gérer?Réponses:
CJam,
474137 octetsEssayez-le en ligne.
Exemple d'exécution
Comment ça fonctionne
Cette idée de base est la suivante:
Commencez par le tableau
A := [ 0 U₁ U₂ ... Uₖ ]
.Calculer
S
, le tableau de toutes les sommesx + y
telles quex,y ∊ A
etx < y
.Jetez toutes les sommes non uniques de
S
. Puisque chaque nombre Ulam supérieur à 2 est à la fois la somme de deux plus petits et la somme de zéro et de lui-même, cela supprime les nombres UlamU₃, U₄, ... Uₖ
.Le tableau restant est
[ U₁ U₂ Uₖ₊₁ ... ]
, donc le prochain nombre Ulam est le troisième plus petit élément. Ajoutez-le àA
et revenez à l'étape 1.la source
100
prend déjà plusieurs secondes. Je suppose que le calcul de l'entrée maximale 1e5 prendrait des âges?J - 46 car
Prise de fonction
n
comme argument.Expliqué par l'explosion:
la source
+_*
...T-SQL,
301300288287J'ai commis un petit abus SQL léger.
Essayez-le dans SQL Server 2008 ici .
@N contient l'entier d'entrée. Changez l'exemple "100" en ce que n devrait être. "10000" finira probablement par la suite, mais je n'ai pas laissé cela se terminer. Le nombre de caractères de cette entrée correspond à une entrée à un chiffre. La sortie est sous forme de résultat de requête.
la source
Haskell,
7067 caractèresusage:
la source
GolfScript (
4137 octets)Démo en ligne
Les produits cartésiens dans GolfScript sont assez longs, donc cela prend une approche différente. La croissance à long terme des nombres Ulam est que le
n
nombre Ulam est d'environ13.5n
, mais dans les 10000 premiers termes le plus grand rapport entre len
nombre Ulam etn
est juste inférieur13.3
. Donc, étant donné quen
nous pouvons filtrer les premiers14n
nombres pour trouver ceux qui appartiennent à la séquence.Merci à Dennis pour 41-> 37.
la source
n = 1000
prend moins d'une minute avec GolfScript; un port vers CJam se terminen = 1000
en 8 secondes etn = 10000
en 1h 20 m. - Vous pouvez économiser quatre octets en combinant votre approche avec la mienne, à savoir inclure 0 dans le tableau et le rejeter ensuite. Cela permet d'utiliser l'union définie au lieu du bloc et élimine le besoin d'une variable:~.14*,4,\{1$.{2$1$-.@<*}%&,2=*|}/1><`
14
.14
c'est justeE
. Mais vous devez lire à partir de STDIN, convertir l'entier en singleton avant d'effectuer l'union d'ensemble (je déposerai un rapport de bogue à ce sujet) et2$
ne fonctionnera pas dans la boucle interne car CJam modifie la pile après chaque itération ... I 'ai essayé plusieurs astuces différentes, mais la plus courte était exactement de 37 octets:li4,1$E*{__{I1$-_@<*}%&,2=I*a|}fI1><`
JavaScript ES6,
100 ... 9390 caractèresExécutez ceci dans la console Web ou le bloc-notes du dernier Firefox (tous les soirs ou version).
EDIT 8 Golfé beaucoup !!! et il est descendu à
94 caractères9390 caractères (merci à @openorclose). (Mon premier sous 100)Voici ma version qui est beaucoup plus rapide
mais qui fait 3 caractères de plus (107 caractères)et qui est exactement la même quantité de caractères que ci-dessuset est beaucoup plus petite que la méthode de force brute ci-dessous !, (grâce à edc65):Je continuerai d'essayer de jouer au golf plus loin. Mais nous le tirons hors de la portée de JS: P
Voici quelques chiffres lorsque je l'exécute dans une balise de script dans une page Web:
Ceci est ma première soumission qui est fortement inspirée par la réponse de @ rink.attendant.6 en JavaScript.
Je sais que cela peut être joué encore plus loin. Je publierai également une solution non bruteforce, qui pourrait être encore plus courte.
EDIT 1 : Golfé un peu plus et fixé pour n = 1
Je dois dire que j'envie Haskell et J pour de tels raccourcis super pratiques pour chaque type d'exigence -_-
la source
u=n=>{for(s=[,1,1],r=[i=1,l=2];c=l<n;!c?s[r[l++]=i]=1:0,i++)for(j of r)c-=j<i/2&s[i-j];return n>1?r:[1]}
et peut-être même plusreturn
. 100:u=n=>(s=>{for(r=[i=1,l=2];c=l<n;i+=!c?s[r[l++]=i]=1:1)for(j of r)c-=j<i/2&s[i-j]})([,1,1])|n>1?r:[1]
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)for(j of r)c-=j<i/2&s[i-j]})([,1])||r
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)r.map(j=>c-=j<i/2&s[i-j])})([])||r
moins que le [, 1] ne soit nécessaire quelque partPerl - 71 octets
Essayez-le en ligne!
Compter le shebang comme un.
L'utilisation d'un deuxième tableau pour stocker les sommes semble être beaucoup plus rapide qu'un hachage. L'utilisation de la mémoire est également moindre, ce à quoi je ne m'attendais pas.
Exemple d'utilisation:
Exemple de sortie:
Temps d'exécution approximatifs:
la source
n == 1e4
. Incroyable! La sortie den == 1
est cependant incorrecte; il doit imprimer un seul numéro.Java, 259
La force brute fonctionne bien pour cela.
la source
1
doit être un numéro unique.APL (Dyalog Extended) ,
3635 octets-1 octet par Adám
Essayez-le en ligne!
* (Dans ngn / APL, une constante peut terminer un train sans utiliser
⍨
. Mais ngn / APL n'a pas de décompte, nous avons donc besoin de ⍨ quelque part.)la source
{(2 3∊⍨⍵⍧⍵)/⍵}
→(∊⊢⊆⍨⍧⍨∊2 3⍨)
PHP 5.4+, 164
Même approche que mes réponses:
la source
Gelée , 20 octets
Essayez-le en ligne!
la source
CoffeeScript,
119114Dernièrement, j'ai pratiqué CoffeeScript pour améliorer le golf avec JavaScript, alors voici ma réponse JavaScript compilée dans CoffeeScript:
Je ne comprends pas très bien les boucles et les compréhensions dans CoffeeScript, donc cela peut être approfondi, mais c'est ce que j'ai pour l'instant. Les sauts de ligne sont comptés comme un caractère (style Unix).
la source
JavaScript,
147154150 (136)Fortement inspiré par la solution Java à force brute de @ Ypnypn publiée précédemment:
Merci pour @Dennis d'avoir rasé de 4 à 18 octets sur ma version originale
Version dangereuse (utilisant des
for..in
boucles)Je ne recommanderais pas d'exécuter cela parce que parcourir un objet qui utilise une boucle pourrait provoquer l'éclatement de votre machine et / ou la transformer en une machine à tuer en colère, mais voici:
instanceof
Array
for..in
Non golfé
la source
z=0
à l'intérieur de la boucle, vous n'en aurez besoin qu'une seule fois. 2.for(j in l)for(k in l)z+=l[j]<l[k]&l[j]+l[k]==i;
est beaucoup plus court que l'l.forEach
approche.Mathematica,
10791 octetsC'est une implémentation très directe de la spécification.
J'applique également l'astuce de Dennis d'inclure des sommes avec
0
, mais le problème est que cela fait le troisième élément de la liste0
avant de reprendre comme on pourrait s'y attendre, donc je dois supprimer cet élément de la liste.Il gère une entrée de
1000
en quelques secondes, mais je doute que vous obtiendrez un résultat pour 10k dans un délai raisonnable. Mais je ne pense pas que les autres réussissent bien non plus.la source
OCaml - 254 caractères
Le code utilise une table de hachage pour stocker la somme des éléments actuels de la liste et la mettre à jour chaque fois qu'un nouvel élément est calculé.
Usage:
Dans l'interpréteur OCaml:
Non golfé
la source
Python,
137128126 caractères.Ceci est mon premier golf, et je l'ai ramené de ~ 250 caractères, je suis assez content mais j'aimerais des suggestions sur la façon de s'améliorer!
la source
for b in U:t[a+b]+=a!=b
et les lignes 8 et 9 àwhile t[i]-2:i+=1
for
U,i=[1,2],2
versU,i=[1],2
etinput()-2
versinput()-1
ett=_*3*i
verst=_*3*i;U+=[i]
et supprimer;U+=[i]
à la fin de pourC #, 257
Approche par force brute, utilisant LINQ:
Non golfé, avec harnais de test
la source
Pyth,
2725 octetsEssayez-le en ligne ici .
Edit: golfé 2 octets en effectuant la sommation avant le regroupement. La version précédente:
<uaGh-mssdfq1lT.gsk.cG2GQS2
la source
C, 478 octets
Dans Tio maintenant, en 9 secondes, il trouverait 10000 valeurs (et y imprimerait les 100 premières valeurs). L'astuce consiste à utiliser non pas la recherche linéaire dans la boucle interne mais la recherche binaire ... Ce sont ci-dessous des fonctions bien indentées et entièrement lisibles (enfin pour moi):
la source
APL (NARS), 278 caractères, 556 octets
ce serait la traduction en APL de C que j'ai envoyée. Il semble que je ne comprenne pas quand utiliser ∇∇ à la place de ∇ ... possible ∇∇ est utilisé quand il y a un argument est une fonction (et pas un autre type). "u bs x, a, b" devrait être la recherche de bin dans le tableau "u" pour la valeur "x" dans la plage a..b; il retournerait 1, indexWhereFind ou 0, indexWhereEndOfsearch. Avec l'argument 200 p la fonction prend + - une minute ici ...
la source
∇∇
dans un dop se réfère à l'opérateur lui-même tandis que se∇
réfère à la fonction dérivée constituée de l'opérateur avec son ou ses opérandes. Donc, dans un opérateur monadique,∇
c'est la même chose(⍺⍺∇∇)
que dans un opérateur dyadique, cela signifie(⍺⍺∇∇⍵⍵)
.