Perl, 43 байти
map{say if$_==eval s/./+$&**$+[0]/gr}<>..<>
Спробуйте в Інтернеті!
Ви, хлопці, Regex справді потужний.
Пояснення
Перше, що робить код - це прочитати два цілих числа як вхід через <>, і створює діапазон від першого до другого за допомогою ... Потім він використовує стандартну mapфункцію для перебору цього діапазону, і застосовує наступний код для кожного значення: say if$_==eval s/./+$&**$+[0]/gr. Це схоже на хитрість, і це все-таки є, але ось що насправді відбувається.
mapнеявно зберігає своє поточне значення у змінній $_. Багато функцій та операцій perl використовують це значення, коли жодна не задана. Сюди входять регулярні вирази, такі як s///оператор заміни.
До регексу заміщення є чотири частини:
- Рядок маніпулювати. Зазвичай оператор
=~використовується для застосування регулярного вираження до рядка, але якщо цей оператор відсутній, то регулярний вираз застосовується до неявної змінної $_, яка містить наше поточне число черезmap функцію.
- Рядок пошуку. У цьому випадку ми шукаємо будь-який єдиний символ, що не є новим рядком, позначається символом підстановки
.. Насправді ми фіксуємо кожну окрему цифру.
- Рядок для заміни на. Ми підміняємо знак плюс, який
+супроводжується математичним виразом, змішаним з деякими магічними змінними Perl, що значно полегшує все.
Спеціальна скалярна змінна $&завжди містить всю останню вдалу зйомку регулярних виразів, яка в даному випадку є однозначною. Спеціальна змінна масив @+завжди містить список компенсацій після матчу за останній успішний матч, тобто індекс тексту після матчу. $+[0]- це індекс $_тексту, що знаходиться безпосередньо за ним $&. У випадку з цим 135ми фіксуємо цифру 1, а індекс 135тексту відразу після цього (а саме 35) дорівнює 1, що є нашим показником. Отже, ми хочемо підняти $&(1) до влади$+[0] (1) і отримати 1. Ми хочемо підняти 3 до сили 2 і отримаємо 9. Ми хочемо підняти 5 до сили 3 і отримати 125.
Якщо вхід був 135, отриманий рядок є +1**1+3**2+5**3.
- Прапори, що змінюють Regex. Тут ми використовуємо два прапори регулярних виразів -
/gі /r. /gвказує інтерпретатору продовжувати заміни після того, як буде знайдена перша (інакше ми б закінчилися +1**135). /rвказує інтерпретатору не змінювати початковий рядок , а замість цього повертати те, що було б після рядків. Це важливо, тому що в іншому випадку воно буде переписане $_, і нам це потрібно для порівняння.
Після того, як виконана вся підміна, ми отримуємо математичний вираз, який оцінюється за допомогою evalфункції. +1**1+3**2+5**3оцінюється в 1 + 9 + 125 = 135, що порівнюється з початковим числом 135. Оскільки ці два рівні, код друкує число.