Perl, 43 Bytes
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
Probieren Sie es online!
Regex ist wirklich mächtig, Leute.
Erläuterung
Der Code liest zunächst zwei Ganzzahlen als Eingabe über <>und erstellt mit einen Bereich von der ersten zur zweiten ... Es verwendet dann die mapStandardfunktion Iterierte durch diesen Bereich und wendet den folgenden Code auf jeden Wert: say if$_==eval s/./+$&**$+[0]/gr. Das sieht nach Kauderwelsch aus und ist es auch, aber hier ist, was wirklich passiert.
mapspeichert implizit seinen aktuellen Wert in der Variablen $_. Viele Perl-Funktionen und -Operationen verwenden diesen Wert, wenn keiner angegeben ist. Dies schließt reguläre Ausdrücke wie den s///Substitutionsoperator ein.
Ein Substitutionsregex besteht aus vier Teilen:
- Zu manipulierende Zeichenfolge. Normalerweise wird der Operator
=~verwendet, um einen regulären Ausdruck auf einen String anzuwenden. Fehlt dieser Operator jedoch, wird der reguläre Ausdruck auf die implizite Variable angewendet, die $_über die mapFunktion unsere aktuelle Nummer enthält .
- Zeichenfolge, nach der gesucht werden soll. In diesem Fall suchen wir nach einem einzelnen Nicht-Zeilenumbruch-Zeichen, das durch den Platzhalter gekennzeichnet ist
.. Tatsächlich erfassen wir jede einzelne Ziffer.
- Zeichenfolge, durch die ersetzt werden soll. Wir ersetzen ein Pluszeichen,
+gefolgt von einem mathematischen Ausdruck, gemischt mit einigen magischen Perl-Variablen, die alles erheblich vereinfachen.
Die spezielle skalare Variable $&enthält immer die Gesamtheit der letzten erfolgreichen Regex-Erfassung, in diesem Fall eine einzelne Ziffer. Die spezielle Array-Variable @+enthält immer eine Liste der Postmatch-Offsets für die letzte erfolgreiche Übereinstimmung, dh den Index des Texts nach der Übereinstimmung. $+[0]ist der Index im $_unmittelbar folgenden Text $&. Im Fall von 135erfassen wir die Ziffer 1und der Index im 135Text unmittelbar danach (nämlich 35) ist 1, was unser Exponent ist. Also wollen wir $&(1) auf die Potenz von $+[0](1) erhöhen und 1 bekommen. Wir wollen 3 auf die Potenz von 2 erhöhen und 9 bekommen. Wir wollen 5 auf die Potenz von 3 erhöhen und 125 bekommen.
Wenn die Eingabe war 135, ist die resultierende Zeichenfolge +1**1+3**2+5**3.
- Regex-Änderungsflags. Hier verwenden wir zwei Regex-Flags -
/gund /r. /gWeist den Interpreter an, die Ersetzungen fortzusetzen, nachdem der erste gefunden wurde (andernfalls würden wir am Ende mit enden +1**135). /rWeist den Interpreter an, die ursprüngliche Zeichenfolge nicht zu ändern und stattdessen die Zeichenfolge zurückzugeben, die nach den Ersetzungen verwendet werden soll. Dies ist wichtig, da es sonst überschreiben würde $_und wir es zu Vergleichszwecken benötigen.
Sobald die gesamte Substitution abgeschlossen ist, erhalten wir einen mathematischen Ausdruck, der mit der evalFunktion ausgewertet wird . +1**1+3**2+5**3ausgewertet wird 1 + 9 + 125 = 135, die mit der ursprünglichen Nummer verglichen wird 135. Da diese beiden gleich sind, gibt der Code die Nummer aus.