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ą map
funkcję 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.
map
niejawnie 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 map
funkcji.
- 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 135
tekś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 -
/g
i /r
. /g
mówi tłumaczowi, aby kontynuował zastępowanie po znalezieniu pierwszego (w przeciwnym razie byśmy mieli +1**135
). /r
mó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ą eval
funkcji. +1**1+3**2+5**3
jest obliczany na 1 + 9 + 125 = 135
, który jest porównywany z pierwotnym numerem 135
. Ponieważ te dwa są równe, kod wypisuje liczbę.