Perl, 43 bajty
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
Wypróbuj online!
Regex jest naprawdę potężny.
Wyjaśnienie
Pierwszą rzeczą, jaką robi kod, jest odczytanie dwóch liczb całkowitych na wejściu <>i utworzenie zakresu od pierwszej do drugiej za pomocą ... Następnie wykorzystuje standardową mapfunkcję iterację tego zakresu, i stosuje następujący kod do każdej wartości: say if$_==eval s/./+$&**$+[0]/gr. To wygląda jak bełkot i tak jest, ale oto, co się naprawdę dzieje.
mapniejawnie przechowuje swoją bieżącą wartość w zmiennej $_. Wiele funkcji i operacji Perla używa tej wartości, gdy nie podano żadnej. Obejmuje to wyrażenia regularne, takie jak s///operator podstawienia.
Wyrażenie zastępcze składa się z czterech części:
- Ciąg do manipulowania. Zwykle operator
=~jest stosowany do stosowania wyrażenia regularnego do łańcucha, ale jeśli ten operator jest nieobecny, to wyrażenie regularne jest stosowane do zmiennej niejawnej $_, która zawiera naszą bieżącą liczbę za pośrednictwem mapfunkcji.
- Ciąg do wyszukania. W tym przypadku szukamy dowolnego znaku nieliniowego oznaczonego symbolem wieloznacznym
.. W efekcie przechwytujemy każdą pojedynczą cyfrę.
- Ciąg do zastąpienia. Zastępujemy znak plus,
+po którym następuje wyrażenie matematyczne, połączone z pewnymi magicznymi zmiennymi Perla, które znacznie ułatwiają wszystko.
Specjalna zmienna skalarna $&zawsze zawiera całość ostatniego udanego przechwytywania wyrażenia regularnego, która w tym przypadku jest pojedynczą cyfrą. Specjalna zmienna tablicowa @+zawsze zawiera listę przesunięć pocztowych dla ostatniego udanego dopasowania, tj. Indeks tekstu po dopasowaniu. $+[0]jest indeksem $_tekstu bezpośrednio po nim $&. W przypadku 135, przechwytujemy cyfrę 1, a indeks w 135tekście zaraz potem (mianowicie 35) wynosi 1, co jest naszym wykładnikiem. Chcemy więc podnieść $&(1) do potęgi $+[0](1) i uzyskać 1. Chcemy podnieść 3 do potęgi 2 i uzyskać 9. Chcemy podnieść 5 do potęgi 3 i uzyskać 125.
Jeśli dane wejściowe były 135, wynikowy ciąg to +1**1+3**2+5**3.
- Flagi modyfikujące Regex. Tutaj używamy dwóch flag wyrażeń regularnych -
/gi /r. /gmówi tłumaczowi, aby kontynuował zastępowanie po znalezieniu pierwszego (w przeciwnym razie byśmy mieli +1**135). /rmówi interpreterowi, aby nie modyfikował oryginalnego ciągu znaków , a zamiast tego zwraca ciąg znaków po zamianach. Jest to ważne, ponieważ w przeciwnym razie nadpisze $_i potrzebujemy go do celów porównawczych.
Po zakończeniu całego podstawienia otrzymujemy wyrażenie matematyczne, które jest oceniane za pomocą evalfunkcji. +1**1+3**2+5**3jest obliczany na 1 + 9 + 125 = 135, który jest porównywany z pierwotnym numerem 135. Ponieważ te dwa są równe, kod wypisuje liczbę.