Prenez un entier positif X
. Ce nombre fait partie de la séquence qui nous intéresse si la somme de tous les chiffres de X
est un diviseur de X
, et si le produit de tous les chiffres de X
est un diviseur de X
.
Par exemple, 135
est un tel nombre car 1 + 3 + 5 = 9
qui divise 135 = 9 * 15
et 1 * 3 * 5 = 15
qui divise également 135
.
Il s'agit de la séquence A038186 dans l'OEIS.
Votre tâche: étant donné un entier N
, sortez le N
e entier positif avec de telles propriétés.
Entrées et sorties
Les nombres peuvent être
0
-indexés ou1
-indexés; veuillez indiquer celle que votre réponse utilise.L'entrée peut être prise en compte
STDIN
, comme argument de fonction, ou quelque chose de similaire.La sortie peut être imprimée
STDOUT
, renvoyée par une fonction ou quelque chose de similaire.
Cas de test
Les cas de test ci-dessous sont 1
indexés.
Input Output
1 1
5 5
10 12
20 312
42 6912
50 11313
Notation
Il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte.
la source
0
.Réponses:
05AB1E ,
1312 octetsMerci à Emigna d' avoir enregistré un octet!
Explication:
Utilise l' encodage CP-1252 . Essayez-le en ligne!
la source
µNNSONSP‚ÖP½
fonctionne aussi bien n'est-ce pas?Pyke, 14 octets (non compétitif) (1 indexé)
Essayez-le ici!
Mon dieu ce que beaucoup de nouvelles fonctionnalités.
Dont non compétitifs
I
lequel il ne vérifierait que si le premier élément de la pile était véridiquedigits
- retourne une liste de chiffres dans le numéro@
utilisé pour obtenir le nième élément d'une liste infinieDont étaient utilisés pour la première fois:
Supprimez les 2 derniers octets pour obtenir tous ces nombres.
la source
C #, 118 octets
Programme complet avec fonction non golfée et cas de test:
la source
for(int x=0,c=0;;)
vous sauve 1 octet.Gelée , 13 octets
1 basé.
TryItOnline!
Comment?
la source
Perl 6 , 44 octets (indexé 0)
Explication:
Listes infinies ftw!
la source
*
signifierait plus d'octets.//0
legrep
bloc.//0
car il est généralement accepté dans codegolf d'imprimer sur stderr.//0
En fait , 20 octets
Implémentation naïve de la définition de séquence. Suggestions de golf bienvenues! Essayez-le en ligne!
Ungolfing
la source
Méduse , 45 octets
Essayez-le en ligne!
Explication
C'est de loin le programme le plus élaboré (et aussi le plus long) que j'ai écrit dans Jellyfish jusqu'à présent. Je ne sais pas si je serai en mesure de décomposer cela d'une manière compréhensible, mais je suppose que je devrai essayer.
Jellyfish fournit un opérateur d'itération assez général
\
, ce qui aide beaucoup à «trouver le Nth quelque chose ». L'une de ses sémantiques est "itérer une fonction sur une valeur jusqu'à ce qu'une fonction de test distincte donne quelque chose de vrai" (en fait, la fonction de test reçoit à la fois le courant et le dernier élément, mais nous ne ferons que regarder l'élément actuel) . Nous pouvons l'utiliser pour implémenter une fonction "prochain numéro valide". Une autre surcharge de\
"itère une fonction sur une valeur de départ N fois". Nous pouvons utiliser notre fonction précédente et l'itérer sur0
N fois, où N est l'entrée. Tout cela est configuré de manière assez concise avec cette partie du code:(Les raisons pour lesquelles
0
l'entrée réelle de la fonction résultante est là-bas sont un peu compliquées et je ne les aborderai pas ici.)Le problème avec tout cela est que nous ne transmettrons pas la valeur actuelle à la fonction de test manuellement. L'
\
opérateur le fera pour nous. Nous avons donc maintenant construire une seule fonction unaire (via les compositions, les crochets, les fourchettes et le curry) qui prend un nombre et nous dit si c'est un nombre valide (c'est-à-dire qui est divisé par sa somme de chiffres et son produit de chiffres). Ceci est assez non trivial lorsque vous ne pouvez pas vous référer à l'argument. Déjà. C'est cette beauté:Le
(
est un crochet unaire , ce qui signifie qu'il appelle la fonction ci-dessous (f
) sur son entrée (la valeur actuellex
), puis passe les deux à la fonction de test à droite (g
), c'est-à-dire qu'il calculeg(f(x), x)
.Dans notre cas,
f(x)
est une autre fonction composite qui obtient une paire avec le produit numérique et la somme numérique dex
. Cela signifie queg
sera une fonction qui a les trois valeurs pour vérifier si ellex
est valide.Nous allons commencer par regarder comment
f
calcule la somme des chiffres et le produit des chiffres. C’estf
:&
c'est aussi la composition (mais l'inverse).~
currying10~b
donne donc une fonction qui calcule les chiffres décimaux d'un nombre, et puisque nous passons cela à&
droite, c'est la première chose qui arrivera à l'entréex
. Le reste utilise cette liste de chiffres pour calculer leur somme et leur produit.Pour calculer une somme, nous pouvons plier l' addition sur elle, ce qui est
/+
. De même, pour calculer le produit, nous multiplions la multiplication par dessus/*
. Pour combiner ces deux résultats en une paire, nous utilisons une paire de crochets,(
et)
. La structure de ceci est:(Où
f
etg
sont le produit et la somme, respectivement.) Essayons de comprendre pourquoi cela nous donne une paire def(x)
etg(x)
. Notez que le crochet droit)
n'a qu'un seul argument. Dans ce cas, l'autre argument est supposé être celui;
qui encapsule ses arguments dans une paire. De plus, les hooks peuvent également être utilisés comme fonctions binaires (ce qui sera le cas ici), auquel cas ils n'appliquent la fonction interne qu'à un seul argument. Donc vraiment)
sur une seule fonctiong
donne une fonction qui calcule[x, g(y)]
. En utilisant cela dans un crochet gauche, avecf
, nous obtenons[f(x), g(y)]
. Ceci, à son tour, est utilisé dans un contexte unaire, ce qui signifie qu'il est en fait appelé avecx == y
et nous nous retrouvons donc[f(x), g(x)]
comme requis. Phew.Cela ne laisse qu'une seule chose, qui était notre fonction de test précédente
g
. Rappelez-vous qu'il sera appelé commeg([p, s], x)
oùx
est toujours la valeur d'entrée actuelle,p
est son produit numérique ets
sa somme numérique. C’estg
:Pour tester la divisibilité, nous utiliserons évidemment le modulo, qui est
|
dans Jellyfish. Un peu inhabituellement, il prend son opérande de droite modulo son opérande de gauche, ce qui signifie que les arguments àg
sont déjà dans le bon ordre (les fonctions arithmétiques comme celle- ci passent automatiquement sur les listes, donc cela calculera les deux modules séparés gratuitement) . Notre nombre est divisible par le produit et la somme, si le résultat est une paire de zéros. Pour vérifier si c'est le cas, nous traitons la paire comme une liste de chiffres en base 2 (d
). Le résultat de ceci est zéro, uniquement lorsque les deux éléments de la paire sont nuls, nous pouvons donc annuler le résultat de this (N
) pour obtenir une valeur vraie pour savoir si les deux valeurs divisent l'entrée. Notez que|
,d
etN
sont simplement tous composés avec une paire de&
s.Malheureusement, ce n'est pas toute l'histoire. Et si le produit numérique est nul? La division et le modulo par zéro renvoient tous les deux zéro dans les méduses. Bien que cela puisse sembler une convention quelque peu étrange, cela s'avère en fait quelque peu utile (car nous n'avons pas besoin de vérifier zéro avant de faire le modulo). Cependant, cela signifie également que nous pouvons obtenir un faux positif, si la somme des chiffres divise l'entrée, mais que le produit numérique est zéro (par exemple, l'entrée
10
).Nous pouvons résoudre ce problème en multipliant notre résultat de divisibilité par le produit numérique (donc si le produit numérique est nul, cela transformera également notre valeur véridique en zéro). Il s'avère plus simple de multiplier le résultat de divisibilité par la paire de produit et de somme, et d'extraire ensuite le résultat du produit.
Pour multiplier le résultat avec la paire, nous devons en quelque sorte revenir à une valeur antérieure (la paire). Cela se fait avec un fork (
]
). Les fourchettes sont un peu comme des crochets sur les stéroïdes. Si vous leur donnez deux fonctionsf
etg
, elles représentent une fonction binaire qui calculef(a, g(a, b))
. Dans notre cas,a
est la paire produit / somme,b
est la valeur d'entrée actuelle,g
est notre test de divisibilité etf
est la multiplication. Donc, tout cela calcule[p, s] * ([p, s] % x == [0, 0])
.Il ne reste plus qu'à en extraire la première valeur, qui est la valeur finale de la fonction de test utilisée dans l'itérateur. C'est aussi simple que de composer (
&
) la fourche avec la fonction head<
, qui retourne la première valeur d'une liste.la source
R,
132115 octetsNouvelle version grâce à @Billywob de beaux commentaires!
Non golfé:
Puisque R se comporte étrangement avecNA
s, j'ai dû ajouter laifelse(is.na(...))
partie entière !Ou utiliser
na.omit(...)
la source
n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(!b%%sum(d)&ifelse(is.na((p=!b%%prod(d))),F,p))i=i+1};b
enregistre quelques octets par:el(...)
au lieu de[[1]]
, en utilisantc(b,"")
au lieu depaste(b)
, en annulant les expressions logiques par!
au lieu de==0
et en sautant les accolades sur l'if
instruction. Je suppose qu'il devrait y avoir un moyen plus facile de gérer leNA
problème, mais ne pouvait pas comprendre quelque chose d'intelligent.0
à l'expression évaluée dans l'if
instruction. Cependant, cela renvoie un avertissement lorsque le produit n'est pas égal à0
.n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(na.omit(c(!b%%sum(d)&!b%%prod(d),0)))i=i+1};b
el(...)
!Brachylog , 22 octets
Essayez-le en ligne!
Explication
la source
JavaScript (ES6), 78
Moins golfé
la source
Pyth, 18 octets
Essayez-le en ligne: Démonstration
Explication:
la source
JavaScript (ES6), 72 octets
Démo
Il a tendance à être lent pour des valeurs plus élevées, donc je le limite à 20 ici.
Afficher l'extrait de code
la source
Haskell,
94857271 octets1 indexé.
Merci à @Zgarb pour avoir économisé 13 octets!
Merci à @nimi d'avoir enregistré un octet!
la source
(==)=<<map(gcd n)$[sum k,product k]
devrait sauver quelques octets.[sum k,product k]
peut l'êtremap($read.pure<$>show n)[sum,product]
.([n|n<-[0..],(==)=<<map(gcd n)$[product,sum]<*>[read.pure<$>show n]]!!)
MATL , 21 octets
Long et inefficace ...
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (ES6), 70 octets
Cela s'est avéré un peu comme la réponse de @ Arnauld, mais la récursivité est apparemment plus courte de 2 octets. Fonctionne dans Chrome, bien qu'il soit très lent sur des entrées supérieures à 30 environ (50 prend 6 secondes).
la source
Python 2,
122110 octets1 indexé, vous devez utiliser un interpréteur Python avec une limite de récursivité assez élevée.
la source
Wonder, 33 octets
Zéro indexé. Usage:
Explication
Plus lisible:
Obtient fondamentalement une liste infinie de nombres divisibles par sa somme numérique et son produit en filtrant une liste infinie de nombres entiers à travers un prédicat. Ensuite, le
n
e élément est simplement choisi dans la liste.la source
Julia, 81 octets
Il s'agit d'une fonction anonyme qui accepte un entier et renvoie un entier. Pour l'appeler, donnez-lui un nom. L'approche est la plus évidente: vérifiez chaque nombre jusqu'à ce que nous ayons rencontré les
n
termes de la séquence. Laall
vérification est nécessaire pour s'assurer que nous n'obtenons pasDivisionError
de%
lorsque le produit des chiffres est 0.Non golfé:
Essayez-le en ligne! (inclut tous les cas de test)
la source
prod(d)
àp
ou quelque chose, puis en remplaçant leall(d.>0)
parp>0
. Et vous pouvez en enregistrer un autre en déplaçant le dei%sum(d)
l'autre côté du1
cadp<1>i%sum(d)
.C89,
381226195170169 octets1 indexé (mêmes réponses exactes que dans le défi).
Suppose 4 octets (32 bits)
int
(architectures les plus modernes) .Je crois sincèrement que cela ne peut pas être plus court.
La fonction
int g (int)
fuit la mémoire et accède à la mémoire non initialisée une fois par appel, mais ne fait pas de défaut et renvoie le bon numéro.Programme complet qui prend en entrée unaire (
./prog $(seq 1 10)
pour 10) avec non golfé (un peu):Ancienne réponse:
C99, 381 octets
Cela peut probablement être joué plus.
Programme complet:
la source
int
pour tout, car c'est le type entier par défaut.C, 110 octets
Non golfé et utilisation:
la source
Python3,
13480 octetsNouvelle version grâce à Flp.Tkc
Nouveau code, je me suis souvenu d'une façon golfique de faire le factorielLe code lui-même n'est pas très semblable au golf, plus comme le golf par force bruteg (x) est une fonction qui renvoie True si x correspond aux critères.
la source
<1
plutôt que==0
. Vous n'avez pas besoin de lais True
, le point d'une instruction if est de vérifier si la condition est vraie de toute façon. Vous pouvez utiliser le raccourci de backtick de Python 2 pourstr/repr
raser certains octets. Il y a aussi beaucoup d'espaces blancs inutiles ici.h+=g(str(k))
ajoute 1 si Vrai, 0 si Faux.x
(backtick) en Python 2 est le mêmerepr(x)
oustr(x)
en Python 3 :)PHP, 96 octets
Prend
n
comme argument de ligne de commande.Golfé
Non golfé
la source
PowerShell v2 +, 84 octets
Solution itérative. Prend l'entrée
$n
et entre dans unefor
boucle tant qu'elle$n
n'est pas nulle. À chaque itération, nous soustrayons$n
le résultat d'une instruction booléenne, détaillée ci-dessous:Ainsi, seulement si
$a%(sum)
et$a%(product)
sont tous deux égaux à zéro, l'addition sera également nulle, et donc le booléen-non sera vrai et sera donc$n
décrémenté.Une fois que nous sortons de la boucle (c'est-à-dire que nous frappons le nième terme), nous plaçons simplement
$a
sur le pipeline, et la sortie est implicite.Exemples
Remarque: Cela envoie un tas d'erreurs "Tentative de division par zéro" à STDERR, qui est ignoré par défaut. J'ai explicitement ajouté un
2>$null
à l'exemple ci-dessous pour nettoyer la sortie. Il est également assez lent une fois qu'il arrive à peu près à peu près30
, et50
prend environ 45 secondes sur ma machine.la source
BASH, 125 octets
la source