Автор: Сергей Горбачев
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 140.116.194.0 и маской сети 255.255.240.0. Сколько в этой сети IP-адресов, в двоичной записи которых каждый из четырёх байтов оканчивается нулём?
В ответе укажите только число.
from ipaddress import *
net = ip_network('140.116.194.0/255.255.240.0', 0)
cnt = 0
for ip in net:
s = f'{ip:b}'
if s[7] == '0' and s[15] == '0' and s[23] == '0' and s[31] == '0':
cnt += 1
print(cnt)
Ответ: 1024
from ipaddress import * Импорт всех функций и классов из модуля ipaddress, который позволяет работать с IP-адресами и сетями
net = ip_network('140.116.194.0/255.255.240.0', 0) Создание объекта сети с адресом 140.116.194.0 и маской 255.255.240.0
cnt = 0 Инициализация счётчика cnt для подсчёта подходящих IP-адресов
for ip in net: Цикл по всем IP-адресам в сети net
s = f'{ip:b}' Преобразование текущего IP-адреса ip в его двоичное представление в виде строки s
if s[7] == '0' and s[15] == '0' and s[23] == '0' and s[31] == '0': Проверка, что 8-й, 16-й, 24-й и 32-й биты (индексы 7, 15, 23, 31) в двоичной строке равны '0'
cnt += 1 Если условие выполняется, увеличиваем счётчик cnt на 1
print(cnt) Вывод итогового значения счётчика cnt
Please open Telegram to view this post
VIEW IN TELEGRAM
❤37❤🔥8🔥4
19784 #kege по информатике #ЕГЭ23Автор: kompege.ru
Уровень: Базовый
У исполнителя имеются две команды, которые обозначены латинскими буквами:
A. Вычти 2
B. Если число чётное, раздели на 2, иначе вычти 3
Программа для исполнителя – это последовательность команд. Сколько существует программ, которые преобразуют исходное число 98 в число 1 и при этом траектория вычислений не содержит число 28?
def F(a, b):
if a < b or a == 28:
return 0
if a == b:
return 1
else:
return F(a-2, b) + F(a // 2 if a % 2 == 0 else a - 3, b)
print(F(98, 1))
Ответ: 12318
def F(a, b): Объявление функции F с двумя параметрами a и b.
if a < b or a == 28: - Проверка условий: если a меньше b ИЛИ a равно 28.
return 0 - Возвращает 0, если выполнилось условие выше.
if a == b: - Проверка, если a равно b.
return 1 - Возвращает 1, если a равно b.
else: - Если ни одно из предыдущих условий не выполнилось.
return F(a-2, b) + F(a // 2 if a % 2 == 0 else a - 3, b)
- Рекурсивный вызов функции F с разными аргументами
print(F(98, 1)) - Вызов функции F с аргументами 98 и 1, и вывод результата.
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤6❤🔥5🔥3
17799 #kege по информатике #ЕГЭ8Автор: В. Зарянкин
Уровень: Средний
Все четырёхбуквенные слова, в составе которых могут быть только русские буквы А, Р, Г, У, М, Е, Н, Т, записаны в алфавитном порядке и пронумерованы начиная с 1.
Вот начало списка:
1. АААА
2. АААГ
3. АААЕ
4. АААМ
5. АААН
...
Под каким номером в списке идёт последнее слово, в котором все буквы различны и все символы располагаются в алфавитном порядке?
from itertools import *
s = sorted('АРГУМЕНТ')
for n, p in enumerate(product(s, repeat=4), 1):
word = ''.join(p)
if len(word) == len(set(word)):
if list(word) == sorted(word):
print(n)
Ответ: 2424
from itertools import * - Импорт всех функций из модуля itertools (в данном случае используется product)
s = sorted('АРГУМЕНТ') - Создание отсортированного списка букв из слова "АРГУМЕНТ": ['А', 'Г', 'Е', 'М', 'Н', 'Р', 'Т', 'У']
for n, p in enumerate(product(s, repeat=4), 1): - Цикл по всем возможным комбинациям букв длиной 4 (с повторами)
- product(s, repeat=4) генерирует декартово произведение списка s на себя 4 раза
- enumerate добавляет нумерацию, начиная с 1
word = ''.join(p) - Объединение кортежа p в строку (слово из 4 букв)
if len(word) == len(set(word)): - Проверка, что все буквы в слове уникальны (длина слова равна длине множества его букв)
if list(word) == sorted(word): - Проверка, что буквы в слове идут в алфавитном порядке (слово равно своему отсортированному варианту)
print(n) - Если оба условия выполнены, выводится номер текущей комбинации
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4👍3❤2
Автор: М.Шагитов
Уровень: Средний
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может убрать из кучи один камень, либо, если в куче 4 или больше камней, он может убрать четыре камня, либо, если количество камней в куче кратно трем, он может уменьшить количество камней в куче в три раза.
Игра завершается в тот момент, когда количество камней в куче становится не более 1.
Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу из 1 камня или меньше.
В начальный момент в куче было S камней; 4 ≤ S ≤ 100.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите минимальное значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Задание 20.
Для игры, описанной в задании 19, найдите два наименьших значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
− Петя не может выиграть за один ход;
− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания.
Задание 21.
Для игры, описанной в задании 19, найдите минимальное значение S, при котором одновременно выполняются два условия:
– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Аудио с пояснением к коду решения оставлю в комментариях.
def F(s, n):
if s <= 1:
return n % 2 == 0
if n == 0:
return 0
h = [F(s - 1, n - 1)]
if s >= 4:
h += [F(s - 4, n - 1)]
if s % 3 == 0:
h += [F(s / 3, n - 1)]
return any(h) if (n - 1) % 2 == 0 else all(h)
print([s for s in range(4, 100 + 1) if F(s, 2)])
print([s for s in range(4, 100 + 1) if F(s, 3) and not F(s, 1)])
print([s for s in range(4, 100 + 1) if F(s, 4) and not F(s, 2)])
Ответы:
6
7 10
8
def F(s, n): • Объявление функции F с параметрами s (текущее состояние) и n (количество оставшихся ходов)
if s <= 1: • Проверка, если s меньше или равно 1, игра завершена
return n % 2 == 0 • Возвращает True, если n чётное (победа текущего игрока), иначе False
if n == 0: • Проверка, если ходы закончились (n = 0), игра проиграна
return 0 • Возвращает 0 (ложь), так как нет ходов для победы
h = [F(s - 1, n - 1)] • Рекурсивный вызов F для хода s - 1 и уменьшенного n, результат добавляется в список h
if s >= 4: • Проверка, можно ли сделать ход s - 4
h += [F(s - 4, n - 1)] • Если s >= 4, рекурсивный вызов F для s - 4 и уменьшенного n, результат добавляется в h
if s % 3 == 0: • Проверка, делится ли s на 3
h += [F(s / 3, n - 1)] • Если s делится на 3, рекурсивный вызов F для s / 3 и уменьшенного n, результат добавляется в h
return any(h) if (n - 1) % 2 == 0 else all(h) • Если предыдущий ход был чётным ((n - 1) % 2 == 0), возвращает any(h) (хотя бы один выигрышный ход), иначе all(h) (все ходы должны быть выигрышными)
print([s for s in range(4, 100 + 1) if F(s, 2)]) • Выводит список s от 4 до 100, где игрок может выиграть за 2 хода (F(s, 2) = True)
print([s for s in range(4, 100 + 1) if F(s, 3) and not F(s, 1)]) • Выводит список s от 4 до 100, где игрок может выиграть за 3 хода, но не за 1 (F(s, 3) = True и F(s, 1) = False)
print([s for s in range(4, 100 + 1) if F(s, 4) and not F(s, 2)]) • Выводит список s от 4 до 100, где игрок может выиграть за 4 хода, но не за 2 (F(s, 4) = True и F(s, 2) = False)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥3🔥2👍1
21420 #kege по информатике #ЕГЭ23Автор: Досрочная волна 2024
Уровень: Базовый
У исполнителя есть три команды, которые обозначены латинскими буквами:
A. Прибавить 1
B. Прибавить 2
C. Умножить на 2
Сколько существует программ, которые преобразуют число 7 в число 51, и при этом траектория вычислений содержит числа 13 и 15, но не содержит числа 35?
Довольно забавная программа, так как у некоторых ребят на стареньких компьютерах она считается долго. И можно воспользоваться кэшированием из 16 номера для ускорения вычислений!
from functools import *
@lru_cache(None)
def F(a,b):
if a >= b or a == 35:
return a == b
return F(a + 1, b) + F(a + 2, b) + F(a * 2, b)
print (F(7, 13) * F(13, 15) * F(15, 51))
Ответ: 174034068
rom functools import *Импортируется модуль functools, который содержит полезные инструменты для работы с функциями (в частности - декоратор lru_cache).
@lru_cache(None)Декоратор, который запоминает результаты всех вызовов функции F.
Благодаря этому при повторных вызовах с теми же аргументами программа работает быстрее, не пересчитывая одно и то же.
def F(a, b):Определяется рекурсивная функция F, принимающая два параметра — a (начальное число) и b (конечное число).
if a >= b or a == 35:Проверяется условие остановки рекурсии:
- если a стало больше или равно b,
- либо если a достигло числа 35,
то дальнейшие шаги не выполняются.
return a == bВозвращает True (1), если a равно b, и False (0) — в остальных случаях.
Таким образом, функция подсчитывает количество способов дойти до b.
return F(a + 1, b) + F(a + 2, b) + F(a * 2, b)Если условие не выполнено, функция рекурсивно вызывает саму себя,
рассматривая три возможных шага из числа a:
- добавить 1,
- добавить 2,
- умножить на 2.
Сумма этих трёх вызовов возвращает количество всех возможных путей от a до b.
print(F(7, 13) * F(13, 15) * F(15, 51))Вычисляется произведение количества путей:
- от 7 до 13,
- от 13 до 15,
- от 15 до 51.
Затем результат выводится на экран.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4❤🔥2🔥1