August 19, 2021

Разбор задачи 17

Канал авторов: телеграм (кликабельно)
Начальные знания: ЯП, 17 задание

Текст задачи:

Источник: https://vk.com/ege_info_open

Задача может показаться тривиальной, если вы уже достаточно много решили похожих заданий, но ее прелесть в интересном диапазоне и постепенным улучшением кода. Разберем несколько версий программы

Первая версия

Создаем счетчики и переменные k (для кол-ва), mn (для минимума), mx (для максимума). Обнулим счетчик. А максимуму и минимуму зададим недостижимые значения по такому правилу:

Если ищем минимум, присваиваем максимум
Если ищем максимум, присваиваем минимум

И это логично: как мы найдем максимум в диапазоне, если текущая переменная и так больше всех чисел?

k = 0
mn = 10**10
mx = 0

Определимся с диапазоном. Так как python не позволяет создавать объединенный диапазон с помощью range, исхитримся и создадим два отдельных, а затем объединим. Например, так как в коде ниже:

our_range = list(range(2048, 8192+1)) + list(range(12048, 18192+1))

Важно отметить, что я оборачиваю range в list, потому что иначе невозможна конкатенация (объединение) нескольких диапазонов.
Прибавлять 1 к диапазону в правой границе нужно для включения числа в диапазон, так как в языке исходно в range правая граница не включена.

Пробежимся по новому диапазону и отыщем нужные по условию числа:

for n in our_range:
    if (n % 7 == 0 and n %11 != 0 and n % 23 != 0) and (n % 10 != 8):        
        k += 1        
        mx = max(mx, n)        
        mn = min(mn, n)

Замечу, что чтобы узнать последнюю цифру числа в десятичной СС, нужно взять остаток от деления на 10 от нашего числа. Именно это мы и проверяем в последней части условия.

Дальше остается только вывести ответ:

print(k, mx-mn)

Весь код:

k = 0
mn = 10**10
mx = 0
our_range = list(range(2048, 8192+1)) + list(range(12048, 18192+1))
for n in our_range:
    if (n % 7 == 0 and n %11 != 0 and n % 23 != 0) and (n % 10 != 8):        
        k += 1        
        mx = max(mx, n)        
        mn = min(mn, n)
print(k, mx-mn)

Вторая версия

Вынесем условие в отедельную функцию:

def is_good(n):
    return n%7==0 and n%11!=0 and n%23!=0 and (n % 10 != 8)

Весь код:

def is_good(n):
    return n%7==0 and n%11!=0 and n%23!=0 and (n % 10 != 8)
k = 0
mn = 10**10
mx = 0
our_range = list(range(2048, 8192+1)) + list(range(12048, 18192+1))
for n in our_range:
    if is_good(n):        
        k += 1        
        mx = max(mx, n)        
        mn = min(mn, n)
print(k, mx-mn)

Уже симпатичнее.

Третья версия

Избавляемся от лишних переменных, создавая отобраный по условию из функции диапазон.

Весь код:

def is_good(n):
    return n%7==0 and n%11!=0 and n%23!=0 and (n % 10 != 8)

our_range = list(range(2048, 8192+1)) + list(range(12048, 18192+1))
answer = [n for n in our_range if is_good(n)ъ        
        
print(len(answer), max(answer) - min(answer))

Здесь используется генератор списка. Подробнее в официальной документации и в статье по 17ым задачам.


Канал авторов: телеграм