23.06 Количество программ из A в B где траектория вычислений N команда
Ошибка.
Попробуйте повторить позже
Исполнитель Щелчок преобразует число на экране. У исполнителя есть три команды:
1. Вычесть
2. Вычесть
3. Поделить на , если число четное
Программа для исполнителя — это последовательность команд.
Сколько существует программ, для которых при исходном числe результатом является число , при этом программа содержит команд?
Решение 1 (Рекурсия)
def f(st, fn, count, end_count): if st == fn and count == end_count: return 1 if st < fn or count > end_count: # если счетчик перешел максимальное # значение, то прекращаем считать return 0 x = f(st // 2, fn, count + 1, end_count) * (st % 2 == 0) y = f(st - 3, fn, count + 1, end_count) z = f(st - 1, fn, count + 1, end_count) return x + y + z print(f(33, 12, 0, 9))
Решение 2 (Динамика)
a = [33] for i in range(9): n = len(a) for j in range(n): k = a.pop(0) if k > 12: a.append((k // 2) * (k % 2 == 0)) a.append(k - 3) a.append(k - 1) print(a.count(12))
Ошибка.
Попробуйте повторить позже
Исполнитель Щелчок преобразует число на экране. У исполнителя есть три команды:
1. Поделить на 2, если число четное
2. Прибавить 1
3. Прибавить треть числа, если число кратно трем
Программа для исполнителя — это последовательность команд.
Сколько существует программ, для которых при исходном числe 1 результатом является число 60, при этом программа содержит 25 команд, при этом одно и то же число не может встречаться несколько раз в траектории вычислений исполнителя. Исполнителю также нельзя посещать начальное значение.
Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 122 при исходном числе 6 траектория будет состоять из чисел 3, 4, 5.
Решение 1
def f(st, fn, cmd, a): if st in a or cmd > 25: return 0 if st == fn and cmd == 25: return 1 a.add(st) x, y, z = 0, 0, 0 if st % 2 == 0: x = f(st // 2, fn, cmd + 1, a.copy()) y = f(st + 1, fn, cmd + 1, a.copy()) if st % 3 == 0: z = f(st + st // 3, fn, cmd + 1, a.copy()) return x + y + z
Решение 2
В соавторстве с марафонцем
Примечание: при добавлении в массив b элементов массива a используется символ *, чтобы добавить в массив именно элементы массива а, а не создать дополнительную вложенность массивов. Например: есть массив a = [1, 2, 3]. Если выполнить операцию b.append([a, 4]), то массив b = [[[1, 2, 3], 4]]. Если выполнить b.append([*a, 4]), то массив b = [[1, 2, 3, 4]].
paths = [[1]] for i in range(25): new_paths = [] for path in paths: x = path[-1] if x % 2 == 0: if x // 2 not in path: new_paths.append([*path, x//2]) if x % 3 == 0: if x + x // 3 not in path: new_paths.append([*path, x + x//3]) if x + 1 not in path: new_paths.append([*path, x+1]) paths = new_paths.copy() ans = 0 k = [] for path in paths: if path[-1] == 60: k.append(path) ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Исполнитель Щелчок преобразует число на экране. У исполнителя есть три команды:
1. Поделить на 2, если число четное
2. Прибавить 1
3. Прибавить треть числа, если число кратно трем
Программа для исполнителя — это последовательность команд.
Сколько существует программ, для которых при исходном числe 1 результатом является число 60, при этом программа содержит 25 команд, при этом одно и то же число может встречаться несколько раз в траектории вычислений исполнителя.
Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 12223 при исходном числе 6 траектория будет состоять из чисел 3, 4, 5, 6, 8.
Решение 1 (Рекурсия)
from functools import lru_cache # программа будет долго считать, если # не хранить результаты в кэше @lru_cache(None) def f(st, fn, count, end_count): if st == fn and count == end_count: return 1 if count > end_count: return 0 x = f(st // 2, fn, count + 1, end_count) * (st % 2 == 0) y = f(st + 1, fn, count + 1, end_count) z = f(st + st // 3, fn, count + 1, end_count) * (st % 3 == 0) return x + y + z print(f(1, 60, 0, 25))
Решение 2 (Динамика)
ans = [] ans.append(1) for operations in range(25): can_get = [] for i in ans: if i % 2 == 0: can_get.append(i // 2) can_get.append(i + 1) if i % 3 == 0: can_get.append(i + i // 3) ans = can_get print(ans.count(60))
Ошибка.
Попробуйте повторить позже
Исполнитель преобразует число на экране. У него есть три команды, которым присвоены номера:
1. Прибавить 1
2. Прибавить 4
3. Умножить на 2
Программа для исполнителя – это последовательность команд. Сколько существует программ, которые состоят из 7 команд и при исходном числе 3 результатом является 27?
def f(a,c):#В данной функции у нас будет два параметра: а - изменяемое число, с - количество команд. #При каждом изменении числа а мы будем увеличивать c if c == 7:#Если количество команд равняется 7,то мы возвращаем 1 или 0 в зависимости от того,равна ли а 27 или нет return a == 27 return f(a+1,c+1)+f(a+4,c+1)+f(a*2,c+1) print(f(3,0))
Ошибка.
Попробуйте повторить позже
Гусь преобразует число, записанное на экране. У гуся есть три команды, которым присвоены номера:
1. Прибавь 4
2. Прибавь 7
3. Раздели нацело на 2
Первая команда увеличивает число на экране на 4, вторая увеличивает его на 7, третья делит на 2 нацело (остаток отбрасывается). Программа для исполнителя – это последовательность команд. Сколько существует программ, которые состоят из 10 команд и при исходном числе 1 результатом является 1?
a = [1] for i in range(10): n = len(a) for j in range(n): l = a.pop(0) a.append(l + 4) a.append(l + 7) a.append(l // 2) print(a.count(1))
Ошибка.
Попробуйте повторить позже
Исполнитель Щелчок преобразует число, записанное на доске. У Щелчка есть две команды:
1. Вычесть 1
2. Умножить на (-2)
Первая команда уменьшает число на 1, вторая команда умножает его на (–2). Сколько различных неотрицательных результатов можно получить из исходного числа 245 в ходе исполнения программы, содержащей ровно 16 команд?
a = [245] for i in range(16): a = list(set(a)) n = len(a) for j in range(len(a)): l = a.pop(0) a.append(l - 1) a.append(l * (-2)) a = list(set(a)) print(len([j for j in a if j >= 0]))
Ошибка.
Попробуйте повторить позже
Исполнитель Щелчок преобразует число, записанное на экране. У исполнителя есть три команды, которым присвоены номера:
1. Прибавить 2.
2. Прибавить 5.
3. Умножить на 2.
Первая команда увеличивает число на 2, вторая – на 5, третья – умножает на 2. Сколько различных результатов можно получить из исходного числа 8 после выполнения программы, содержащей 13 команд, если известно, что запрещено повторять команду, сделанную на предыдущем шаге.
Решение 1:
a = [[8, ’0’]] for i in range(13): n = len(a) for j in range(n): l = a.pop(0) last_command = l[1] if last_command == ’0’: a.append([l[0] + 2, ’1’]) a.append([l[0] + 5, ’2’]) a.append([l[0] * 2, ’3’]) elif last_command == ’1’: a.append([l[0] + 5, ’2’]) a.append([l[0] * 2, ’3’]) elif last_command == ’2’: a.append([l[0] + 2, ’1’]) a.append([l[0] * 2, ’3’]) else: a.append([l[0] + 2, ’1’]) a.append([l[0] + 5, ’2’]) arr = set() for i in range(len(a)): arr.add(a[i][0]) print(len(arr))
Решение 2:
s = set() def f(a, k=0, r=0): if k == 13: s.add(a) return if r != 1: f(a + 2, k + 1, 1) if r != 2: f(a + 5, k + 1, 2) if r != 3: f(a * 2, k + 1, 3) f(8) print(len(s))
Ошибка.
Попробуйте повторить позже
Исполнитель Отрицатель преобразует число, записанное на доске. У исполнителя есть две команды:
1. Вычесть 4
2. Умножить на (-1)
Программа для исполнителя Отрицатель – это последовательность команд. Сколько различных неотрицательных результатов можно получить из исходного числа 123 в ходе исполнения программы, содержащей ровно 10 команд?
a = [123] for i in range(10): a = list(set(a)) n = len(a) for j in range(n): l = a.pop(0) a.append(l - 4) a.append(l * (-1)) a = set(a) print(len([j for j in a if j >= 0]))
Ошибка.
Попробуйте повторить позже
Исполнитель Повторюша преобразует число, записанное на экране. У исполнителя есть шесть команд, которым присвоены номера:
1. Прибавить 1.
2. Прибавить 2.
3. Прибавить 3.
4. Умножить на 2.
5. Умножить на 3.
6. Умножить на 4.
Программа для исполнителя Повторюша – это последовательность команд. Сколько различных результатов можно получить из исходного числа 1 после выполнения программы, содержащей 10 команд, если известно, то можно использовать только те команды, номера которых отличаются на 1 от номера команды, сделанной на предыдущем шаге (на первом шаге можно использовать любую команду)?
a = [[1, ’0’]] for i in range(10): n = len(a) for j in range(n): l = a.pop(0) # Список доступных команд command = [[l[0] + 1, ’1’], [l[0] + 2, ’2’], [l[0] + 3, ’3’], [l[0] * 2, ’4’], [l[0] * 3, ’5’], [l[0] * 4, ’6’]] # Если первый ход - доступно все if l[1] == ’0’: for k in range(6): a.append(command[k]) # Анализируем края (по одной команде можем только) elif l[1] == ’1’: a.append(command[1]) elif l[1] == ’6’: a.append(command[4]) # Некрайние случаи else: # Если индекс на 1 меньше, и еще -1 от команды (влево) a.append(command[int(l[1]) - 2]) # Индекс на 1 меньше, и еще +1 от команды (вправо) a.append(command[int(l[1])]) a = set([j[0] for j in a]) print(len(a)) # Альтернативное решение: s = set() def f(a, h, c): if h == 10: s.add(a) return if c == 0: f(a + 1, h + 1, 1) f(a + 2, h + 1, 2) f(a + 3, h + 1, 3) f(a * 2, h + 1, 4) f(a * 3, h + 1, 5) f(a * 4, h + 1, 6) elif c == 1: f(a + 2, h + 1, 2) elif c == 2: f(a + 1, h + 1, 1) f(a + 3, h + 1, 3) elif c == 3: f(a + 2, h + 1, 2) f(a * 2, h + 1, 4) elif c == 4: f(a + 3, h + 1, 3) f(a * 3, h + 1, 5) elif c == 5: f(a * 2, h + 1, 4) f(a * 4, h + 1, 6) elif c == 6: f(a * 3, h + 1, 5) f(1, 0, 0) print(len(s))
Ошибка.
Попробуйте повторить позже
Исполнитель Отрицатель преобразует число, записанное на доске. У исполнителя есть две команды:
1. Вычесть 3
2. Умножить на (-1)
Программа для исполнителя Отрицатель – это последовательность команд. Сколько различных неотрицательных результатов можно получить из исходного числа 82 в ходе исполнения программы, содержащей ровно 8 команд?
a = set() # Множество для ответа def f(n, c): # Важно! Условия должны быть раздельными, # чтобы сначала проверялось только кол-во команд, # а затем знак числа. # Если сделать вместе — программа уйдёт в рекурсию из-за отрицательных чисел, # которые получились при c = 8 if c == 8: if n >= 0: a.add(n) else: f(n+3, c+1) f(n*(-1), c+1) f(82, 0) print(a)
Ошибка.
Попробуйте повторить позже
Исполнитель Май преобразует число, записанное на доске. У исполнителя есть три команды:
1. Прибавить 1
2. Умножить на 3
3. Умножить на 2
Программа для исполнителя Май – это последовательность команд. Сколько различных результатов можно получить из исходного числа 7 в ходе исполнения программы, содержащей ровно 13 команд?
a = set() # Множество для ответа # n — текущее число, c — кол-во совершённых команд def f(n, c): if c == 13: a.add(n) else: f(n+1, c+1) f(n*3, c+1) f(n*2, c+1) f(7, 0) print(len(a))
Ошибка.
Попробуйте повторить позже
Исполнитель Лето преобразует число, записанное на доске. У исполнителя есть две команды:
1. Прибавить 2
2. Умножить на 2
Программа для исполнителя Лето – это последовательность команд. Сколько различных результатов можно получить из исходного числа 3 в ходе исполнения программы, содержащей ровно 8 команд?
a = set() # Множество для ответа # n — текущее число, c — кол-во совершённых команд def f(n, c): if c == 8: a.add(n) else: f(n+2, c+1) f(n*2, c+1) f(3, 0) print(len(a))
Ошибка.
Попробуйте повторить позже
Исполнитель Шашлык преобразует число, записанное на доске. У исполнителя есть три команды:
1. Прибавить 1
2. Прибавить 10
3. Умножить на 3
Программа для исполнителя Шашлык – это последовательность команд. Сколько различных результатов можно получить из исходного числа 8 в ходе исполнения программы, содержащей ровно 6 команд?
a = set() # Множество для ответа # n — текущее число, c — кол-во совершённых команд def f(n, c): if c == 6: a.add(n) else: f(n+1, c+1) f(n+10, c+1) f(n*3, c+1) f(8, 0) print(len(a))
Ошибка.
Попробуйте повторить позже
Гусь преобразует число, записанное на экране. У гуся есть три команды, которым присвоены номера:
1. Прибавь 4
2. Прибавь 7
3. Раздели нацело на 2
Первая команда увеличивает число на экране на 4, вторая увеличивает его на 7, третья делит на 2 нацело (остаток отбрасывается). Программа для исполнителя – это последовательность команд. Сколько существует программ, которые состоят из 10 команд и при исходном числе 1 результатом является 1?
def f(a, b, c): if c == 10: return a == b if c < 10: return f(a+4, b, c+1) + f(a+7, b, c+1) + + f(a//2, b, c+1) print(f(1, 1, 0))