9

Как дедушка решал задачку

Как я решал задачу из курса 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)))

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества