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
. Оскільки ці два рівні, код друкує число.