Задание 13

IP-адреса и маски

Типов: 6

01

Как распознать

Траектория должна пройти через заданное число.

02

Условие

Посчитать программы из 1 в 20 через 10, команды +1 и *2.

03

Разбор

Разбей путь на 1 -> 10 и 10 -> 20, затем перемножь количества.

04

Шаблон

template.py
def f(x,end):
    if x>end:return 0
    if x == end: return 1
    return f(x+1,end) + f(x*2,end)
print(f(1,10)*f(10,20))
01

Как распознать

Нужно пройти через 9 и не проходить через 12.

02

Условие

Посчитать программы из 2 в 19, команды +1, +2 и *3.

03

Разбор

Запрещённая точка возвращает 0, обязательная делит путь на два.

04

Шаблон

template.py
def f(x,end):
    if x>end:return 0
    if x==12:return 0
    if x == end: return 1
    return f(x+1,end) + f(x+2,end)+f(x*3,end)
print(f(2,9)*f(9,19))
01

Как распознать

Команды +1, +2, +3; траектория содержит 7.

02

Условие

Посчитать программы из 5 в 11 через 7.

03

Разбор

Перемножь количества путей на двух участках.

04

Шаблон

template.py
def f(x,end):
    if x>end:return 0
    if x==end:return 1
    return f(x+1,end)+f(x+2,end)+f(x+3,end)
print(f(5,7)*f(7,11))
01

Как распознать

Число уменьшается командами -2 и //2.

02

Условие

Посчитать программы из 32 в 1 через 14.

03

Разбор

Для убывающего процесса отсечение меняется на x < end.

04

Шаблон

template.py
def f(x,end):
    if x<end:return 0
    if x==end:return 1
    return f(x-2,end)+f(x//2,end)
print(f(32,14)*f(14,1))
01

Как распознать

Нужно пройти через 16 или 32, но не через обе.

02

Условие

Посчитать программы из 4 в 68, команды +3, +5, *2.

03

Разбор

Сложи пути через каждую точку, запрещая вторую.

04

Шаблон

template.py
def f(x,end):
    if x>end:return 0
    if x==end:return 1
    if x == 32:return 0
    return f(x+3,end)+f(x+5,end)+f(x*2,end)
def d(x,end):
    if x>end:return 0
    if x==16:return 0
    if x==end:return 1
    return d(x+3,end)+d(x+5,end)+d(x*2,end)
print(d(4,32)*d(32,68)+f(4,16)*f(16,68))
01

Как распознать

Убывающие команды разрешены не для каждого числа.

02

Условие

Посчитать программы из 1250 в 20 для -3, //3 и удаления последней цифры.

03

Разбор

Собери разрешённые переходы в список и сложи результаты.

04

Шаблон

template.py
def f(x,end):
    if x<end:return 0
    if x==end:return 1
    turns = []
    turns.append(f(x-3,end))
    if x%2 == 0:
        turns.append(f(x//3,end))
    if x >= 10:
        turns.append(f(x//10,end))
    return sum(turns)
print(f(1250,20))