Dilemme du disarium
Un Disarium est défini comme un nombre dont:
la somme de ses chiffres alimentés avec leur position respective est égale au nombre d'origine
Votre tâche :
Vous avez une étrange obsession pour les nombres classés comme étant un disarium. La nécessité de suivre les voies du disarium est si grande en vous que vous refusez de lire les pages non numérotées d'un disarium dans un livre donné. Vous avez deux gros problèmes:
- Votre professeur vient de vous confier la lecture de votre manuel de page
n
en pagem
- La semaine dernière, vous vous êtes vraiment cogné la tête et vous n'arrivez pas à vous souvenir comment déterminer par programme si un nombre est considéré comme un disarium.
Le temps presse, le code permettant de déterminer les pages à lire doit être le plus court possible.
Vous devez identifier tout le disarium dans une plage inclusive de n
travers m
.
Exemples de disarium :
89 = 8 1 + 9 2
135 = 1 1 + 3 2 + 5 3
518 = 5 1 + 1 2 + 8 3
Il s'agit de code-golf, donc le moins d'octets gagne!
Voici la séquence complète de A032799 .
n
etm
? Il y a un très grand disarium (12157692622039623539), les réponses devraient-elles pouvoir l'identifier?Réponses:
Perl 6 ,
4039 octetsEssayez-le en ligne!
Comment ça marche
la source
Python2,
98898884 octetsHorrible. Va raccourcir.Commencer à mieux paraîtreVoici ma tentative récursive (86 octets):
Merci à @Rod pour avoir économisé 4 octets!
range
àenumerate
et ainsi de suite.la source
enumerate
, vous pouvez utiliser à laint(n)
placeint(`x`[p])
Perl, 43 octets
Essayez-le en ligne!
Regex est vraiment puissant, vous les gars.
Explication
La première chose que le code fait est de lire deux entiers comme entrée via
<>
et crée une plage du premier au second avec..
. Il utilise ensuite la normemap
fonction pour itérer cette gamme, et applique le code suivant à chaque valeur:say if$_==eval s/./+$&**$+[0]/gr
. Cela ressemble à du charabia, et c'est en quelque sorte le cas, mais voici ce qui se passe vraiment.map
stocke implicitement sa valeur actuelle dans la variable$_
. De nombreuses fonctions et opérations perl utilisent cette valeur lorsqu'aucune n'est indiquée. Cela inclut les expressions régulières, telles que l's///
opérateur de substitution.Une expression régulière de substitution se compose de quatre parties:
=~
est utilisé pour appliquer une expression régulière à une chaîne, mais si cet opérateur est absent, alors l'expression régulière est appliquée à la variable implicite$_
, qui contient notre numéro actuel via lamap
fonction..
. En fait, nous capturons chaque chiffre individuel.+
suivi d'une expression mathématique, mélangée à des variables Perl magiques qui facilitent considérablement le tout.La variable scalaire spéciale
$&
contient toujours l'intégralité de la dernière capture regex réussie, qui dans ce cas est un seul chiffre. La variable spéciale de tableau@+
contient toujours une liste de décalages post - match pour la dernière correspondance réussie, c'est-à-dire l'index du texte après la correspondance.$+[0]
est l'index$_
du texte suivant immédiatement$&
. Dans le cas de135
, nous capturons le chiffre1
et l'index135
du texte immédiatement après (à savoir,35
) est 1, qui est notre exposant. Donc, nous voulons élever$&
(1) à la puissance de$+[0]
(1) et obtenir 1. Nous voulons élever 3 à la puissance de 2 et obtenir 9. Nous voulons élever 5 à la puissance de 3 et obtenir 125.Si l'entrée était
135
, la chaîne résultante est+1**1+3**2+5**3
./g
et/r
./g
dit à l'interprète de continuer les remplacements une fois le premier trouvé (sinon nous finirions avec+1**135
)./r
indique à l'interpréteur de ne pas modifier la chaîne d'origine et de renvoyer à la place ce que serait la chaîne après les remplacements. Ceci est important, car sinon, il écraserait$_
et nous en avons besoin à des fins de comparaison.Une fois la substitution complète effectuée, nous obtenons une expression mathématique, qui est évaluée avec la
eval
fonction.+1**1+3**2+5**3
est évalué dans1 + 9 + 125 = 135
, qui est comparé au nombre d'origine135
. Puisque ces deux sont égaux, le code imprime le nombre.la source
map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
"@+"
est 1 octet plus court que$+[0]
:)JavaScript (ES7),
10591898883798281 octetsMerci à Arnauld pour avoir économisé 20B et à ETHProductions pour avoir économisé 6B!
Usage
Assignez la fonction à une variable et donnez-lui le minimum et le maximum comme arguments. Exemple:
Sortie
Golf supplémentaire
Cela semble assez bien joué, mais il y a toujours place à amélioration ... Je pense.
la source
d**(e+1)
pourd**-~e
sauver deux octets.&
place de&&
. Un octet de plus à faire ...JavaScript (Firefox 52+), 68 octets
Fonction récursive qui sort via
alert
. Fonctionne dans Developer Edition de Firefox, que vous pouvez télécharger sur cette page . Les versions précédentes de Firefox ne prennent pas en charge l'**
opérateur, et aucun autre navigateur ne prend en charge la[for(a of b)c]
syntaxe.Extrait de test
Cela utilise
.map
au lieu d'une compréhension de tableau, etMath.pow
au lieu de**
, il devrait donc fonctionner dans tous les navigateurs qui prennent en charge ES6.Afficher l'extrait de code
la source
05AB1E , 12 octets
Enregistré 2 octets grâce à Emigna
Essayez-le en ligne!
la source
ŸvygLySmOyQ—
devrait fonctionner pour 12 octets.Python 3, 100 octets
Pas l'approche la plus courte, mais plutôt mignonne. Il y a infiniment de disariums; voir la page OEIS pour une belle preuve. Ce sont tous.
la source
R, 100 octets
Fonction sans nom qui prend
n
etm
. Comme toujours dans R, la division d'entiers en un vecteur numérique est fastidieuse et consomme beaucoup d'octets. Cela rend la fonction relativement lente et ne fonctionne que pour les entiers 32 bits.la source
Gelée , 11 octets
Essayez-le en ligne!
Je suis passé de 16 à 11, avec l'aide de @miles!
Explication:
la source
J
pour obtenir des indices. Un moyen plus court pourrait êtreD*J$S⁼
de combiner vos deux liens en un seulCJam , 23 octets
Essayez-le en ligne!
Explication
la source
05AB1E , 18 octets
Essayez-le en ligne!
la source
Python 2.X, 92 octets
la source
(i+1)
, mais ce n'est pas un problème, quand on se débarrasse des parenthèses en faisant-~i
.list('k')
, ce que je n'ai pas. Cependant, vous pouvez toujours supprimer les espaces :)Python 2 , 84 octets
Une approche programme complète, actuellement de la même longueur que la solution lambda.
Essayez-le en ligne!
la source
input()
. Très agréable! +1.Japt, 15 octets
Testez-le en ligne! C'était une collaboration entre @obarakon et moi.
Comment ça marche
Dans la dernière version de Japt,
x
accepte une fonction comme argument, ce qui nous permet de jouer un autre octet au golf:Testez-le en ligne!
la source
Clojure, 107 octets
La mise en œuvre de l'équation est terriblement longue.
la source
(.pow(-(int v)48M)
TI-Basic, 85 octets
la source
int(log(
chaque numéro et ensuite faire les pouvoirs. C'est peut-être plus court, mais j'en doute.FUNC
mode et la fenêtre doit être configurée pour inclure votre point d'entrée. Cela ne me semble pas assez portable.FUNC
mode, bien que je vois ce que vous dites sur la résolution d'entrée. Mais, cette méthode est assez courante dans le golf. Vous pourriez toujours à laPrompt X,Y
place.Haskell, 61 octets
Exemple d'utilisation
5 # 600
->[5,6,7,8,9,89,135,175,518,598]
.Vérifiez chaque numéro
i
de la plage[n..m]
. Les chiffres sont extraits en se transformanti
en chaîne (show
) et en faisant de chaque caractère une chaîne à un élément (pure
) qui est à nouveau transformée en entier (read
). Compressez ces chiffres par élément[1..]
via la fonction^
et prenez lesum
.la source
PHP,
929188 octets3 octets enregistrés grâce à @AlexHowansky
prend l'entrée des arguments de la ligne de commande; imprime une virgule de fin. Courez avec
-r
.la source
for([,$n,$m]=$argv;$n<=$m;
"$n"[index]
et"_$n"[index]
produire erreurs d'analyse tout"89"[index]
et$s="$n";$s[index]
sont parfaitement bien.("_$n")[index]
Mathematica, 59 octets
Fonction sans nom prenant deux arguments entiers et renvoyant une liste d'entiers.
(d=IntegerDigits@#)^Range@Length@d
produit la liste des chiffres d'un nombre aux puissances appropriées;Tr[...]==#
détecte si la somme de ces puissances numériques est égale au nombre d'origine.la source
MATLAB,
8873 octetsRéponse originale:
num2str(n)-'0'
divise an
en un vecteur de ses chiffres et1:floor(log10(n))+1
est un vecteur contenant un au nombre de chiffres den
. Merci de vous connecter pour le golf à une fonction anonyme, économisant 15 octets.la source
Haskell ,
82 7675 octetsEssayez-le en ligne! Usage:
5 ! 175
Ce vérifie chaque numéro dans la gamme
n
dem
si son numéro de disarium et est donc assez lent pour le grandm
.Version plus rapide: (93 octets)
Essayez-le en ligne!
la source
C (gcc) , 136 octets
En-tête définissant pow sur TIO car pour une raison quelconque, il n'inclut pas automatiquement pow. Mon ordinateur l'a fait, donc je vais rouler avec ça.
Essayez-le en ligne!
la source
MATL , 16 octets
Essayez-le en ligne!
la source
Lot, 115 octets
Batch n'a qu'une arithmétique 32 bits qui n'a aucun moyen de comparer le dernier numéro de disarium, mais si vous insistez sur les comparaisons de chaînes, alors pour 402 octets:
la source
Python 2, 100 octets
Je n'ai pas encore eu l'occasion de faire ça (en faisant ça sur mon téléphone).
la source
sum
.i
trouve un Disarium. Je ne sais pas si cela est autorisé, mais je dirais non, car la sortie devient très vide.Scala,
132129 octets129 edit: Changer le nom de variable de la boucle for de
&
ài
trois espaces enregistrés.Explication
Pour chaque valeur dans la plage d'entrée:
+""
zipWithIndex
pour produire une liste de tuples contenant un caractère du chiffre et son indexcommentaires
Enfin, j'ai appris à travailler
fold
et àzipWithIndex
travailler. Je ne suis pas satisfait desint
conversions, mais je suis satisfait de la brièveté defold
etzipWithIndex
.la source
Octave,
8887 octetsMerci à MattWH d'avoir sauvé un octet (f (x) -48 vs f (x) - '0')
Courir:
Explication
la source
C
175169 octetsVersion non-golfée:
Peut être raccourci d'une certaine manière, mais je ne le vois pas pour le moment.
@TuukkaX Merci d'avoir économisé 6 octets.
la source
n!=0
peuvent être remplacés parn
.Java
Explication
la source
Python 3: 131 octets
Après avoir créé ce code, il est devenu évident qu'il existe un nombre limité de disariums, il pourrait donc être plus faisable de les vérifier explicitement plutôt que d'utiliser autant de compréhension de liste, ce qui est difficile pour les grandes entrées de cette solution.
Essayez-le en ligne!
la source