Задание 13
IP-адреса и маски
Типов: 6
Как распознать
Траектория должна пройти через заданное число.
Условие
Посчитать программы из 1 в 20 через 10, команды +1 и *2.
Разбор
Разбей путь на 1 -> 10 и 10 -> 20, затем перемножь количества.
Шаблон
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))Как распознать
Нужно пройти через 9 и не проходить через 12.
Условие
Посчитать программы из 2 в 19, команды +1, +2 и *3.
Разбор
Запрещённая точка возвращает 0, обязательная делит путь на два.
Шаблон
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))Как распознать
Команды +1, +2, +3; траектория содержит 7.
Условие
Посчитать программы из 5 в 11 через 7.
Разбор
Перемножь количества путей на двух участках.
Шаблон
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))Как распознать
Число уменьшается командами -2 и //2.
Условие
Посчитать программы из 32 в 1 через 14.
Разбор
Для убывающего процесса отсечение меняется на x < end.
Шаблон
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))Как распознать
Нужно пройти через 16 или 32, но не через обе.
Условие
Посчитать программы из 4 в 68, команды +3, +5, *2.
Разбор
Сложи пути через каждую точку, запрещая вторую.
Шаблон
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))Как распознать
Убывающие команды разрешены не для каждого числа.
Условие
Посчитать программы из 1250 в 20 для -3, //3 и удаления последней цифры.
Разбор
Собери разрешённые переходы в список и сложи результаты.
Шаблон
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))