Доброго времени суток каждому жителю Хабрвилля! Давненько я не писал статей! Пора это исправить!
В сегодняшней статье поговорим о насущной для многих выпускников школ теме — ЕГЭ. Да-да-да! Я знаю, что Хабр — это сообщество разработчиков, а не начинающих айтишников, но сейчас ребятам как никогда нужна поддержка именно сообщества. Ребят опять посадили на дистант. Пока не ясно на какой период, но уже сейчас можно сказать, что ЕГЭ по информатике будет на компьютерах и его можно зарешать при помощи языка Python.
Вот я и подумал, чтобы не получилось как в песне, стоит этим заняться. Я расскажу про все задачи первой части и их решения на примере демо варианта ЕГЭ за октябрь.
Всех желающих — приглашаю ниже!
Быстрый перевод из системы в систему
В Python есть интересные функции bin()
, oct()
и hex()
. Работают данные функции очень просто:
bin(156) #Выводит '0b10011100'
oct(156) #Выводит '0o234'
hex(156) #Выводит '0x9c'
Как вы видите, выводится строка, где 0b — означает, что число далее в двоичной системе счисления, 0o — в восьмеричной, а 0x — в шестнадцатеричной. Но это стандартные системы, а есть и необычные…
Давайте посмотрим и на них:
n = int(input()) #Вводим целое число
b = '' #Формируем пустую строку
while n > 0: #Пока число не ноль
b = str(n % 2) + b #Остатот от деления нужной системы (в нашем сл записываем слева
n = n // 2 #Целочисленное деление
print(b) #Вывод
Данная программа будет работать при переводе из десятичной системы счисления в любую до 9, так как у нас нет букв. Давайте добавим буквы:
n = int(input()) #Вводим целое число
b = '' #Формируем пустую строку
while n > 0: #Пока число не ноль
if (n % 21) > 9: #Если остаток от деления больше 9...
if n % 21 == 10: #... и равен 10...
b = 'A' + b #... запишем слева A
elif n % 21 == 11:#... и равен 11...
b = 'B' + b#... запишем слева B
'''
И так далее, пока не дойдём до системы счисления -1 (я переводил в 21-ную систему и шёл до 20)
'''
elif n % 21 == 11:
b = 'B' + b
elif n % 21 == 12:
b = 'C' + b
elif n % 21 == 13:
b = 'D' + b
elif n % 21 == 14:
b = 'E' + b
elif n % 21 == 15:
b = 'F' + b
elif n % 21 == 16:
b = 'G' + b
elif n % 21 == 17:
b = 'H' + b
elif n % 21 == 18:
b = 'I' + b
elif n % 21 == 19:
b = 'J' + b
elif n % 21 == 20:
b = 'K' + b
else: #Иначе (остаток меньше 10)
b = str(n % 21) + b #Остатот от деления записываем слева
n = n // 21 #Целочисленное деление
print(b) #Вывод
Способ объёмен, но понятен. Теперь давайте используем тот же функцию перевода из любой системы счисления в любую:
def convert_base(num, to_base=10, from_base=10):
# Перевод в десятичную систему
if isinstance(num, str): # Если число - строка, то ...
n = int(num, from_base) # ... переводим его в нужную систему счисления
else: # Если же ввели число, то ...
n = int(num) # ... просто воспринять его как число
# Перевод десятичной в 'to_base' систему
alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # Берём алфавит
if n < to_base: # Если число меньше системы счисления в которую переводить...
return alphabet[n] # ... вернуть значения номера в алфавите (остаток от деления)
else: # Иначе...
return convert_base(n // to_base, to_base) + alphabet[n % to_base] # ... рекурсивно обратиться к функии нахождения остатка
Вызвав функцию вывода print(convert_base(156, 16, 10))
мы переведём 156 из 10 в 16 систему счисления, а введя print(convert_base('23', 21, 4))
переведёт 23 из 4-ичной в 21-ичную систему (ответ: B).
Задача 2
Все задания беру из первого октябрьского варианта (он же вариант № 9325894) с сайта Решу.ЕГЭ.
Решение данной задачи совсем простое: банальный перебор.
print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы
for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1'
for x in range(2):
for z in range(2):
for w in range(2):
F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию
print(x, y, z, F) #Выводим результат
Результат:
Нам вывелась вся таблица истинности (1 = True, 0 = False). Но это не очень удобно. Обратите внимание, что в задании, функция равно 0, так и давайте подправим код:
print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы
for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1'
for x in range(2):
for z in range(2):
for w in range(2):
F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию
if not F:
print(x, y, z, F) #Выводим результат
Результат:
Далее — простой анализ.
Задача 5
Данная задача легко решается простой последовательностью действий в интерпретационном режиме:
Задача 6
Перепечатали и получили ответ:
s = 0
k = 1
while s < 66:
k += 3
s += k
print(k)
Задача 12
В очередной раз, просто заменим слова на код:
a = '9' * 1000
while '999' in a or '888' in a:
if '888' in a:
a = a.replace('888', '9', 1)
else:
a = a.replace('999', '8', 1)
print(a)
Задача 14
Компьютер железный, он всё посчитает:
a = 4 ** 2020 + 2 ** 2017 - 15
k = 0
while a > 0:
if a % 2 == 1:
k += 1
a = a // 2
print(k)
Задача 16
Опять же, просто дублируем программу в python:
def F(n):
if n > 0:
F(n // 4)
print(n)
F (n - 1)
print(F(5))
Результат:
Задача 17
Задача с файлом. Самое сложное — достать данные из файла. Но где наша не пропадала?!
with open("17.txt", "r") as f: #Открыли файл 17.txt для чтения
text = f.read() #В переменную text запихнули строку целиком
a = text.split("n") #Разбили строку энтерами (n - знак перехода на новую строку)
k = 0 #Стандартно обнуляем количество
m = -20001 #Так как у нас сумма 2-ух чисел и минимальное равно -10000, то минимум по условию равен -20000, поэтому...
for i in range(len(a)): #Обходим все элементы массива
if (int(a[i - 1]) % 3 == 0) or (int(a[i]) % 3 == 0): #Условное условие
k += 1 #Счётчик
if int(a[i - 1]) + int(a[i]) > m: #Нахождение минимума
m = int(a[i - 1]) + int(a[i])
print(k, m) #Вывод
Немного пояснений. Функция with() открывает файл считывает данные при помощи функции read() и закрывает файл. В остальном — задача стандартна.
Задача 19, 20 и 21
Все три задачи — задачи на рекурсию. Задачи идентичны, а вопросы разные. Итак, первая задача:
Пишем рекурсивную функцию и цикл перебора S:
def f(x, y, p): #Рекурсивная функция
if x + y >= 69 or p > 3: #Условия завершения игры
return p == 3
return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
for s in range (1, 58 + 1): #Перебор S
if f(10, s, 1): #Начали с 10 камней
print(s)
break
Немного пояснений. В рекурсивной функции существует 3 переменные x
— число камней в первой куче, y
— число камней во второй куче, p
— позиция. Позиция рассчитывается по таблице:
Игра |
Петя |
Ваня |
Петя |
Ваня |
Петя |
|
p |
1 |
2 |
3 |
4 |
5 |
6 |
Далее — всё по условию задачи.
Вторая задача на теорию игр:
Все отличия в рамке. Ну и код, соответственно, не сильно отличается:
def f(x, y, p): #Рекурсивная функция
if x + y >= 69 or p > 4: #Условия завершения игры
return p == 4
if p % 2 != 0:
return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
else:
return f(x + 1, y, p + 1) and f(x, y + 1, p + 1) and
f(x * 2, y, p + 1) and f(x, y * 3, p + 1) #Варианты действий
for s in range (1, 58 + 1): #Перебор S
if f(10, s, 1): #Начали с 10 камней
print(s)
Отличия:
-
Выиграл Петя, соответственно, позиция 4
-
Так как Петя не может выиграть за один ход — он выигрывает за 2 хода (and, а не or на нечётных позициях (играх Пети))
-
Убрали break, так как нам нужны все S, а не единственный
Последняя вариация задачи:
Сразу код:
def f(x, y, p): #Рекурсивная функция
if x + y >= 69 or p > 5: #Условия завершения игры
return p == 3 or p == 5
if p % 2 == 0:
return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
else:
return f(x + 1, y, p + 1) and f(x, y + 1, p + 1) and
f(x * 2, y, p + 1) and f(x, y * 3, p + 1) #Варианты действий
for s in range (1, 58 + 1): #Перебор S
if f(10, s, 1): #Начали с 10 камней
print(s)
Ну и всего лишь 2 отличия:
-
Позиции 3 или 5, а не 4, так как выиграл Ваня
-
На второй ход выигрывает Ваня и нам нужно or и and поменять. Я заменил только кратность 2.
Задача 22
Ctrl+C, Ctrl+V — наше всё!
for i in range(1, 100000):
x = i
L = 0
M = 0
while x > 0 :
L = L+1
if (x % 2) != 0:
M = M + x % 8
x = x // 8
if L == 3 and M == 6:
print(i)
Задача 23
Итак, код:
def f(x, y):
if x > y: #Перегнали цель
return 0
if x == y: #Догнали цель
return 1
if x < y: #Догоняем цель тремя методами
return f(x + 1, y) + f(x + 2, y) + f(x * 2, y)
print(f(3, 10) * f(10, 12)) #Прошло через 10, значит догнали 10 и от де догоняем 12
Так как в условии задачи мы увеличиваем число, но будем числа «догонять». Три метода описаны, ну а пройти через 10 — значит дойти до него и идти от него.
Собственно, это и есть вся первая часть ЕГЭ по информатике решённая на Python.
Ссылка на репозиторий со всеми программами:
Надеюсь, что смог помочь в своей статье выпускникам и готовящимся
Остался один вопрос — нужен ли разбор второй части ЕГЭ по информатике на Python? Оставлю этот вопрос на ваше голосование.
Всем удачи!
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Делаю разбор второй части?
Проголосовали 106 пользователей.
Воздержались 15 пользователей.
28 декабря 2021
В закладки
Обсудить
Жалоба
100 страниц с последовательным изложением базовых конструкций языка программирования Python с объяснением, как они работают.
Материал не про ЕГЭ, материал именно про язык программирования. И будет полезен тем, кто хочет разобраться, а не «заучить шаблоны для ЕГЭ».
py.pdf
Источник: vk.com/inform_web
Детальный разбор ВСЕЙ базы знаний языка программирования Python 3, которая действительно НУЖНА для сдачи экзамена! В курсе есть ВСЯ основная теория, которая обязательна к изучению при подготовке к ЕГЭ по информатике.
What you will learn
- Научитесь мыслить логически и нестандартно
- Изучите все необходимые основы Python 3
- Познакомитесь со многими функциями Python 3
- Узнаете о некоторых особенностях этого ЯП
- Примените теорию на практике
- Сможете легко сдать экзамен, используя Python 3
About this course
Видеокурс по ВСЕЙ теории Python 3 — это полноценный курс, в котором разобрана вся база знаний языка программирования Python 3, необходимая для решения задач из ЕГЭ по информатике, с ПОЛНОГО НУЛЯ! Каждая тема будет понятна даже НОВИЧКУ, ведь обучение включает в себя :
- ТЕОРИЮ по Python 3, необходимую для сдачи экзамена
- КОНТРОЛЬНЫЕ ВОПРОСЫ, чтобы вы смогли оценить уровень своих знаний
- ПРАКТИКУ, чтобы вы закрепили полученные знания и навыки
- ДОМАШНЕЕ ЗАДАНИЕ с разбором всех особенностей
- ПОДДЕРЖУ от преподавателя и единомышленников
- КОНСПЕКТ, который позволит легко повторить материал
- СОВЕТЫ о том, как и где «углубить» свои знания о Python 3
💖 Не стесняйтесь задавать любые вопросы в комментариях к курсу или же в нашей Беседе в VK :
👪Перейти в нашу Беседу в VK👈
✨Перейти в нашу Группу в VK👈
💯Посмотреть Отзывы Наших Учеников👈
✅ Пройдя курс ты изучишь ВСЮ базу знаний, необходимую для решения КИМа ЕГЭ по информатике, в том числе следующие темы 👇
- Переменные, типы данных, основные арифметические и логические операции, ввод / вывод значений
- Конструкции If, elif, else
- Циклы for и while
- Списки, генераторы списков, индексация списков, функции для списков
- Функции def и lambda, max и min
- Рекурсия
- Срезы, обработка строк
- Множества и словари
- Работа с файлами
🔥 Что тебя ждёт на курсе? 👇(Более подробное содержание в нашей группе в VK)
-
Блок 1 — Вся База Знаний ( Теория + ДЗ ) ~ 4 часа 30 мин.
❗ ВНИМАНИЕ!
- У курса нет старта. Вы можете начать его проходить в любой момент
- У курса нет подписок по месяцам. После покупки курса, вы получаете доступ к нему навсегда
- На курсе мы сначала рассказываем теорию, потом даём решить задачу, а после делаем видео-разбор с её решением
- На курсе задания проверяются автоматически. Ждать проверки преподавателем не нужно
📚 Источники Задач :
- Сайт kompege.ru
- Сайт kpolyakov.spb.ru
- Реальные ЕГЭ Демо-версии Досрочные волны Резервные дни Апробации
- СтатГрады Авторские Задачи
Whom this course is for
Курс создан для Школьников 10-11 классов, учителей и всех остальных, желающих сдавать ЕГЭ по Информатике
Initial requirements
Никакие начальные требования, не нужны. Научим всему с полного нуля
Meet the Instructors
How you will learn
-
При переходе к новой теме вы сначала получаете всю необходимую теорию, потом мы задаём несколько контрольных вопросов по теме, чтобы вы смогли оценить уровень своих знаний, ну а после даём закрепить полученные знания на практике
-
В течении всего курса у вас под рукой есть конспект по всем темам, чтобы вы могли быстро что-то вспомнить
-
В комментариях вы можете посмотреть чужие решения, чтобы лучше разобраться в теме, или даже прислать своё решение
-
Во время обучения у вас есть возможность задать преподавателю любой вопрос
Course content
What you will get
Share this course
https://stepik.org/course/122809/promo
Что необходимо знать из Python для ЕГЭ
Как данные в этом языке обрабатываются и какие есть основные конструкции — то, с чего начинается разговор о программировании.
Основные конструкции = способы создания алгоритма.
Цель на ЕГЭ для выпускников — научиться решать задачи с помощью Python.
Базовые знания этого языка программирования состоят из
- циклов;
- типов данных (хранение информации в вашей программе);
- условий;
- функций
Функция в Python — метод, позволяющий какие-то значения передать, преобразовать и что-то, в итоге, получить или не получить.
ЕГЭ-шные нюансы в Python
Если вы в Python разберётесь с особенностями программы, о которых мы рассказываем дальше, то станет гораздо проще решать задания на экзамене.
- списки, срезы, словари (необходимо посмотреть, как именно обрабатываются данные);
- обработка строк
- файлы (чтобы научиться с ними работать, необходимо выучить две команды — считать одну строку и считать все строки.
Самое важное в программирование — ЖЕЛАНИЕ разобраться во всех тонкостях и УМЕНИЕ их применять.
Ресурсы для освоения Python
- metanit.com;
- sobolearn.com;
- Платформа stepik;
- Платформа coursera;
- Бесплатный спецкурс, где Коля Касперский объясняет программу с нуля и рассказывает, как решать задания 6,12,16,17,24 и 27 для ЕГЭ.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter. Мы обязательно поправим!
Продолжаем наш видеокурс по подготовке к ЕГЭ по информатике 2022. Сегодня разоблачим второе задание!
Кто незнаком с основными логическими операциями, можете посмотреть прошлогоднюю статью по заданию 2 из ЕГЭ по информатике.
В этой статье будут раскрыты методики решения 2 задания через язык программирования Питон.
Будем перебирать для каждой логической переменной все возможные варианты в программе. А логическая переменная всего два значения может принимать: 1 или 0 (истину или ложь). Таким образом, если к примеру у нас 4 переменные, мы получим 24=16 различных комбинаций.
Кто знаком с мощнейшим методом для 2 задания из ЕГЭ по информатике, о котором я рассказывал в прошлогодней статье, тот поймёт, что мы будем применять тот же самый мощнейший метод, но автоматизированный с помощью питона.
Нам нужно будет запрограммировать логическую функцию на языке Питон. Вот таблица, которая поможет это сделать.
Логическая операция | Представление в Питоне |
Отрицание ¬ | not() |
Логическое умножение ∧ | and |
Логическое сложение ∨ | or |
Следование A ⟶ B | not(A) or B |
Равносильность ≡ | == |
Перейдём к практике решения задач задания 2 с помощью языка программирования Python.
Задача (Классическая)
Миша заполнял таблицу истинности логической функции F
(w → z) ∧ ((y → x) ≡ (z → y)),
но успел заполнить лишь фрагмент из трёх различных её строк, даже
не указав, какому столбцу таблицы соответствует каждая из переменных
w, x, y, z.
Определите, какому столбцу таблицы соответствует каждая из переменных
w, x, y, z.
В ответе напишите буквы w, x, y, z в том порядке, в котором идут
соответствующие им столбцы (сначала буква, соответствующая первому
столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы
в ответе пишите подряд, никаких разделителей между буквами ставить
не нужно.
Пример. Функция F задана выражением ¬x / y, зависящим от двух
переменных, а фрагмент таблицы имеет следующий вид.
В этом случае первому столбцу соответствует переменная y, а второму
столбцу – переменная x. В ответе следует написать: yx.
Решение:
Решать задачу будем с помощью шаблона на языке Python (Питон).
print('x y z w') for x in range(0, 2): for y in range(0, 2): for w in range(0, 2): for z in range(0, 2): if (not(w) or z) and ((not(y) or x) == (not(z) or y)): print(x, y, z, w)
В задаче у нас 4 переменные, значит, формируем 4 вложенных цикла. В каждом цикле перебираем все возможные значения для конкретной переменной. Мы перебираем значения 0 и 1.
Функция должна выдавать всегда 1 (единицу, истину). Внутри всех циклов прописываем условие, которое срабатывает как раз на истину. В этом условии прописываем нашу функцию. Если наша функция будет выдавать истину, то мы распечатаем значения переменных, при которых это произошло. Если функция будет выдавать ложь, значит, ничего распечатано не будет.
Четыре вложенных цикла проверяют все возможные варианты (24 = 16 вариантов), и мы получим таблицу истинности, почти такую же, как нам и дали в условии задачи.
Так же вверху печатаем названия переменных, чтобы знать, какие значения каким переменным принадлежат.
Запустим программу, и на экране распечатается табличка:
В получившийся табличке может быть больше строчек, чем в условии. Так же при поиске переменных нельзя опираться на порядок, в котором идут нули и единицы в нашей табличке. А можно опираться лишь на количество нулей и единиц в строчках или столбцах.
Можно вычеркнуть первую строчку и последнюю, потому что в таблице, которую дали в условии, в каждой строчке есть хотя бы один ноль и хотя бы одна единица.
Сразу видно, что первый столбец принадлежит переменной x, только там могут быть все единицы.
Второй столбец принадлежит переменной w, только там могут быть все нули.
У нас остались две пустые клеточки в самой таблице. Нам нужно где-то поставить единицу, а где-то ноль, потому что у нас остались столбцы с двумя единицами и одним нулём, а так же с двумя нулями и одной единицей. Если мы в третий столбец поставим единицу, а в четвёртый ноль, то первая строчка и вторая будут совпадать.
А в условии сказано, что строки не должны повторяться. Поэтому нужно ноль и единицу расставить наоборот.
Получается, что в третий столбец идёт z, а в четвёртый y
Ответ: xwzy
Посмотрим, как решать задачи второго задания из ЕГЭ по информатике, когда функция выдаёт нули в таблице истинности.
Задача (Классическая, закрепление)
Миша заполнял таблицу истинности функции (x ≡ ¬y) → ((x ∧ w) ≡ z), но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
Определите, какому столбцу таблицы соответствует каждая из переменных
w, x, y, z.
В ответе напишите буквы w, x, y, z в том порядке, в котором идут
соответствующие им столбцы (сначала буква, соответствующая первому
столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы
в ответе пишите подряд, никаких разделителей между буквами ставить
не нужно.
Пример. Функция F задана выражением ¬x / y, зависящим от двух
переменных, а фрагмент таблицы имеет следующий вид.
В этом случае первому столбцу соответствует переменная y, а второму
столбцу – переменная x. В ответе следует написать: yx.
Решение:
Воспользуемся программой на языке Python.
print('x y z w') for x in range(0, 2): for y in range(0, 2): for w in range(0, 2): for z in range(0, 2): if not( not(( x == (not(y)) )) or ((x and w) == z) ): print(x, y, z, w)
От прошлой программы эта программа отличается только функцией!
В таблице видим, что функция должна выдавать ноль. Поэтому в условии мы функцию «оборачиваем» в not().
После == операцию not() мы заключили в скобки, чтобы не было синтаксической ошибки.
Получаем следующую таблицу истинности:
Разгадаем, где какая переменная находится.
Последнюю строку из нашей таблицы можно вычеркнуть, потому что, если мы вычеркнем другую строку, то не получится столбца, где все три единицы, а он должен быть.
Получается, что второй столбец достаётся переменной z.
В первом столбце должно быть две единицы. На эту роль подходит переменная y.
В нашей таблице нет строчки, где все единицы, значит, во второй строчке в пустом окошке выставляем ноль. И в этой строчке нулём обладает переменная x. Следовательно, в третьем столбце будет находится x.
А в последний столбец идёт переменная w по остаточному принципу.
Ответ: yzxw
А как Питон справится с более сложной функцией из примерного варианта ЕГЭ по информатике?
Задача (Сложная функция)
Логическая функция F задаётся выражением ((x → y ) ∧ (y → w)) ∨ (z ≡ ( x ∨ y)).
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F.
Определите, какому столбцу таблицы истинности соответствует каждая из переменных x, y, z, w.
В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы (сначала — буква, соответствующая первому столбцу; затем — буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Пример. Пусть задано выражение x → y, зависящее от двух переменных x и y, и фрагмент таблицы истинности:
Тогда первому столбцу соответствует переменная y, а второму столбцу соответствует переменная x. В ответе нужно написать: yx.
Источник задачи сайт решу ЕГЭ: https://inf-ege.sdamgia.ru/
Решение:
Запрограммируем функцию на языке Python.
print('x y z w') for x in range(0, 2): for y in range(0, 2): for w in range(0, 2): for z in range(0, 2): if not( ((not(x) or y) and (not(y) or w)) or (z == (x or y)) ): print(x, y, z, w)
Запустим программу и расставим переменные по своим местам.
Переменная z может быть только в третьем столбце.
Во второй столбец идёт переменная w, только этот столбец может иметь одну единицу.
Посмотрим на строчку, где у w стоит единица. В этой же строчке и у x единица. Значит, x идёт в последний столбец, а y в первый столбец.
Ответ: ywzx
Тот же шаблон работает, когда у нас во втором задании три переменные.
Задача (Три переменные)
(№ 1608) Логическая функция F задаётся выражением (¬x ∧ z) ∨ (¬x ∧ ¬y ∧ ¬z)
На рисунке приведён фрагмент таблицы истинности функции F, содержащий все наборы аргументов, при которых функция F истинна. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z.
Источник задачи сайт К. Ю. Полякова: https://kpolyakov.spb.ru/
Решение:
Для трёх переменных шаблон на Питоне отлично работает.
print('x y z') for x in range(0, 2): for y in range(0, 2): for z in range(0, 2): if (not(x) and z) or (not(x) and not(y) and not(z)): print(x, y, z)
Здесь и так понятно, куда какая переменная идёт.
Ответ: yxz
Посмотрим, как решать задачи из второго задания ЕГЭ по информатике, когда в таблице истинности разные значения у функции F.
Задача (Разные значения функции)
Логическая функция F задаётся выражением (¬a ∨ b ∨ ¬c) ∧ (b ∨ ¬c). Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных a, b, c.
В ответе напишите буквы a, b, c в том порядке, в котором идут соответствующие им столбцы (без разделителей).
Источник задачи сайт К. Ю. Полякова: https://kpolyakov.spb.ru/
Решение:
Когда такая ситуация, что функция имеет различные значения в таблице, мы можем проверить, какие значения переменных дают единицу у всей функции. А потом проверить, какие значения выдают ноль у всей функции, если это потребуется.
print('a b c') for a in range(0, 2): for b in range(0, 2): for c in range(0, 2): if (not(a) or b or not(c)) and (b or not(c)): print(a, b, c)
В таблице 6 строчек, в которых главная функция превращается в единицу. Далее эти строчки и будем рассматривать. У нас тоже получилось 6 строчек.
Переменная a имеет три единицы. Это второй столбец, потому что там три единицы.
Переменная b имеет четыре единицы, значит, она расположена в первом столбце.
Переменной c достаётся последний столбец.
Ответ: bac
Ещё одна интересная задача для подготовки к ЕГЭ по информатике 2022.
Задача(С подвохом)
Логическая функция F задаётся выражением a ≡ b ∨ b → c.
На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных a, b, c.
Источник задачи группа Евгения Джобса: https://vk.com/inform_web
Решение:
Подвох заключается в том, что если мы переведём бездумно функцию на язык Питон, то получится a==b or not(b) or c. Но у нас существуют приоритеты для логических операций, которые описаны в прошлогодней статье по подготовке к ЕГЭ по информатике.
В начале должно обрабатываться или, которое было изначально. Затем должно обработаться следование, а потом равносильность. А если мы переведём формулу бездумно, порядок будет не правильный.
Операцию b ∨ b можно представить, как просто b. Ведь, если b принимает значение 0, тогда будет 0 ∨ 0 = 0. Если значение будет 1, то 1 ∨ 1 = 1. Поэтому формулу можно переписать следующим образом:
a ≡ b → c
a == (not(b) or c)
В предыдущих задачах нам не приходилось думать над приоритетами, потому что везде были расставлены скобки. И в основном они уже расставлены в задачах второго задания из ЕГЭ по информатике.
Дальше решаем как обычно.
print('a b c') for a in range(0, 2): for b in range(0, 2): for c in range(0, 2): if a == (not(b) or c): print(a, b, c)
Последнюю строчку можно вычеркнуть из нашей таблицы, т.к. у нас в каждой строчке есть хотя бы один ноль.
Последний столбец занимает переменная a, т.к. только в последний столбец может влезть две единицы.
В строчке, где у a ноль, так же ноль и у переменной c. Значит, во второй столбец идёт переменная c. Если мы ноль поставим в первой строчке в первом столбце, то получится первый столбец из всех нулей. А такого у нас в таблице истинности нет.
Тогда переменная b в первом столбце.
Ответ: bca
слишком много лишних скобок ни к чему. Код очень грязный
А есть какой-нибудь простой код, который смог бы помочь с таким заданием: «Сколькими способами можно поставить в соответствие переменные w, x, y, z столбцам таблицы истинности функции F, опираясь на информацию из данного фрагмента?», или же в данном случае нужно самому подбирать комбинации?
Доброго времени суток, есть вопрос про операции в последней задаче. Вот там написано что b ∨ b можно представить как b. А если будет b ∧ b, то это можно будет представить как b? И можете объяснить почему?
Как в циклах идут переменные, это не важно. Это просто перебор всех возможных вариантов.
Володя, b ∧ b = b, эти формулы приведены в материале, на который я даю ссылку в начале статьи.
Программирование на Phyton. ЕГЭ 2022
Урок 1 из 5. Основы
Языки программирования бывают разные, например, для веба хорошо подходит PHP, а если хочешь написать ОС, то лучше всего Си. В принципе, большинство современных языков – полные, то есть на любом из них можно написать что угодно: хоть сайт, хоть игру.
Но не рекомендую вам писать видеоигры на Паскале:)
Какой язык лучше всего учить сейчас? Он должен отвечать двум критериям:
- Не очень сложный синтаксис: его нужно успеть освоить в совершенстве за учебный год. Поэтому если вы не знаете Java, например, то лучше оставить его на потом;
- На нем должно быть удобно решать задачи из ЕГЭ (спасибо, кэп).
Ну, что, вы уже догадались, к чему я веду?:)
Конечно, нам подходит Python. У него простой синтаксис, и, главное, – очень много встроенных функций, которые существенно облегчают жизнь.
Например, сравните код на Паскале и на Питоне для вот этой задачи:
Дана строка, у которой могут быть пробелы в начале, в конце и между словами может оказаться более одного пробела. Уберите все лишние пробелы, т.е. удалите все пробелы в начале и конце, а между словами оставьте только один пробел.
Паскаль:
var s: string;
begin
readln(s);
p := 0;
while s[p] = ‘ ‘ do
delete(s, p, 1); {удаляем все пробелы в начале}
p := length(s);
while s[p] = ‘ ‘ do begin
delete(s, p, 1); {удаляем все пробелы в конце}
p := p – 1;
end;
p := pos(s, ‘ ‘);
while pos(s, ‘ ‘) <> 0 do
begin
delete(s, p, 1); {удаляем один пробел каждый раз, когда встретили два пробела подряд}
p := pos(s, ‘ ‘);
end;
writeln(s)
end.
Питон:
s = input().strip() # считываем и сразу удаляем лишние пробелы вначале и в конце
while s.find(‘ ‘) >= 0:
s = s.replace(‘ ‘, ‘ ‘) # заменяем два пробела на один
print(s)
Если вы думаете, что будет что-то ещё, вы ошибаетесь: это и есть вся программа 🙂 Некоторые программы на питоне вообще можно написать в одну строку!
В общем, думаю, я вас заинтересовал. А если вы хотите научиться так же влёгкую решать задачки из ЕГЭ (а потом и более сложные, то есть становиться программистом), вам самое время смотреть первый вебинар марафона “Программирование на Phyton!”
РЕШЕНИЕ
ЗАДАЧ компьютерного ЕГЭ НА ЯЗЫКЕ PYTHON
В
школьном курсе информатики после введения компьютерного ЕГЭ возникла
необходимость «перестроиться» с языка программирования Pascal на Phyton, который обладает простым и понятным
синтаксисом и позволяет обрабатывать большие числа, что является необходимым
для решения заданий из блока «Программирование». Для обучающихся была создана
следующая «памятка» с описанием синтаксиса операторов Python и примерами решений некоторых задач КЕГЭ.
Для
ввода информации пользователем используется функция input() – эта функция
считывает строку из консоли, введенную пользователем. Для вывода результата – print.
Ниже представлена
таблица с примерами использования:
Функция |
Описание |
n = |
Считывание Тип по |
a = |
Считывание |
a = |
Считывание |
Математические
операции
Операция |
Символ |
Пример |
Возведение |
** |
print(6 |
Целая |
// |
print(7 |
Остаток |
% |
print(8 |
Условный
оператор
Условий внутри одного оператора может быть несколько, в таком
случае они проверяются последовательно и выполняются команды для того условия,
которое первым окажется истинным:
Для проверки условий в
Python используются операторы сравнения:
Символ |
Смысл |
Пример |
== |
равно |
a == b |
!= |
не равно |
a != b |
and |
конъюнкция |
a > 5 |
or |
дизъюнкция |
a > 5 |
not |
логическое |
not(b |
Циклы ПОКА и ДЛЯ
Командное
слово для цикла – while (после условия – двоеточие), а команды цикла
записываются на отступе от строки, инициализирующей цикл.
С
помощью range() можно задавать диапазон значений, которая будет принимать любая
численная переменная с некоторым шагом.
У
функции range всего может быть три аргумента:
·
Начало (включается в диапазон, по умолчанию равен 0);
·
Конец (не включается в диапазон);
·
Шаг (по умолчанию равен 1).
Пример:
Значения range |
Сгенерированная последовательность |
range(5) |
0, |
range(3, |
3, |
range(2, |
2, |
range(10, |
10, |
Задание
№6 (КЕГЭ)
В задании №6 в блоке «Программирование» проверяется умение
работать с прогрессиями,
Пример
1
Определите, при
каком наибольшем введенном значении переменной s программа
выведет число 1250.
s = int(input())
s = s // 10
n = 1
while n < 400:
s
= s + n
n
= n * 2
print(s)
Перебираем в цикле for
с большим интервалом переменную s:
for i in range(100000):
s = i
s = s // 10
n = 1
while n < 400:
s = s + n
n = n * 2
if s = = 1250:
print(i)
Вывод
на
экран:
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
Ответ: 7399
Пример
2
Определите, при каком наименьшем введенном
значении переменной s программа выведет число 310.
s = int(input())
s = s // 10
n = 0
while n <= 56:
s
= s + n
n
= n + 7
print(s)
Используем тот же метод решения:
for i in range(100000):
s = i
s = s // 10
n = 0
while n <= 56:
s = s + n
n = n + 7
if s = = 310:
print(i)
Вывод
на
экран:
580
581
582
583
584
585
586
587
588
589
Ответ: 580
Пример решения задания №6 из
тренировочной работы системы Статград за 17.12.2021 г.
for i in range(1000000):
s = i
s = s // 10
n = 1
while s < 221:
if n % 2 == 0:
s = s + 13
n = n + 5
if n == 121:
print(i)
Вывод на
экран:
735
736
…..
779
Ответ: 779
Задание
14 (КЕГЭ)
Данное задание связано
с переводом из одной позиционной системы счисления в другую и умением работать
с такими системами счисления.
Метод |
Описание |
Пример |
Получение последней цифры числа |
Пусть n – это число, a – Тогда остаток от деления n на a – |
|
Получение числа без последней цифры |
Пусть n – это число, a – Тогда результат деления нацело n на a – Например, 8 = 10002 8 // 2 = 4 4 = 1002 Было число, равное 10002 – стало число, равное |
|
Разложение числа на разряды в любой системе счисления |
Пусть n – это число, a – Используем программу перебора
|
|
Пример 1
Сколько единиц
содержится в двоичной записи значения выражения 416 + 236 – 16?
x = 4**16 + 2**36 — 16
k = 0
while x > 0:
if x % 2 = = 1:
k += 1
x = x // 2
print(k)
Ответ:
29
Пример
2
Значение
арифметического выражения: 918 + 354 – 9 – записали в
системе счисления с основанием 3. Сколько цифр «2» содержится в этой записи?
x = 9**18 + 3**54
— 9
k = 0
while x > 0:
if
x % 3 = = 2:
k += 1
x = x // 3
print(k)
Ответ:
34
Пример
3
Значение арифметического выражения: 5 ×
2161156 – 4 × 361147 + 61153 – 875 — записали
в системе счисления с основанием 6. Определите разность между количеством цифр
5 и количеством нулей в записи этого числа.
x = 5 * 216**1156 — 4 *
36**1147 + 6**1153 — 875
k5 = 0
k0 = 0
while x > 0:
if x % 6 == 5:
k5 += 1
if x % 6 == 0:
k0 += 1
x = x // 6
print(k5-k0)
Ответ:
1182
Пример решения задания №14 из
тренировочной работы системы Статград за 17.12.2021 г.
x =3*125**6 + 2*25**9 + 5**12 — 625
k = 0
while x>0:
d = x % 5
if d = = 0:
k +=1
x = x//5
print(k)
Ответ:
11
Задание
16 (КЕГЭ)
Задание
на рекурсивный алгоритм. Здесь используются функции — именованные наборы
команд, которые записываются один раз и могут быть вызваны из любого места в
программе.
Пример 1
Алгоритм
вычисления значения функции F(n), где n — натуральное число,
задан следующими соотношениями.
F(n) = n + 2 при n ≤ 3;
F(n) = F(n – 2) + F(n – 1) при
n > 3.
Чему
равно значение функции F(30)?
def F(n):
if n
<= 3:
return n + 2
else:
return F(n — 2) + F(n — 1)
print(F(30))
Ответ: 2374727
Пример 2. Вложенное
ветвление
Алгоритм
вычисления значения функции F(n), где n — натуральное число,
задан следующими соотношениями.
F(n)
= 3 ⋅ n + 6 при n ≤ 2;
F(n)
= F(n – 2) + 2 ⋅ F(n
– 1) при n > 2 и n — четное число;
F(n)
= 10 + F(n – 4) при n > 2 и n — нечетное число.
Чему равно
значение функции F(18)?
def F(n):
if n
<= 2:
return 3*n + 6
else:
if
n % 2 == 0:
return F(n — 2) + 2*F(n — 1)
else:
return 10 + F(n — 4)
print(F(18))
Ответ:
508
Пример 3. Перекрестные
функции
Алгоритмы
вычисления значения функций F(n)
и G(n),
где n
— натуральное число, заданы следующими соотношениями.
F(n)
= n
+ 9 при n < 3;
F(n)
= 2 ⋅ F(n
– 1) + 3 ⋅ G(n
– 2) при n ≥ 3.
G(n)
= 25 – n при n
< 4;
G(n)
= 4 ⋅ G(n
– 1) – F(n
– 2) при n ≥ 4.
Чему равно
значение функции G(13)?
def F(n):
if n
< 3:
return n + 9
else:
return 2*F(n — 1) + 3*G(n — 2)
def G(n):
if n
< 4:
return 25 — n
else:
return 4*G(n — 1) — F(n — 2)
print(G(13))
Ответ:
3781546
Пример 4. Перекрестные функции. Сумма значений
Алгоритмы
вычисления значения функций F(n) и G(n), где n — натуральное число, заданы следующими соотношениями.
F(n) = n + 3 при n < 4;
F(n) = F(n – 4) + 3 ⋅ G(n – 2) + G(n – 1) при n ≥ 4.
G(n) = 3 ⋅ n при n < 5;
G(n) = F(n – 1) + G(n – 3) – F(n – 2) при n ≥ 5.
Чему
равна сумма значений функций G(20) и F(18)?
def F(n):
if n
< 4:
return n + 3
else:
return F(n — 4) + 3*G(n — 2) + G(n — 1)
def G(n):
if n
< 5:
return 3*n
else:
return F(n — 1) + G(n — 3) — F(n — 2)
print(F(18)
+ G(20))
Ответ:
4075
Пример решения задания №16 из
тренировочной работы системы Статград за 17.12.2021 г.
def F(n):
if n ==
0:
return 0
if n %
3 == 2:
return F(n — 1) + 1
if n %
3 < 2:
return F((n — n % 3) // 3)
for i in
range(10000):
if F(i)
= = 6:
print(i)
break
Ответ:
728
Задание
2 (КЕГЭ)
Пример решения задания №2 из
тренировочной работы системы Статград за 17.12.2021 г.
Переборный алгоритм позволяет получить
таблицу для ложных значений функции F,
которую необходимо соотнести с таблицей в задании.
print(‘x y w z’)
for x in range(2):
for y in range(2):
for w in
range(2):
for z in
range(2):
if
(((x<=y) and (z or w)) <= ((x == w) or (y and not(z)))) = = 0:
print(x,y,w,z)
Вывод на экран:
x y w z
0
0 1 0
0
0 1 1
0
1 1 1
1
1 0 1
Ответ: yxwz