Вся теория python для егэ

Доброго времени суток каждому жителю Хабрвилля! Давненько я не писал статей! Пора это исправить!

В сегодняшней статье поговорим о насущной для многих выпускников школ теме — ЕГЭ. Да-да-да! Я знаю, что Хабр — это сообщество разработчиков, а не начинающих айтишников, но сейчас ребятам как никогда нужна поддержка именно сообщества. Ребят опять посадили на дистант. Пока не ясно на какой период, но уже сейчас можно сказать, что ЕГЭ по информатике будет на компьютерах и его можно зарешать при помощи языка 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)

Отличия:

  1. Выиграл Петя, соответственно, позиция 4

  2. Так как Петя не может выиграть за один ход — он выигрывает за 2 хода (and, а не or на нечётных позициях (играх Пети))

  3. Убрали 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 отличия:

  1. Позиции 3 или 5, а не 4, так как выиграл Ваня

  2. На второй ход выигрывает Ваня и нам нужно 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? Оставлю этот вопрос на ваше голосование.

Всем удачи!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Делаю разбор второй части?

Проголосовали 105 пользователей.

Воздержались 15 пользователей.

Детальный разбор ВСЕЙ базы знаний языка программирования 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

28 декабря 2021

В закладки

Обсудить

Жалоба

100 страниц с последовательным изложением базовых конструкций языка программирования Python с объяснением, как они работают.

Материал не про ЕГЭ, материал именно про язык программирования. И будет полезен тем, кто хочет разобраться, а не «заучить шаблоны для ЕГЭ».

py.pdf

Источник: vk.com/inform_web

Что необходимо знать из Python для ЕГЭ

Как данные в этом языке обрабатываются и какие есть основные конструкции — то, с чего начинается разговор о программировании. 

Основные конструкции = способы создания алгоритма.

Цель на ЕГЭ для выпускников — научиться решать задачи с помощью Python. 

Базовые знания этого языка программирования состоят из

  • циклов;
  • типов данных (хранение информации в вашей программе);
  • условий;
  • функций

Функция в Python — метод, позволяющий какие-то значения передать, преобразовать и что-то, в итоге, получить или не получить.

ЕГЭ-шные нюансы в Python

Если вы в Python разберётесь с особенностями программы, о которых мы рассказываем дальше, то станет гораздо проще решать задания на экзамене.

  • списки, срезы, словари (необходимо посмотреть, как именно обрабатываются данные);
  • обработка строк
  • файлы (чтобы научиться с ними работать, необходимо выучить две команды — считать одну строку и считать все строки.

Самое важное в программирование — ЖЕЛАНИЕ разобраться во всех тонкостях и УМЕНИЕ их применять.

Ресурсы для освоения Python

  • metanit.com;
  • sobolearn.com;
  • Платформа stepik;
  • Платформа coursera;
  • Бесплатный спецкурс, где Коля Касперский объясняет программу с нуля и рассказывает, как решать задания 6,12,16,17,24 и 27 для ЕГЭ. 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter. Мы обязательно поправим!

Продолжаем наш видеокурс по подготовке к ЕГЭ по информатике 2023!

Сегодня разберём задачи из 19, 20 и 21 задания ЕГЭ по информатике. Для этих задач существует спасительный шаблон на Python, который позволяет получить на них правильные ответы и затратить минимум сил и времени.

Приступим к первой серии задач из демоверсии ЕГЭ по информатике 2021 года.

Задание 19 (Демо 2021)

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат
две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один
ход игрок может добавить в одну из куч (по своему выбору) один камень
или увеличить количество камней в куче в два раза. Например, пусть
в одной куче 10 камней, а в другой 5 камней; такую позицию в игре будем
обозначать (10, 5). Тогда за один ход можно получить любую из четырёх
позиций: (11, 5), (20, 5), (10, 6), (10, 10). Для того чтобы делать ходы,
у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах
становится не менее 77. Победителем считается игрок, сделавший
последний ход, т.е. первым получивший такую позицию, при которой
в кучах будет 77 или больше камней.

В начальный момент в первой куче было семь камней, во второй куче –
S камней; 1 ≤ S ≤ 69.

Будем говорить, что игрок имеет выигрышную стратегию, если он может
выиграть при любых ходах противника. Описать стратегию игрока – значит
описать, какой ход он должен сделать в любой ситуации, которая ему может
встретиться при различной игре противника. В описание выигрышной
стратегии не следует включать ходы играющего по этой стратегии игрока,
не являющиеся для него безусловно выигрышными, т.е. не являющиеся
выигрышными независимо от игры противника.

Известно, что Ваня выиграл своим первым ходом после неудачного первого
хода Пети. Укажите минимальное значение S, когда такая ситуация
возможна.

Решение:

Решим задачу с помощью шаблона на языке программирования Python. Если хотите ознакомится с аналитическим решением задач на теорию игр, можете посмотреть мои статьи по 19 Заданию, 20 Заданию, 21 Заданию. Но с помощью шаблонов на экзамене решать быстрее и легче.

Введём параметр p, который будет олицетворять позицию игры (ход).

Начальная позиция Ход Пети Ход Вани Ход Пети Ход Вани Ход Пети
p 1 2 3 4 5 6
def F(x, y, p):
    if x + y >= 77 and p==3: return True
    if x + y < 77 and p==3: return False

    return F(x+1, y, p+1) or F(x*2, y, p+1) or F(x, y+1, p+1) or F(x, y*2, p+1)
  

for s in range(1, 70):
    if F(s, 7, 1):
        print(s)

Заводим функцию F. Она принимает параметры: x — количество камней в одной куче, y — в другой, p-позиция игры.

Дальше описываем победу. Если x+y>=77 и позиция равна 3 (1 Ход Вани), то возвращаем True, что означает победу.

Если, позиция уже равна 3, но сумарное количество камней меньше, чем должно быть для победы, то возвращаем False (проигрыш).

Если мы не вышли на первых двух условиях, то, значит, продолжаем прокручивать ходы, рекурсивно запускаем функцию F.

Т.к. здесь формулировка: «Известно, что Ваня выиграл своим первым ходом после неудачного первого
хода Пети.», то между функциями ставим союз ИЛИ (or).

В конце перебираем все возможные значения для s через цикл for, ищём те значения, которые подходят по условию задачи. Значение p всегда увеличиваем на 1.

Ответ: 18

Задание 20 (Демо 2021)

Для игры, описанной в предыдущем задании, найдите два таких значения S,
при которых у Пети есть выигрышная стратегия, причём одновременно
выполняются два условия:

− Петя не может выиграть за один ход;

− Петя может выиграть своим вторым ходом независимо от того, как
будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания.

Решение:

Легко переделать из прошлой задачи.

def F(x, y, p):
    if x + y >= 77 and p==4: return True
    if x + y < 77 and p==4: return False
    if x + y >= 77: return False

    if p%2==0:
        return F(x+1, y, p+1) and F(x*2, y, p+1) and F(x, y+1, p+1) and F(x, y*2, p+1)
    else:
        return F(x+1, y, p+1) or F(x*2, y, p+1) or F(x, y+1, p+1) or F(x, y*2, p+1)
  

for s in range(1, 70):
    if F(s, 7, 1):
        print(s)

Теперь должен выигрывать Петя на своём втором ходе. Поэтому в условиях ставим позицию p=4.

Добавляется третье условие. Если кто-то выиграл, но на первых двух условиях мы не вышли из функции, то, значит, выиграл не тот, кто нам нужен, следовательно, возвращаем Fasle.

Здесь вопрос отличается от 19 задания. Здесь Петя должен побеждать при любом ходе соперника, а не при одном неудачном ходе Вани, поэтому добавляется ещё условие.

Для чётных p (это ходы Пети), возвращаем разные ходы через and, т.к. он должен побеждать в любом случае.

Для нечётных p (это ходы Вани), возвращаем ходы через or.

Ответ:

Задание 21 (Демо 2021)

Для игры, описанной в задании 19, найдите минимальное значение S, при
котором одновременно выполняются два условия:

– у Вани есть выигрышная стратегия, позволяющая ему выиграть
первым или вторым ходом при любой игре Пети;

– у Вани нет стратегии, которая позволит ему гарантированно
выиграть первым ходом.

Решение:

Опять используем прошлый шаблон, но немного модернизируем.

def F(x, y, p):
    if x + y >= 77 and (p==3 or p==5): return True
    if x + y < 77 and p==5: return False
    if x + y >= 77: return False

    if p%2==1:
        return F(x+1, y, p+1) and F(x*2, y, p+1) and F(x, y+1, p+1) and  F(x, y*2, p+1)
    else:
         return F(x+1, y, p+1) or F(x*2, y, p+1) or F(x, y+1, p+1) or  F(x, y*2, p+1)


def F1(x, y, p):
    if x + y >= 77 and p==3: return True
    if x + y < 77 and p==3: return False
    if x + y >= 77: return False

    if p%2==1:
        return F1(x+1, y, p+1) and F1(x*2, y, p+1) and F1(x, y+1, p+1) and  F1(x, y*2, p+1)
    else:
         return F1(x+1, y, p+1) or F1(x*2, y, p+1) or F1(x, y+1, p+1) or  F1(x, y*2, p+1)

for s in range(1, 70):
    if F(s, 7, 1):
        print(s)

print()

for s in range(1, 70):
    if F1(s, 7, 1):
        print(s)

Здесь Ваня должен выигрывать либо на первом своём ходе (p=3), либо на втором своём ходе (p=5).

Т.к. Ваня не должен гарантированно выиграть своим первым ходом, то мы создаём ещё одну функцию F1, похожую на основную функцию F, которая вычисляет, когда Ваня именно гарантированно выигрывает на своём первом ходе (p=3). И, затем, мы из тех чисел, которые получились в первой функции F, исключаем числа, которые получились во второй функции F1.

В первой функции получилось 30,33, а во второй результатов нет. Получается ответ 30.

Ответ: 30

Следущая вариация задач отличается от первой лишь задачей в 19-ом задании. Рассмотрим демоверсию ЕГЭ по информатике 2022. Так же в этой серии задач будет одна куча, но из-за этого шаблон практически никак не меняется.

Задание 19 (Демо 2022)

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит
куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход
игрок может добавить в кучу один камень или увеличить количество камней
в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть
неограниченное количество камней.

Игра завершается в тот момент, когда количество камней в куче становится
не менее 29. Победителем считается игрок, сделавший последний ход,
т.е. первым получивший кучу, в которой будет 29 или больше камней.

В начальный момент в куче было S камней, 1 ≤ S ≤ 28.

Будем говорить, что игрок имеет выигрышную стратегию, если он может
выиграть при любых ходах противника. Описать стратегию игрока – значит
описать, какой ход он должен сделать в любой ситуации, которая ему может
встретиться при различной игре противника. В описание выигрышной
стратегии не следует включать ходы играющего по этой стратегии игрока,
не являющиеся для него безусловно выигрышными, т.е. не являющиеся
выигрышными независимо от игры противника.

Укажите такое значение S, при котором Петя не может выиграть за один ход,
но при любом ходе Пети Ваня может выиграть своим первым ходом.

Решение:

Здесь вопрос отличается от прошлой 19-ой задачи. Здесь Петя должен выиграть в любом случае. Мы эту задачу можем воспринимать, как 20-ую из демоверсии 2021. Ведь там тоже игроку нужно обязательно было побеждать. Осталось написать шаблон с соответствующими параметрами.

def F(x, p):
    if x>=29 and p==3: return True
    if x<29 and p==3: return False
    if x>=29: return False

    if p%2==1:
        return F(x+1, p+1) and F(x*2, p+1)
    else:
         return F(x+1, p+1) or F(x*2, p+1)

for s in range(1, 29):
    if F(s, 1):
        print(s)

Заводим функцию F. Т.к. у нас одна куча, то она принимает параметры: x — количество камней в куче, p-позиция игры.

Дальше описываем победу. Если x>=29 и позиция равна 3 (1 Ход Вани), то возвращаем True, что означает победу.

Если, позиция уже равна 3, но камней меньше, чем должно быть для победы, то возвращаем False (проигрыш).

Третье условие. Если кто-то выиграл, но на первых двух условиях мы не вышли из функции, то, значит, выиграл не тот, кто нам нужен, следовательно, возвращаем Fasle.

Если мы не вышли на первых трёх условиях, то, значит, продолжаем прокручивать ходы, рекурсивно запускаем функцию F.

Для нечётных p (это ходы Вани), возвращаем разные ходы через and, т.к. он должен побеждать в любом случае. При этом увеличиваем на 1 значение p.

Для чётных p (это ходы Пети), возвращаем ходы через or.

В конце перебираем все возможные значения для s через цикл for, ищём те значения, которые подходят по условию задачи.

Ответ: 14

Задание 20 (Демо 2022)

Для игры, описанной в задании 19, найдите два таких значения S, при
которых у Пети есть выигрышная стратегия, причём одновременно
выполняются два условия:

− Петя не может выиграть за один ход;

− Петя может выиграть своим вторым ходом независимо от того, как
будет ходить Ваня.

Найденные значения запишите в ответе в порядке возрастания.

Решение:

Задача точно такая же, как и в 19 задании, только теперь обязательно должен побежать Петя на своём втором ходу (p=4), при любой игре Вани.

Пишем тот же шаблон, немного отредактировав его.

def F(x, p):
    if x>=29 and p==4: return True
    if x<29 and p==4: return False
    if x>=29: return False

    if p%2==0:
        return F(x+1, p+1) and F(x*2, p+1)
    else:
         return F(x+1, p+1) or F(x*2, p+1)

for s in range(1, 29):
    if F(s, 1):
        print(s)

Получается 7 и 13.

Ответ:

Задание 21 (Демо 2022)

Для игры, описанной в задании 19, найдите значение S, при котором
одновременно выполняются два условия:

− у Вани есть выигрышная стратегия, позволяющая ему выиграть
первым или вторым ходом при любой игре Пети;

− у Вани нет стратегии, которая позволит ему гарантированно выиграть
первым ходом.

Если найдено несколько значений S, в ответе запишите минимальное из них.

Решение:

Опять используем прошлый шаблон, но немного модернизируем.

def F(x, p):
    if x>=29 and (p==3 or p==5): return True
    if x<29 and p==5: return False
    if x>=29: return False

    if p%2==1:
        return F(x+1, p+1) and F(x*2, p+1)
    else:
         return F(x+1, p+1) or F(x*2, p+1)


def F1(x, p):
    if x>=29 and p==3: return True
    if x<29 and p==3: return False
    if x>=29: return False

    if p%2==1:
        return F1(x+1, p+1) and F1(x*2, p+1)
    else:
         return F1(x+1, p+1) or F1(x*2, p+1)

for s in range(1, 29):
    if F(s, 1):
        print(s)

print()

for s in range(1, 29):
    if F1(s, 1):
        print(s)

Здесь Ваня должен выигрывать либо на первом своём ходе (p=3), либо на втором своём ходе (p=5).

Т.к. Ваня не должен гарантированно выиграть своим первым ходом, то мы создаём ещё одну функцию F1, похожую на основную функцию F, которая вычисляет, когда Ваня именно гарантированно выигрывает на своём первом ходе (p=3). И, затем, мы из тех чисел, которые получились в первой функции F, исключаем числа, которые получились во второй функции F1.

В первой функции получилось 12,14, а во второй 14. Получается ответ 12.

Ответ: 12

На сегодня всё. Мы рассмотрели самые распространённые вариации задач из 19-21 задания и подобрали к ним «противоядие». До новых встреч!

В первой 21 задаче в функции F1 только камни x сраниваются с 77. Там надо x + y как в основной функции?

Да, Вы правы, нужно x+y писать. Исправил, спасибо!

Почему начальная позиция p=1? Нельзя ли её сделать р=0?
Дабы избежать у учеников путаницы в голове по нумерации ходов. Или в этом скрывается ошибка?
Извините хотел оперативный ответ от Мастера, т.к. нет времени на эксперименты.

На мой взгляд, можно, поменяв соответствующие параметры тоже. Но не будет ли путаницы, если ваши ученики будут находить решения в интернете, где начинается p c 1.

В первом 19ом задании в функции def мне кажется, что не хватает строки if x + y >= 77: return False
Спасибо за Ваш труд!

Нет, там всё в порядке. В формулировке, когда «после неудачного первого хода Пети», можно писать два условия.

я не понимаю почему вы в первых задачах пишите в конце программы строку » if F1(s, 7, 1):»

Проверяем подходит ли значение s под условие задачи. Семёрка — это количество каменей в первой куче.

Спасибо, за последовательность объяснения. все очень понятно.

почему то в 20 задании находит только одно значение, уже несколько вариантов КИМа так, код написан правильно. В чём причина может быть?

Пришлите ссылку на задание.

Задание 21 из КИМа ЕГЭ 2023 по информатике 17 вариант(к примеру). Можно положить 1 камень или умножить количество на 2, Если больше или равно 144 в сумме двух куч, то победа.В первой куче 3 камня, во второй 1

от 1 до 140(включительно). Условия те же. Также неверные ответы получаются в 19 и 20 заданиях. Код правильный

КИМ это оффициальный сборник вариантов в виде книжки. Могу условия на почту скинуть(хотя вроде расписал всё), тут ограничение символов

Понятно, тогда посмотрю и напишу здесь, что думаю.

Решил 17 вариант (задания 19-21) из сборника 2023 года Крылова, Чуркиной по схеме из этой статьи. Ответы сошлись. Могу вам прислать решения, если вы напишите в группе в вк.

Программирование на 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!”

Урок 1

MOSH:
Python Tutorial — Python Full Course for Beginners here
00:13:03 Variables
00:18:21 Receiving Input

MOSH:
Python Tutorials for Beginners — Learn Python Online here

Learn Python Programming — Python Course here

На уроке рассматривается работа с файлами в Питон: текстовые и бинарные файлы, запись в файл и чтение из файла

Дальше — больше… Python Урок 9. Работа с файлами

На уроке рассматриваются алгоритмы работы с двумерными массивами в Python: создание матрицы, инициализация элементов, вывод, обработка элементов матрицы

Дальше — больше… Python Урок 8. Матрицы (двумерный массив)

На уроке рассматриваются алгоритмы работы с массивами: сортировка на python, поиск в массиве, поиск максимального или минимального элемента и другие алгоритмы

Дальше — больше… Python Урок 7. Массивы в Питоне: продолжение (алгоритмы)

На уроке объясняется синтаксис составления процедуры и функции Питон. Рассматривается вызов функции, параметры функции и процедуры

Дальше — больше… Python Урок 3. Функции и процедуры

На уроке раскрываются подробности работы в python с кортежами и словарями:

Дальше — больше… Python Урок 6. Кортежи и словари

На уроке рассмотрены примеры использования оператора присваивания на языке python, примеры работы с основными арифметическими операторами. Узнаете об одной из функций преобразования типов (int). Изучите работу условного оператора, оператора python print и input.

Дальше — больше… Python Урок 1. Арифметические действия и конструкции

На уроке рассматривается алгоритм работы с различными видами циклов на языке Питон (Python): цикл с предусловием While и цикл со счетчиком For. Объясняется возможность генерации в Python случайных чисел

Дальше — больше… Python Урок 2. Работа с циклами

На уроке объясняется принцип работы со строками на языке Питон. Будут рассмотрены некоторые необходимые функции для работы со строками. Изучается алгоритм того, как создавать срезы

Дальше — больше… Python Урок 5. Немного о строках. Срезы

На уроке объясняется, как в языке python представлены списки (вместо массивов); объясняется про создание списков на Python.

Дальше — больше… Python Урок 4. Списки или массивы в Питоне

Понравилась статья? Поделить с друзьями:
  • Вся скульптура для егэ по истории
  • Вся сила суждения содержится в сказуемом без сказуемого не может быть суждения сочинение
  • Вся пунктуация русского языка в таблицах для егэ
  • Вся политика егэ общество
  • Вся политика для егэ по обществу