Как дедушка решал задачку
Как я решал задачу из курса Python.
Предлагается следующая задача.
"Интересные числа"
На вход программе подаются два натуральных числа a и b. Напишите программу с использованием встроенной функции all() для обнаружения всех целых чисел в диапазоне [a;b], которые делятся на каждую содержащуюся в них цифру без остатка.
Как-то никак не хотели в старые мозги укладываться вот эти вот все filter(), lambda, all(), map().
Для начала, чтобы не вводить каждый раз границы диапазона, ввел две переменные - начальное и конечное значение диапазона 8 9 10 11 12 13 14 15 .
a = 8
b = 15
Далее, решил избавиться от чисел, содержащих 0, так как по условию задачи нужно проверить делимость числа на цифры, составляющие это число.
Примем, что:
- nn - это элемент в последовательности
- n - это цифра в элементе последовательности
Итак:
- для каждого числа nn в диапазоне от a до b:
-----если "0" нет в строковом представлении числа nn:
---------выводим nn
for nn in range(a, b+1):
if "0" not in str(nn) :
print(nn, end=' ')
---
8 9 11 12 13 14 15
Далее в получившейся последовательности нужно оставить только те числа, которые делятся на каждую содержащуюся в них цифру.
Можно, конечно, создать вложенный цикл, в котором проверялась бы делимость числа nn на составляющие это число цифры. Но можно эту проверку на делимость обернуть в функцию all()
all(nn % int(n) == 0 for n in str(nn))
В итоге получаем такую версию решения задачи, которая удовлетворяет условию решения задачи:
a = 8
b = 15
for nn in range(a, b + 1):
if "0" not in str(nn) and all(nn % int(n) == 0 for n in str(nn)):
print(nn, end=' ')
---
8 9 11 12 15
А теперь с уже готовым решением попробуем взлететь...
Нам нужно отфильтровать последовательность range(a, b + 1) таким образом, чтобы ней не было чисел, содержащих "0" и чтобы число делилось на все составляющие это число цифры.
var = filter(func_nn, range(a, b+1)), или var = filter(lambda nn, range(a, b+1)),
Небольшое отступление.
Если в уже написанной программе мы проверяли вхождение "0" в каждое число исходной последовательности, то в новом варианте фильтрующей функции func_nn мы этого делать не будем. Мы ведь будем перебирать цифры каждого числа последовательности и, если в числе есть цифра 0, то число не должно попасть в итоговую последовательность.
Мы будем передавать в func_nn каждый элемент исходной последовательности.
Критерии фильтрации элементов последовательности:
- элемент не содержит нулей (n!=0);
- элемент делится без остатка на все цифры, из которых этот элемент состоит (nn % n == 0).
В итоговую последовательность попадут только те элементы, для которых func_nn вернет значение True. А собственно критерии фильтрации мы реализуем в еще одной функции func_n, то есть внутри функции func_nn у нас появится func_n(n != 0 and nn % n == 0).
Поскольку мы будем проверять каждый элемент nn последовательности, проверку (func_n) обернем в функцию map()_1.
map(lambda n: n != 0 and nn % n == 0, "последовательность"). Здесь "последовательность" - это цифры n в числе nn
Для формирования "последовательности" воспользуемся функцией map_2
map(int, str(nn)).
Функция, проверяющая числа на соблюдение критериев фильтрации, должна возвращать True при соблюдении всех критериев фильтрации. Для это обернем функцию проверки (func_n) в функцию all().
В итоге у нас получится следующая конструкция:
var = (*filter(
lambda nn: all(map(lambda n: n != 0 and nn % n == 0, map(int, str(nn)))),
range(a, b + 1)))
Заменим var= на print и получим решение задачи.
Поскольку функция all() возвращает значение True, если все критерии проверки внутри функции истинны (приводятся к значению True), отпадает необходимость в записи n!=0. Достаточно просто передать в all() значение n. Ведь если n=0, то all() вернет False и элемент последовательности не попадет итоговую последовательность.
Аналогично проверку nn % n == 0 можно заменить на not nn % n
Вот что получилось в итоге:
a = int(input())
b = int(input())
print(*filter(
lambda nn: all(map(lambda n: n and not nn % n, map(int, str(nn)))),
range(a, b + 1)))
Программирование на python
1K постов12K подписчиков
Правила сообщества
Публиковать могут пользователи с любым рейтингом. Однако!
Приветствуется:
• уважение к читателям и авторам
• конструктивность комментариев
• простота и информативность повествования
• тег python2 или python3, если актуально
• код публиковать в виде цитаты, либо ссылкой на специализированный сайт
Не рекомендуется:
• допускать оскорбления и провокации
• распространять вредоносное ПО
• просить решить вашу полноценную задачу за вас
• нарушать правила Пикабу