Implémentez cette relation de récurrence en tant que fonction ou programme qui entre et sort un entier non négatif:
F (0) = 0
F (N) = le plus petit entier supérieur à F (N-1) tel que la somme et / ou le produit de ses chiffres de base 10 est N
N est l'entrée de votre programme et F (N) sa sortie.
Pour être clair, la somme des chiffres d'un nombre comme 913 est 9 + 1 + 3 = 13. Le produit est 9 × 1 × 3 = 27. Pour les nombres à un chiffre, la somme et le produit sont le même nombre. Les nombres qui contiennent un 0 ont bien sûr le produit 0.
Les résultats par F (70) sont:
N F(N)
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 19
11 29
12 34
13 49
14 59
15 69
16 79
17 89
18 92
19 199
20 225
21 317
22 499
23 599
24 614
25 799
26 899
27 913
28 1147
29 2999
30 3125
31 4999
32 5999
33 6999
34 7999
35 8999
36 9114
37 19999
38 29999
39 39999
40 41125
41 59999
42 61117
43 79999
44 89999
45 91115
46 199999
47 299999
48 311128
49 499999
50 511125
51 699999
52 799999
53 899999
54 911116
55 1999999
56 2111147
57 3999999
58 4999999
59 5999999
60 6111125
61 7999999
62 8999999
63 9111117
64 11111188
65 29999999
66 39999999
67 49999999
68 59999999
69 69999999
70 71111125
Le code le plus court en octets gagne. Bravo si vous pouvez montrer que votre code profite d'une certaine efficacité.
Réponses:
05AB1E ,
2012 octets8 octets enregistrés grâce à Osable !
Utilise l' encodage CP-1252 . Essayez-le en ligne!
la source
µNSDOsP‚¾>å½
. Il semble fonctionner pour des nombres choisis au hasard.Mathematica, 71 octets, 68 caractères
Pour seulement 4 octets supplémentaires, voici une version qui stocke les valeurs de
±n
:Avec cette dernière version, avant d'évaluer
±n
,PlusMinus
aura deux valeurs vers le bas:Maintenant, si nous évaluons
±20
:Cela accélère considérablement les calculs futurs, car Mathematica ne calculera plus les valeurs entre
0
et20
récursivement. Le gain de temps est d'autant plus dramatique qu'iln
augmente:la source
C #,
155159135 octetsSuper inefficace, prend longtemps pour justeN>=14
. Je vais essayer d'obtenir une solution plus efficace mais plus longue.D'accord, beaucoup mieux maintenant, mais 4 octets de plus. Eh bien, je peux faire
N<=50
assez rapidement maintenant. Merci @milk d'avoir économisé 24 octets!la source
for(;;)
et le foreach withforeach(var c in++i+"")
. -22 octets pour remplacerint.Parse(c+"")
avecc-48
.Pyth -
1817 octetsUn octet sauvé grâce à @Jakube!
Les utilisations réduisent pour faire la chose récursive.
Suite de tests .
la source
sM*FBjT;
génère également la somme des chiffres et le produit et est 1 octet plus court.R,
124112 octetsÉchoue à N = 45 car R insiste pour écrire 10.000 en 1e + 05, ce qui n'est pas apprécié par
as.numeric()
, cela peut être corrigé en utilisantas.integer()
au prix de 12 octets:En tant que langage de programmation statistique, R a des façons énormément verbeuses de diviser les nombres en un vecteur de chiffres. Surtout parce que tout doit être reconverti des chaînes en valeurs numériques de manière explicite.
12 octets économisés grâce à billywob.
la source
as.double(el(strsplit(c(x,""),"")))
pour diviser un entier en un vecteur de ses chiffres. Cependant, vous rencontrez toujours le problème de formatage, mais cela peut, comme dans votre réponse, être résolu paras.integer()
sprintf()
place pour formater directement l'entier dans une chaîne sans zéros de fin:as.double(el(strsplit(sprintf("%1.f",x),"")))
et ignorer l'utilisation deas.integer()
x=x+1
et cela est garanti d'être évalué une fois, car au début,y=F(N-1)
ce qui n'est certainement pas égal àN
.JavaScript (ES6)
1091071059189 Octetsla source
JavaScript (ES6), 84
86Modifier: 2 octets enregistrés thx @Arnauld
Note de test supérieure à 50, il utilisera trop de votre CPU, cliquez sur «Masquer les résultats» pour arrêter avant qu'il ne soit trop tard
la source
for(v=n&&f(n-1),p=s=n+1;s&&p-1;)[...++v+''].map(d=>(p/=d,s-=d),p=s=n);v
devrait enregistrer 2 octets. Je soupçonne qu'il peut être raccourci un peu plus, mais je n'ai pas pu le comprendre jusqu'à présent.p /= d
produire un résultat exact lorsqu'ild
est en fait un diviseur dep
. À moins que je ne me trompe, cela est vrai pour tousd <= p <= Number.MAX_SAFE_INTEGER
. Nous aurons des erreurs d'arrondi en virgule flottante quandp % d != 0
, mais cela devrait être sûr.eval`1+1`
) (voici pourquoi codegolf.stackexchange.com/a/52204/21348 : lire le premier commentaire)Mathematica, 67 octets
Fonction, nommée
a
. Prend un nombre en entrée et renvoie un nombre en sortie. Inspiré de la précédente solution Mathematica, mais utilise un mécanisme de boucle différent.la source
C, 240 octets
Essayer d'exploiter certaines propriétés mathématiques de la séquence.
la source
PowerShell v3 +, 114 octets
Solution itérative, sans moyen facile de transformer un nombre en somme / produit de ses chiffres, c'est donc un peu plus long que les réponses JavaScript.
Prend l'entrée
$n
, définit$i
un tableau avec juste0
(c'est la collection deF()
, et définit$l
égal à1
(c'est la dernièreF
). Nous bouclons ensuite vers le haut de1
à$n
, chaque itération exécutant unefor
boucle.Le
for
conditionnel de la boucle prend le$l
nombre atest, dans une chaîne"$l"
, puis lechar
transforme en tableau et stocke ce tableau dans la variable temp$b
. Nous avons ensuite-join
ces chiffres avec+
et rediriger versiex
(abréviationInvoke-Expression
et similaire àeval
). De plus, nous faisons de même avec*
. Ces deux nombres sont encapsulés entre parenthèses et traités comme l'argument tableau de l'-notin
opérateur par rapport au numéro actuel$_
de la boucle externe (c'est-à-dire que lafor
boucle s'exécute tant que l'un+
et l' autre*
sont différents de$_
). Le corps de lafor
boucle augmente simplement$l++
.Une fois que nous sommes sortis de cette
for
boucle interne , nous ajoutons notre$l
on comme nouvel élément de$i
. Une fois que nous avons complètement terminé la boucle de plage, nous plaçons simplement$i[$n]
sur le pipeline et la sortie est implicite.NB - Obtient assez lentement pour s'exécuter ci-dessus
20
, simplement à cause de la structure de la boucle. Par exemple, celaN=40
prend environ deux minutes sur ma machine, et je n'ai même pas pris la peine de testerN>50
.la source
Pyke, 17 octets
Essayez-le ici!
Ou 13 octets non compétitifs
first_n
met désormais le nombre d'objets déjà trouvés plus uni
s'il est utilisé.Essayez-le ici!
la source
Python 2 , 77 octets
Essayez-le en ligne!
la source
Wonder , 49 octets
Motif assorti ftw! Usage:
Plus lisible:
Il s'agit essentiellement d'une implémentation mot à mot des spécifications.
la source
BASH, 107 octets
avec pli + pâte + bc
la source
Befunge, 101 octets
Essayez-le en ligne! Mais notez que ça va devenir très lent une fois que vous aurez atteint la quarantaine. Si vous voulez tester la gamme complète, vous devez vraiment utiliser un compilateur Befunge.
Explication
la source
PHP , 110 octets
Essayez-le en ligne!
la source