Сначала формула. Затем подстановка исходных данных. Только после этого — вычисление.
01 / Изображения
- V
- Объём пиксельных данных, в битах. Заголовок в него не входит.
- W
- Ширина изображения, в пикселях.
- H
- Высота изображения, в пикселях.
- i
- Глубина цвета: число бит, выделенных одному пикселю.
- N
- Количество цветов в палитре.
Максимальная палитра: Nmax = 2i. Например, 4 бита позволяют закодировать 2⁴ = 16 цветов.
Если дано число цветов, выбирай минимальное целое i, для которого 2i ≥ N. Например, для 17 цветов нужно 5 бит: 2⁴ < 17 ≤ 2⁵.
Если ограничена память, imax = ⌊Vmax / (W × H)⌋. Vmax — доступная память в битах. Здесь округляем вниз.
05 / Единицы измеренияСначала выбери нужную единицу
В одном байте 8 бит, то есть 2³ бит. Каждая следующая единица памяти больше предыдущей в 1024 = 2¹⁰ раз.
Байт1 байт = 2³ бит
Кбайт1 Кбайт = 2¹⁰ байт = 2¹³ бит
Мбайт1 Мбайт = 2²⁰ байт = 2²³ бит
Гбайт1 Гбайт = 2³⁰ байт = 2³³ бит
Как записать перевод в решении
Не вычисляй промежуточные значения — оставь множители в подстановке.
Кбайты → биты: умножаем на 2¹³300 Кбайт = 300 × 2¹³ бит
Биты → Кбайты: делим на 2¹³24 576 бит = 24 576 / 2¹³ Кбайт
Для перевода Мбайт в биты используй 2²³, для Гбайт — 2³³. Обратный перевод выполняй делением на ту же степень.
Кбайты ↔ Мбайты
Мбайт — более крупная единица: в одном Мбайте 1024 Кбайт. Чтобы перейти из Кбайт в Мбайты, дели на 1024 = 2¹⁰. Для обратного перевода умножай.
Кбайты → МбайтыНапример: 2048 Кбайт ÷ 1024 = 2 Мбайт.
512 Кбайт ÷ 1024 = 0,5 Мбайт.
Мбайты → КбайтыНапример: 3 Мбайт × 1024 = 3072 Кбайт.
Здесь V — объём памяти, а подпись указывает единицу. Это перевод между байтовыми единицами: множитель 8 не нужен.
Частота и время
1 кГц = 1000 Гц.
1 мин = 60 с.
1 ч = 3600 с.
Логика и таблицы истинности
Операции
¬A — отрицание: меняет 0 на 1 и наоборот.
A ∧ B — И: 1, только когда оба значения равны 1.
A ∨ B — ИЛИ: 0, только когда оба значения равны 0.
A → B — импликация: 0 только при A = 1 и B = 0.
A ≡ B — эквивалентность: 1, когда значения совпадают.
Логические операции в Python
¬A → (not (A))
A ∧ B → A and B
A ∨ B → A or B
A → B → A <= B
A ≡ B → A == B
Когда делаем отрицание, ставим в скобки и выражение под отрицанием, и всё отрицание: (not (A)). Например: (not (x)) или (not (y == z)).
1. Обычный перебор
Пример с твоей формулой. В своём задании замени выражение после F = и выбери 0 или 1 в проверке if F ==.
# Стандартная запись задачи
print("x y z w F")
for x in (0, 1):
for y in (0, 1):
for z in (0, 1):
for w in (0, 1):
# Заменяем логические операции операциями Python
F = ((y <= z) or ((not (x)) and w)) == (w == z)
# Оставляем строки с нужным значением F
if F == 1:
print(x, y, z, w, int(F))Обычный перебор: каждое действие
# ...Строка, начинающаяся с #, — комментарий. Python её не выполняет. В решениях оставлен только исполняемый код; пояснения собраны здесь.
print("x y z w F")Печатаем заголовок будущей таблицы. Буквы внутри кавычек — обычный текст. Порядок переменных в заголовке должен совпадать с порядком в последнем print.
F = ((y <= z) or ((not x) and w)) == (w == z)Вычисляем функцию для текущего набора. Один знак = сохраняет результат в F. Скобки задают порядок действий.
if F == 1:Проверяем, равна ли функция единице. Два знака == сравнивают значения, а не присваивают их. Если в условии F = 0, пишем if F == 0:. Если встречаются оба значения, можно вывести все строки через if F in (0, 1):.
print(x, y, z, w, int(F))Печатаем значения текущего набора. Запятые разделяют аргументы, print по умолчанию выводит их через пробел. int(F) переводит True в 1, False в 0. Дополнительный отступ помещает print внутрь if: выводятся только подходящие строки.
Сопоставление с условиемСравниваем полученные строки с фрагментом таблицы. Пустая клетка — неизвестное значение, а не обязательно ноль. Ищем соответствие столбцов переменным. В ответ записываем буквы по порядку столбцов исходной таблицы, а не по заголовку нашего вывода.
2. Подбор столбцов
Второй пример использует другую формулу и таблицу. Замени функцию f, строки table, число пустых клеток repeat и список значений F. Каждой пустой клетке нужна своя переменная. Здесь пять пустых клеток и три строки с F = 1.
from itertools import permutations, product
def f(x, y, z, w):
return (not (w <= (x == y))) and (z <= x)
# Перебираем значения 5 пустых клеток
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(table) == len(set(table)):
for p in permutations("xyzw"):
# Назначаем столбцам переменные и проверяем каждую строку
if [int(f(**dict(zip(p, t)))) for t in table] == [1, 1, 1]:
print(*p)Подбор столбцов: каждое действие
from itertools import permutations, productИз встроенного модуля itertools подключаем две функции. product перебирает значения пустых клеток, permutations — порядок переменных. Дополнительно устанавливать модуль не нужно.
def f(x, y, z, w):Объявляем функцию f с четырьмя именованными параметрами. Пока функция только определена; вычисление начнётся при её вызове.
return (not (w <= (x == y))) and (z <= x)Вычисляем выражение и возвращаем его значение. Здесь стоит формула второго примера. В другом задании заменяем её формулой из его условия. Отступ показывает, что return относится к функции.
table = [(a1, 0, 1, 0), (0, a2, a3, 0), (a4, 1, 1, a5)]Создаём список строк фрагмента. Каждая строка — кортеж из четырёх значений столбцов. Известные 0 и 1 переносим без изменений. Каждой пустой клетке даём отдельную переменную: a1, a2 и так далее. Значения F сюда не включаем. Переносы строк внутри квадратных скобок нужны только для удобства чтения.
len(table)Считаем количество строк списка: в примере их три.
set(table)Создаём множество строк. Оно оставляет по одному экземпляру каждой строки. Если после заполнения две строки совпали, в множестве будет меньше элементов. Кортежи в table позволяют использовать set.
if len(table) == len(set(table)):Сравниваем число исходных строк с числом различных строк. Продолжаем только при равенстве: значит, повторов нет. Так выполняется условие о различных строках таблицы.
zip(p, t)Соединяем буквы и числа попарно. Если p = ("y", "x", "w", "z"), а t = (0, 1, 1, 0), получаем пары ("y", 0), ("x", 1), ("w", 1), ("z", 0).
dict(zip(p, t))Превращаем пары в словарь: {"y": 0, "x": 1, "w": 1, "z": 0}. Это соответствие имён переменных значениям текущей строки.
f(**dict(zip(p, t)))Две звёздочки распаковывают словарь в именованные аргументы. В нашем примере вызов равносилен f(y=0, x=1, w=1, z=0). Функция получает значения именно по именам: порядок ключей словаря не меняет смысл формулы.
int(f(**dict(zip(p, t))))Вычисляем F для выбранного назначения столбцов и переводим результат в 0 или 1.
[int(f(**dict(zip(p, t)))) for t in table]Сокращённая запись цикла создаёт список значений F для всех строк. Порядок результатов совпадает с порядком строк в table.
== [1, 1, 1]Сравниваем полученный список со значениями F из условия. Здесь все три строки имеют F = 1. Если значения разные, например 1, 0, 1, записываем [1, 0, 1]. Если везде нули, используем [0, 0, 0].
if [int(f(**dict(zip(p, t)))) for t in table] == [1, 1, 1]:Переходим к выводу только тогда, когда выбранный порядок букв и заполнение пустых клеток подходят сразу ко всем строкам.
print(*p)Одна звёздочка передаёт буквы из p как отдельные аргументы print. Получаем, например, y x w z. В поле ответа вводим yxwz без пробелов. Чтобы сразу печатать слитно, можно написать print(*p, sep="").
Что менять для нового заданияМеняем формулу в return, набор переменных, строки table, число и имена пустых клеток, repeat и список значений F. Число переменных a должно совпадать с repeat. Число значений в каждой строке — с количеством букв в permutations, число значений F — с количеством строк.
Проверка результатаОдин и тот же порядок иногда печатается несколько раз при разных заполнениях клеток. Если появились разные порядки букв, проверяем перенос формулы и таблицы. Если код ничего не вывел, тоже сверяем данные, скобки и значения F.
product — перебор пустых клеток; set — проверка различия строк; permutations — перебор порядка столбцов; dict(zip(p, t)) — соответствие имён переменных значениям строки. print(*p) выводит порядок букв для ответа.
Как сопоставлять столбцы
Наш порядок: сначала строки, затем столбцы. Сначала строим таблицу на Python и выписываем строки с нужным значением F. Подписываем переменные над столбцами в том же порядке, что в print. Затем сравниваем эти строки с фрагментом из условия и определяем переменную каждого неизвестного столбца. В конце проверяем найденный порядок по всем строкам условия и записываем буквы слева направо. Пустая клетка означает неизвестное значение, а не ноль. Указанные в условии строки должны быть различными.
Порядок действий: скобки, ¬, ∧, ∨, →, ≡. Ответ — латинские буквы по порядку столбцов.
Пример: находим порядок столбцов
1. Берём фрагмент из условия. Пустые клетки обозначены вопросами.
2. Получаем строки в Python. Здесь порядок переменных известен: x, y, z, w.
3. Сопоставляем строки. Сначала находим w: во всех наборах он равен 0, значит, это четвёртый столбец. Во второй строке условия одна единица: она соответствует первой строке Python, поэтому третий столбец — y. В третьей строке y = 0: ей подходит второй набор Python. Для первой строки остаётся третий набор: x = 1, z = 0. В первом столбце уже стоит 1, значит, он x; второй — z.
Строка 2 условия ↔ строка 1 Python
Строка 3 условия ↔ строка 2 Python
Строка 1 условия ↔ строка 3 Python
4. Подписываем столбцы и заполняем клетки. Числа переносим по именам переменных, а не по месту в выводе Python.
Читаем буквы над последней таблицей слева направо. Ответ: xzyw.
Сопоставление строк по шагам
Заполняем таблицу вместе
Слева — исходная таблица из условия. Справа — таблица из Python. На каждом шаге подписываем переменные и дополняем пустые клетки.
Найденные пары строк
Здесь будут появляться соответствия строк. Одинаковый цвет отмечает пару в обеих таблицах.
Начинаем с таблицы из условия. Вопросительные знаки — пустые клетки, которые нам предстоит заполнить.
Шаг 0 из 9
Порядок столбцов: xzyw.