Perl, 43 octets
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
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 norme map
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:
- Chaîne à manipuler. Normalement, l'opérateur
=~
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 la map
fonction.
- Chaîne à rechercher. Dans ce cas, nous recherchons n'importe quel caractère non nouveau de ligne, indiqué par le caractère générique
.
. En fait, nous capturons chaque chiffre individuel.
- Chaîne à remplacer. Nous remplaçons un signe plus
+
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 de 135
, nous capturons le chiffre 1
et l'index 135
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
.
- Indicateurs de modification des expressions rationnelles. Ici, nous utilisons deux drapeaux d'expression régulière -
/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é dans 1 + 9 + 125 = 135
, qui est comparé au nombre d'origine 135
. Puisque ces deux sont égaux, le code imprime le nombre.