Актуально на август 2026 года
Это компактная шпаргалка от Профиматики — сборник готовых шаблонов кода и формул под каждое задание ЕГЭ по информатике. Держите её под рукой, пока решаете тренировочные варианты и разбираете свои ошибки: не нужно вспоминать синтаксис с нуля — открыл нужный раздел, взял заготовку, подставил условие задачи. Все шаблоны написаны под КЕГЭ-2026: работают с текущим форматом заданий, используют актуальные библиотеки Python и функции LibreOffice Calc.
Как пользоваться: найди номер своего задания в оглавлении, открой раздел, скопируй заготовку кода в свою IDE и адаптируй под конкретные числа из условия. Если задача сложная — сверху раздела указаны основные приёмы, снизу — типичные проверки и ловушки.
Задание 1 — Анализ информационных моделей (графы)
Задание 2 — Алгебра логики
Задание 3 — Табличные базы данных
Задание 5 — Анализ алгоритмов для исполнителей
Задание 6 — Исполнитель Черепаха
Задание 7 — Кодирование и передача информации
Задание 8 — Комбинаторика
Задание 9 — Анализ данных через электронные таблицы
Задание 11 — Вычисление количества информации
Задание 13 — Адресация в сети Интернет
Задание 14 — Системы счисления
Задание 15 — Преобразование логических выражений
Задание 16 — Рекурсивные алгоритмы
Задание 17 — Обработка числовой последовательности
Задание 19–21 — Выигрышная стратегия
Задание 22 — Многопроцессорные системы
Задание 23 — Подсчёт количества маршрутов
Задание 24 — Обработка символьных строк
Задание 25 — Обработка целочисленной информации
Задание 26 — Сортировка целочисленной информации
Задание 27 — Анализ данных (кластеризация)
from itertools import *
a = '478 38 256 15 34 37 168 127'.split()
# пишем связи из таблицы (построчно — номера столбцов, где есть число)
s = 'DE DG GC GA BC FB FE FH BH AH'.split()
# пишем связи из графа (рёбра, в любом порядке)
print('1 2 3 4 5 6 7 8') # количество столбцов
for p in permutations('AHBCFEDG'):
# меняем на буквы из задания
if all(str(p.index(y) + 1) in a[p.index(x)] for x, y in s):
print(*p)from itertools import *
def F(w, x, y, z):
return (not (((x <= w) <= (w == z)))) and y
for a1, a2, a3, a4, a5 in product([0, 1], repeat=5):
table = [(a1, 0, 1, 0), (0, a2, a3, 0), (a4, 1, 1, a5)]
if len(set(table)) == len(table):
for i in permutations('wxyz'):
if [F(**dict(zip(i, r))) for r in table] == [1, 1, 1]:
print(*i, sep='')print('x y z w')
for x in range(2):
for y in range(2):
for z in range(2):
for w in range(2):
f = (w == z) or (not(y <= w)) or (not(x))
if f == 0:
print(x, y, z, w)
# ЗАМЕНЫ ОПЕРАЦИЙ:
# ¬a → not a | a∧b → a and b | a∨b → a or b
# a→b → a<=b | a≡b → a==b | a XOR b → a!=b=ВПР(искомое_значение; таблица; номер_столбца; [интервальный_просмотр])
=ВПР(что ищем; где ищем; какой номер стобца выводим; тут всегда 0)# Перевод в 2, 8, 16:
x = bin(n)[2:]
x = oct(n)[2:]
x = hex(n)[2:]
# Перевод обратно в 10-ю СС:
r = int(n, 2) # вместо "2" — основание исходной системы
# Функция перевода в произвольную СС (до 36):
def F(x, base):
d = sorted('0123456789qwertyuiopasdfghjklzxcvbnm')[:base]
s = ''
while x > 0:
s = d[x % base] + s
x //= base
return s if s else '0'
# ПРИМЕР (задание 5 — троичная СС):
otv = []
for n in range(1, 1000):
r = F(n, 3)
if n % 3 == 0:
r = '1' + r + '02'
else:
r = r + F(n % 3 * 5, 3)
r = int(r, 3)
if r >= 177:
otv.append(n)
print(min(otv))
# ПОЛЕЗНЫЕ ОПЕРАЦИИ НАД ЗАПИСЬЮ r (строка):
r = r + r[-3:] # дописать 3 последних разряда
r = '10' + r[2:] + '0' # заменить два первых на '10', дописать '0'
r = '1' + r[3:] # убрать 3 первых и вставить '1'
r = r[-1] + r[1:-1] + r[0] # поменять первый и последний местами
sm = sum(int(c) for c in r) # сумма цифр числа
str(x) == str(x)[::-1] # палиндром
x**0.5 == int(x**0.5) # полный квадрат
len(set(str(x))) == len(str(x)) # все цифры уникальныfrom turtle import *
tracer(0) # отключаем анимацию
m = 15 # масштаб
# Переписываем алгоритм из задачи:
for i in range(4):
fd(3*m); lt(270); fd(5*m); rt(90); lt(270)
for i in range(3):
fd(5*m); rt(90); fd(3*m); lt(270)
# Рисуем сетку с точками:
up()
for x in range(-20, 20):
for y in range(-20, 20):
goto(x*m, y*m)
dot(3, "red")
update()
exitonclick() # выход по нажатию
done() # если exitonclick не работает
# ПОМНИМ:
# Объединение — все точки (вычти область пересечения, посчитанную дважды!)
# Пересечение — только общая часть двух фигур
# Площадь/периметр — считаем ОТРЕЗКИ (кол-во точек на стороне минус 1)# ЗВУК:
I = d * k * t * i
# d = частота дискретизации (Гц)
# i = разрешение (бит)
# k = каналы (1=моно, 2=стерео, 4=квадро)
# t = время (сек)
# ИЗОБРАЖЕНИЕ:
N = 2**i # N — кол-во цветов, i — бит на пиксель
I = k * i # I — объём (бит), k — кол-во пикселей
# Округление чаще в МЕНЬШУЮ сторону (иначе выход за границы памяти)from itertools import *
# С ПОВТОРЕНИЯМИ:
for i in product('123', repeat=3):
x = ''.join(i)
# БЕЗ ПОВТОРЕНИЙ:
for i in permutations('123', 3):
x = ''.join(i)
# ПОЛЕЗНЫЕ ПРОВЕРКИ:
if x[0] != '0': # число не начинается с 0
if x.count('1') == 4: # ровно четыре '1'
if x[0] != x[1] != x[2]: # соседние различны (ТОЛЬКО соседние!)
if len(set(s)) == 2: # ровно 2 различных символа
if x[0] <= x[1] <= x[2]: # неубывание (алфавитный порядок)
# Чётные/нечётные не стоят рядом — заменяем и проверяем:
for el in '02468ACE': s = s.replace(el, 'Ч')
for el in '13579BDF': s = s.replace(el, 'Н')
if 'НН' not in s and 'ЧЧ' not in s:
# ПРИМЕР (список слов):
from itertools import product
n = 0
for i in product(sorted('СТРОКА'), repeat=5): # sorted → алфавитный порядок!
s = ''.join(i)
n += 1
if n % 2 == 0 and s[0] not in 'АСТ' and s.count('О') == 2:
print(n)f = open('9.txt')
for s in f:
a = [int(x) for x in s.split()] # split(';') если CSV с разделителем ';'
a2 = [x for x in a if a.count(x) == 2] # встречаются ровно 2 раза
a1 = [x for x in a if a.count(x) == 1] # уникальные элементы
kr5 = [x for x in a if x % 5 == 0] # кратные 5
dv = [x for x in a if len(str(abs(x))) == 2] # двузначные (с abs!)
# ПРИМЕР условия:
if len(a2) == 4 and len(a1) == 3: # одно число дважды, остальные различны
if max(a) not in a2: # максимум не повторяется
print(n)
=СЧЁТЕСЛИ(диапазон; критерий)
=СЧЁТЕСЛИ(A:A; ">10") — чисел >10
=СУММЕСЛИ(диапазон_условия; критерий; диапазон_суммирования)
=СУММЕСЛИ(A:A; ">10"; B:B) — сумма B, где A>10
=СРЗНАЧЕСЛИ(диапазон_условия; критерий; диапазон_усреднения)
=СРЗНАЧЕСЛИ(A:A; ">10"; B:B) — среднее B, где A>10from math import *
# Минимальная мощность алфавита:
for n in range(1, 100000):
i = ceil(log2(n)) # бит на символ
k = 377 # длина записи (из условия)
V = ceil(i * k / 8) # байт на одну запись
if 23155 * V > 5536 * 1024: # условие на объём
print(n)
break
# ФОРМУЛЫ:
# I = i * k (I — объём, i — бит на символ, k — кол-во символов)
# N = 2**i (N — мощность алфавита, i — бит на символ)
# "более X" → знак > | "не более X" → знак <=
# "не менее X" → знак >=
# Гбайт = 2**30, Мбайт = 2**20, Кбайт = 2**10from ipaddress import *
net = ip_network('1.2.3.4/255.255.255.192', 0) # 0 = strict=False
# или: net = ip_network('1.2.3.4/26', 0) # 26 единиц в маске
net[0] # адрес сети
net[-1] # широковещательный адрес
net[1] # минимальный адрес ПК
net[-2] # максимальный адрес ПК
net.netmask # маска сети
net.num_addresses # количество IP-адресов
net.num_addresses-2 # количество узлов
# Перебор IP с условием:
for ip in net:
b = f'{int(ip):032b}' # двоичное представление (32 бита)
if b.count('1') % 11 == 0:
k += 1
# Искать маску (два узла в разных сетях):
for mask in range(33):
n1 = ip_network(f'120.91.95.213/{mask}', 0)
n2 = ip_network(f'120.91.89.205/{mask}', 0)
if n1 != n2: # в разных сетях
print(n1.netmask)
# Искать маску по адресу сети:
for mask in range(33):
net = ip_network(f'192.75.64.98/{mask}', 0)
if str(net.network_address) == '192.75.64.0':
print(net.netmask)# ТИП А — кол-во/сумма цифр в записи выражения:
x = 4 * 3125**2019 + 3 * 625**2020 # выражение из задачи
k = 0
while x > 0:
n = x % 25 # цифра в нужной СС
if n > 10: k += 1 # кол-во цифр > 10
# если просят СУММУ цифр: k += n (а не k += 1!)
x //= 25
print(k)
# ТИП Б — неизвестная цифра x (основание ≤ 36):
from string import printable
for x in printable[:27]: # алфавит 27-ричной СС
s = int('123' + x + '24', 27) + int('135' + x + '78', 27)
if s % 26 == 0:
print(s // 26)
# ТИП Б — если основание > 36 (по разрядам):
def superint(n, b):
a = list(n)[::-1]
s = 0
for i in range(len(a)):
s += int(a[i]) * b**i
return s
for x in range(37):
a = superint(f'123{x}', 37) + superint(f'4{x}59', 37)
if a % 36 == 0:
print(x, a // 36)
break
# ТИП В — найти x с нужным числом нулей:
for x in range(1, 2031):
s = 7**91 + 7**160 - x
k = 0
while s > 0:
if s % 7 == 0: k += 1
s //= 7
if k == 70:
print(x)
# Натуральные/положительные → перебор с 1, неотрицательные → с 0!# Делимость:
def F(A, x):
return (not (x % A == 0)) <= ((x % 28 == 0) <= (not (x % 49 == 0)))
for A in range(1, 1000):
if all(F(A, x) for x in range(1, 1000)):
print(A); break
# Два аргумента x, y:
def F(A, x, y):
return (x + 2*y > A) or (y < x) or (x < 30)
for A in range(0, 1000):
if all(F(A, x, y) for x in range(0, 1000) for y in range(0, 1000)):
print(A); break
# Побитовая конъюнкция:
def F(A, x):
return (x & 39 == 0) or ((x & 11 == 0) <= (not (x & A == 0)))
for A in range(0, 1000):
if all(F(A, x) for x in range(0, 1000)):
print(A); break
# Отрезки:
def f(x):
b = 66 <= x <= 75 # отрезок B
c = 71 <= x <= 85 # отрезок C
a = a1 <= x <= a2 # искомый отрезок
return (not a) <= (b == c) # условие из задачи
ox = []
for i in (66, 75, 71, 85): # границы всех отрезков
ox += [i-0.1, i, i+0.1]
m = []
for a1 in ox:
for a2 in ox:
if a2 > a1 and all(f(x) == 1 for x in ox):
# f(x)==1 если просят истинно, f(x)==0 если ложь
m.append(a2 - a1)
print(min(m)) # min — наименьшая длина, max — наибольшая# СПОСОБ 1 — lru_cache:
from functools import lru_cache
@lru_cache(10000)
def G(n):
if n <= 20: return n + 2
return G(n - 3) + 1
def F(n): return 3 * G(n - 3) + 7
for n in range(1, 37811): G(n) # заполняем кэш
print(F(37811))
# Если F(n + ...) → цикл ОБРАТНЫЙ: for n in range(10000, 1, -1)
# СПОСОБ 2 — через список:
G = [0] * 30000
for n in range(29999, 1, -1): # обратный цикл, т.к. G(n+8)
if n >= 28983: G[n] = n/20 + 36
else: G[n] = G[n+8] - 5
F = [0] * 1000
for n in range(1, 1000):
if n >= 23: F[n] = F[n-6] + 1441
else: F[n] = 14 * (G[n-15] - 38)
print(F[993])
# СПОСОБ 3 — setrecursionlimit (на слабых ПК может не потянуть):
from sys import setrecursionlimit
setrecursionlimit(1000000)a = [int(x) for x in open('17.txt')]
# Прогон по парам: range(len(a) - 1)
# Прогон по тройкам: range(len(a) - 2)
# Тройка срезом: tr = a[i:i+3]
# ПРОВЕРКИ:
len(str(abs(a[i]))) == 5 # пятизначное (с abs для отрицательных!)
abs(a[i]) % 18 == 0 # кратное 18 (берём модуль!)
9 < abs(x) < 100 # двузначное
# ПРИМЕР:
mx33 = max(x for x in a if abs(x) % 100 == 33)
otv = []
for i in range(len(a) - 2):
s = a[i:i+3]
if len([x for x in s if 9 < abs(x) < 100]) == 2: # ровно 2 двузначных
if sum(s)**2 < mx33:
otv.append(sum(s))
print(len(otv), max(otv))# 1 куча:
def f(s, m): # s — камней, m — номер хода
if s >= 132: return m % 2 == 0 # условие победы
if m == 0: return 0
h = [f(s+3, m-1), f(s+6, m-1), f(s*3, m-1)] # ходы из задачи
return any(h) if m % 2 != 0 else all(h)
# any — у победителя; all — «при любом ходе противника»
# ⚠ Для 19: all меняется на any, если в вопросе «неудачный ход»!
print('#19', min(s for s in range(1, 132) if f(s, 2)))
print('#20', [s for s in range(1, 132) if not f(s, 1) and f(s, 3)])
print('#21', min(s for s in range(1, 132) if not f(s, 2) and f(s, 4)))
# 2 кучи / 2 фишки:
def f(x, y, m): # x, y — кучи/фишки, m — номер хода
if (x + y) >= 77: return m % 2 == 0
if m == 0: return 0
h = [f(x+3,y,m-1), f(x*3,y,m-1), f(x,y+3,m-1), f(x,y*3,m-1)]
return any(h) if m % 2 != 0 else all(h)
# any — у победителя; all — «при любом ходе противника»
# ⚠ Для 19: all меняется на any, если в вопросе «неудачный ход»!
print('#19', min(s for s in range(1, 65) if f(12, s, 2)))
print('#20', [s for s in range(1, 65) if not f(12, s, 1) and f(12, s, 3)])
print('#21', [s for s in range(1, 65) if not f(12, s, 2) and f(12, s, 4)])=ВПР(D2+0;$A:$G;7;0) # поиск времени выполнеия процесса А
=МАКС(E2:F2)+B2 # последняя мс процесса
=МАКС(D2:E2)+1 # мс с которой начинается процесс# a — стартовое число, b — конечное
# Увеличение (команды +3, +7, *2):
def F(a, b):
if a == b: return 1
if a > b: return 0 # перескочили
return F(a+3, b) + F(a+7, b) + F(a*2, b)
# Уменьшение (команды -2, -4, //2):
def F(a, b):
if a == b: return 1
if a > b or a == 15: return 0 # перескочили или запрещённые числа
return F(a-2, b) + F(a-4, b) + F(a//2, b)
# Обязательно пройти через числа X, Y → перемножаем участки:
print(F(8, 32) * F(32, 49) * F(49, 73))# Регулярные выражения:
from re import finditer
# Символьные классы:
# [ABC] — один из A, B, C
# [A-Z] — диапазон A–Z
# [^ABC] — не A, B, C
# . — любой символ
# Квантификаторы:
# * — 0 или больше
# + — 1 или больше
# ? — 0 или 1
# {n} — ровно n
# {n,m} — от n до m
# Группировка:
# [AB]+ — A или B подряд
# (AB)+ — пара AB подряд
# AB|CD — AB или CD
# Экранирование: \* \+ \{ \} \[ \] \( \) \. \? \|
# Пересекающиеся совпадения: r'(?=(шаблон))'
# * и + жадные — берут максимум
# ПРИМЕРЫ для ЕГЭ:
r'[1-9A-D][0-9A-D]*' # 14-ричное число без ведущего нуля
r'[1-9A-D][0-9A-D]*[02468AC]' # чётное 14-ричное число
# МЕТОД — накопление строки (скользящее окно):
a = open('24.txt').readline().strip()
s = ''
m = 0
k = 0; kY = 0
for i in a:
s += i
if i == 'Y': kY += 1
if s[-4:] == '2025': k += 1
while kY > 80: # ограничение на число Y
if s[0] == 'Y': kY -= 1
if s[:4] == '2025': k -= 1
s = s[1:]
if k >= 90: m = max(m, len(s))
print(m)# Проверка простоты:
def prost(n):
return n > 1 and all(n % d != 0 for d in range(2, int(n**0.5)+1))
# Все делители (без 1 и самого числа):
def divs(n):
a = set()
for i in range(2, int(n**0.5)+1):
if n % i == 0:
a.add(i)
a.add(n // i)
return a
# Только простые делители:
def prime_divs(n):
a = set()
for i in range(2, int(n**0.5)+1):
if n % i == 0:
if prost(i): a.add(i)
if prost(n // i): a.add(n // i)
return a
# Маски (fnmatch):
from fnmatch import fnmatch
for i in range(18579, 10**10 + 1, 18579): # шаг = делитель
if fnmatch(str(i), '54?1?3*7'): # ? = 1 символ, * = любые
print(i, i // 18579)a = open('26.txt')
N, K = [int(x) for x in a.readline().split()]
z = [int(a.readline()) for i in range(N)] # мин. мощность для каждого района
sneg = [100000] * 1001 # sneg[мощность] = мин. стоимость
for i in range(K):
m, c = [int(x) for x in a.readline().split()]
sneg[m] = min(sneg[m], c) # оставляем минимальную стоимость
for i in range(len(sneg)):
sneg[i] = [sneg[i], i] # пары [стоимость, мощность]
sneg.sort(key=lambda x: (x[0], -x[1]))
# сортируем: дешевле, при равной стоимости — мощнее
stoim, mx = 0, 0
for i in z:
for j in sneg:
if i <= j[1]: # мощность >= требуемой
stoim += j[0]
mx = max(mx, j[1])
break
print(stoim, mx)# Расстояние (с типом z в списке):
def dist(a, b):
x1, y1, z1 = a
x2, y2, z2 = b
return ((x2-x1)**2 + (y2-y1)**2)**0.5
# Центр кластера (медоид — точка с МИН суммой расстояний):
def centr(K):
s = []
for i in K:
a = sum(dist(i, j) for j in K)
s.append([a, i])
return min(s)[1]
# ПРИМЕР (файл A — 2 кластера):
A = [[], []]
for s in open('27_A.txt'):
x, y, t = s.replace(',', '.').split()
x, y = float(x), float(y)
if t == 'VII': t = ' VII'
if y > 10: A[0].append([x, y, t]) # ← порог подбирай через len()!
else: A[1].append([x, y, t])
# ПРИМЕР (файл B — 3 кластера):
B = [[], [], []]
for s in open('27_B.txt'):
x, y, t = s.replace(',', '.').split()
x, y = float(x), float(y)
if t == 'VII': t = ' VII'
if y > 23: B[0].append([x, y, t])
elif y > 15: B[1].append([x, y, t])
else: B[2].append([x, y, t])
# Жёлтые звёзды (Z) — подсчёт:
k0 = len([p for p in A[0] if p[2][0] == 'Z'])
k1 = len([p for p in A[1] if p[2][0] == 'Z'])
print(min(k0, k1), max(k0, k1))
# Синие карлики (L + V) — расстояния до центра:
lv0 = [p for p in B[0] if p[2][0] == 'L' and p[2][2:] == 'V']
lv1 = [p for p in B[1] if p[2][0] == 'L' and p[2][2:] == 'V']
lv2 = [p for p in B[2] if p[2][0] == 'L' and p[2][2:] == 'V']
c0, c1, c2 = centr(B[0]), centr(B[1]), centr(B[2])
r = [dist(c0, p) for p in lv0] + [dist(c1, p) for p in lv1] + [dist(c2, p) for p in lv2]
print(int(min(r)*10000), int(max(r)*10000))
# МАКС диаметр внутри группы звёзд одного кластера:
def diam(k):
s = []
for i in k:
a = max(dist(i, j) for j in k if dist(i, j) > 0)
s.append(a)
return max(s)
# АЛГОРИТМ РЕШЕНИЯ:
# 1. Прочитать файл, запятая → точка
# 2. Подобрать пороги (y>? / x>?) через print(len()) — числа должны быть разными
# 3. Найти центры через centr()
# 4. Отфильтровать звёзды по типу: z[0]=спектр, z[1]=подкласс, z[2:]=светимость
# 5. Посчитать расстояния / количества
# 6. Ответ: int(значение * 10000) — ЦЕЛАЯ ЧАСТЬ (не округление!)
Удачи на ЕГЭ!Шпаргалка составлена командой Профиматики. Обновляется под каждый новый КИМ ФИПИ.