|
|
ЕГЭ по информатикеПрограммное обеспечение
Здесь вы можете найти программное обеспечение для подготовки к ЕГЭ по информатике. Основные Лицензионное соглашениеВсе опубликованные ниже материалы для подготовки к ЕГЭ по информатике Исходные тексты программ не распространяются. Без письменного согласия автора ЗАПРЕЩАЕТСЯ:
Использование и скачивание материалов означает, что вы приняли условия этого лицензионного соглашения. Программное обеспечение
Программное обеспечение других авторовМатериалы размещены с согласия указанных авторов программ.
|
Новый учебник информатики (ФГОС, углублённый уровень). Презентации для проведения уроков информатики. Учебная модель компьютера для программирования на Компьютерное тестирование знаний в локальной сети — программа «NetTest». Электронный учебник по Flash CS3 с практическими заданиями, элективный курс. Электронный учебник по Photoshop CS2 с практическими заданиями, элективный курс. Электронный учебник-самоучитель по Delphi с практическими заданиями. |
Доброго времени суток каждому жителю Хабрвилля! Давненько я не писал статей! Пора это исправить!
В сегодняшней статье поговорим о насущной для многих выпускников школ теме — ЕГЭ. Да-да-да! Я знаю, что Хабр — это сообщество разработчиков, а не начинающих айтишников, но сейчас ребятам как никогда нужна поддержка именно сообщества. Ребят опять посадили на дистант. Пока не ясно на какой период, но уже сейчас можно сказать, что ЕГЭ по информатике будет на компьютерах и его можно зарешать при помощи языка 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 пользователей.
Шаблоны программ для задач в ЕГЭ по Информатике на Python
В текущей версии ЕГЭ довольно много заданий, которые можно (а иногда и обязательно) сделать на компьютере, однако их можно существенно упростить, если знать шаблон, в который достаточно дописать условие данной задачи. В этом репозитории я постараюсь собрать все шаблоны, которые были придуманы учителями и учениками в ходе подготовки (а через раздел «Issues» можно предложить и свои шаблоны).
Скачать шаблоны и примеры в формате .py можно, нажав кнопку Code и в ней Download ZIP. Все примеры будут лежать в папке examples, а шаблоны в templates.
Задания
Задание №2
Задание №6
Задание №12
Задание №14
Задание №16
Задание №17
Задание №19-21
Задание №22
Задание №23
Благодарности
Сайту РешуЕГЭ за предоставленные задания
Редактировать
Внимание!
Обновлено 24.03.2022
Мы рекомендуем всем, кто готовит и готовится к сдаче ЕГЭ, ограничиться возможностями PascalABC.NET 3.8.3. Эта версия вышла в начале марта 2022 года. Язык продолжает развиваться и совершенствоваться, но невозможно обеспечить на станциях ЕГЭ наличие самой последней версии программного обеспечения. Использование более ранних версий лишит школьника некоторых имеющихся в языке возможностей и потребует самостоятельно искать для них эквивалентные замены.
Мы призываем тех работников образования, от которых зависит состояние программных средств на станциях ЕГЭ, заблаговременно установить любую доступную сборку версии 3.8.3 или выше.
Просим руководство учебных заведений принять к сведению, что многие школьники, занимаясь самостоятельно или с репетиторами, используют именно эту версию и, обнаружив на экзамене версию более старую, могут показать результат гораздо ниже своих возможностей.
Рекомендуется скачивать текущую версию на сайте.
Об этом документе
Здесь представлены решения некоторых задач
демонстрационного варианта ЕГЭ по информатике 2021.
Решения даются с кратким описанием алгоритма и концентрируются в основном на демонстрации возможностей языка.
Решения сбалансированы по простоте записи и восприятия в балансе с новыми возможностями.
В сети можно встретить либо более длинные и непонятные решения на старом языке Паскаль либо переусложнённые и малопонятные для школьника решения с использованием всех возможностей языка. Ни тот ни другой стиль записи программ нами не рекомендуется.
Великолепный разбор задач типа 25 и 26 ЕГЭ по информатике 2021 на чистом PascalABC.NET дан К.Ю.Поляковым в данной презентации. Здесь представлены наиболее эффективные и неочевидные решения.
О PascalABC.NET
PascalABC.NET – современный диалект языка программирования Паскаль, позволяющий записывать код компактно и понятно, используя современные языковые возможности. Это делает программу яснее и как следствие сокращает число возможных ошибок на ЕГЭ по информатике, связанных с волнением и другими субъективными причинами.
Данный текст составлен разработчиками языка и рассматривает ряд вопросов, связанных с использованием PascalABC.NET при сдаче ЕГЭ по информатике. Он ориентирован:
- на школьников, использующих при сдаче ЕГЭ PascalABC.NET как язык реализации программ
- на преподавателей, которые при подготовке школьников к сдаче ЕГЭ по информатике используют PascalABC.NET
Важно! Данный текст не рассматривает вопросы, связанные с методикой решения задач. Он лишь описывает то, как на PascalABC.NET сделать запись алгоритмов лучше, сохранив при этом эффективность.
PascalABC.NET имеет множество языковых возможностей и множество стилей программирования, поскольку обобщает современные языковые и библиотечные возможности сразу нескольких современных языков программирования (C#, Python, Kotlin).
При решении задач ЕГЭ по информатике мы рекомендуем использовать лишь ограниченный набор возможностей PascalABC.NET, которые делают текст программы яснее и короче, позволяя концентрироваться на сути алгоритма, а не на технических деталях.
К базовым возможностям языка, рекомендуемым нами при решении задач ЕГЭ, относятся:
- Описания переменных внутри блока в том месте, где они впервые потребовались. Это ликвидирует длинные перечни описания переменных до beginа основной программы, ухудшающие читаемость и лёгкость написания программы.
- Автовывод типа переменной при описании с инициализацией (
var a := 1). - Использование описания счётчика цикла
forв заголовке цикла (for var i). - Функции ввода вида
ReadInteger,ReadReal,ReadInteger2и т.д., позволяющие одной строкой описывать и вводить переменную в любом месте операторного блока программы (var a := ReadInteger). - Процедуры вывода
Print,Println, автоматически разделяющие элементы вывода пробелами. - Цикл
loop– аналог цикла for, использующийся когда счётчик цикла не нужен. - Кортежи и распаковка кортежей в переменные, называемая также множественным присваиванием:
(a,b) := (1,1).
Кроме того, в некоторых задачах уместно использование лямбда-выражений как параметров стандартных методов.
Все представленные здесь решения сбалансированно сочетают простоту и понятность записи и использование новых возможностей.
Задача 17
Рассматривается множество целых чисел, принадлежащих числовому
отрезку [1016; 7937], которые делятся на 3 и не делятся на 7, 17, 19, 27.
Найдите количество таких чисел и максимальное из них.
В ответе запишите два целых числа: сначала количество, затем
максимальное число.
Решение 1. Минимум новых возможностей; длинная запись условия, уводящая от сути
begin
var count := 0;
var max := -MaxInt;
for var x := 1016 to 7937 do
if (x mod 3 = 0) and (x mod 7 <> 0) and (x mod 17 <> 0) and
(x mod 19 <> 0) and (x mod 27 <> 0) then
begin
count += 1;
if x > max then
max := x;
end;
Print(count,max);
end.
Ответ.
1568 7935
Решение 2. Использование методов Divs и DivsAny
begin
var count := 0;
var max := -MaxInt;
for var x := 1016 to 7937 do
if x.Divs(3) and not x.DivsAny(7, 17, 19, 27) then
begin
count += 1;
if x > max then
max := x;
end;
Print(count,max);
end.
Решение 2а. Заметим, что максимальный элемент является последним удовлетворяющим условию
begin
var count := 0;
var last := 0;
for var x := 1016 to 7937 do
if x.Divs(3) and not x.DivsAny(7, 17, 19, 27) then
begin
count += 1;
last := x;
end;
Print(count,last);
end.
Решение 3. Использование последовательностей
begin
// Рассмотрим последовательность целых от 1016 до 7937, делящихся на 3 и не делящихся ни на одно из 7, 17, 19, 27
var seq := (1016..7937).Where(x -> x.Divs(3) and not x.DivsAny(7, 17, 19, 27));
// Выведем количество элементов этой последовательности и ее максимальный элемент
Print(seq.Count,seq.Max);
end.
Замечание. Аналогично предыдущему вместо seq.Max можно использовать seq.Last
Задача 25
Напишите программу, которая ищет среди целых чисел, принадлежащих
числовому отрезку [174457; 174505], числа, имеющие ровно два различных
натуральных делителя, не считая единицы и самого числа. Для каждого
найденного числа запишите эти два делителя в таблицу на экране с новой
строки в порядке возрастания произведения этих двух делителей. Делители
в строке таблицы также должны следовать в порядке возрастания.
Решение 1
Для получения всех делителей составим функцию, которая будет помещать все получаемые делители в список.
Это неэффективно (нужны только числа с ровно двумя делителями), но для приводимых на ЕГЭ значений
программа выполняется мгновенно, поэтому писать более оптимальный алгоритм не следует.
function Divisors(N: integer): List<integer>;
begin
Result := new List<integer>;
for var i:=2 to N-1 do
if N.Divs(i) then
Result.Add(i);
end;
begin
for var N := 174457 to 174505 do
begin
var d := Divisors(N);
if d.Count = 2 then
Println(d[0],'|',d[1]);
end;
end.
Ответ.
3 | 58153
7 | 24923
59 | 2957
13 | 13421
149 | 1171
5 | 34897
211 | 827
2 | 87251
Решение 2
Без использования функции
begin
for var N := 174457 to 174505 do
begin
var d := new List<integer>;
for var i:=2 to N-1 do
if N mod i = 0 then
d.Add(i);
if d.Count = 2 then
Println(d[0],'|',d[1]);
end;
end.
Решение 3
Более эффективное, в котором список делителей не пополняется если уже содержит более двух делителей.
Это решение — на случай достаточно больших значений N, что трудно представить на ЕГЭ
begin
for var N := 174457 to 174505 do
begin
var d := new List<integer>;
for var i:=2 to N-1 do
begin
if N mod i = 0 then
d.Add(i);
if d.Count > 2 then // Это условие даёт более эффективное решение
break;
end;
if d.Count = 2 then
Println(d[0],'|',d[1]);
end;
end.
Данное решение тем не менее будет медленно работать при очень больших N, однако подобное усложнение невозможно на ЕГЭ — оно делает задачу олимпиадной. Однако, решение есть и в этом случае. Оптимизации решения задачи 25 рассмотрены в презентации К.Ю. Полякова.
Задача 26
Системный администратор раз в неделю создаёт архив пользовательских
файлов. Однако объём диска, куда он помещает архив, может быть меньше,
чем суммарный объём архивируемых файлов.
Известно, какой объём занимает файл каждого пользователя.
По заданной информации об объёме файлов пользователей и свободном
объёме на архивном диске определите максимальное число пользователей,
чьи файлы можно сохранить в архиве, а также максимальный размер
имеющегося файла, который может быть сохранён в архиве, при условии,
что сохранены файлы максимально возможного числа пользователей.
Входные данные.
В первой строке входного файла находятся два числа: S – размер свободного
места на диске (натуральное число, не превышающее 10 000)
и N – количество пользователей (натуральное число, не превышающее
1000). В следующих N строках находятся значения объёмов файлов каждого
пользователя (все числа натуральные, не превышающие 100), каждое
в отдельной строке.
Запишите в ответе два числа: сначала наибольшее число пользователей, чьи
файлы могут быть помещены в архив, затем максимальный размер
имеющегося файла, который может быть сохранён в архиве, при условии,
что сохранены файлы максимально возможного числа пользователей.
Пример входного файла:
При таких исходных данных можно сохранить файлы максимум двух
пользователей. Возможные объёмы этих двух файлов 30 и 40, 30 и 50 или 40
и 50. Наибольший объём файла из перечисленных пар – 50, поэтому ответ
для приведённого примера:
Решение 1
begin
Assign(input, '26.txt');
var (S,N) := ReadInteger2;
var data := ReadArrInteger(N);
Sort(data);
var (total,count) := (0,0);
while (count < N) and (total + data[count] <= S) do
begin
total += data[count];
count += 1;
end;
var delta := S - total;
Println(count, data.Last(x -> x - data[count-1] <= delta));
end.
Решение скорее всего позаимствовано с сайта К. Полякова с косметическими правками в стиле PascalABC.NET.
Решения аналогичных задач на чистом PascalABC.NET содержатся в презентации К.Ю. Полякова.
Ответ.
Задача 27
Имеется набор данных, состоящий из пар положительных целых чисел.
Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма
всех выбранных чисел не делилась на 3 и при этом была максимально
возможной. Гарантируется, что искомую сумму получить можно.
Программа должна напечатать одно число – максимально возможную
сумму, соответствующую условиям задачи.
Входные данные.
Даны два входных файла (файл A и файл B), каждый из которых содержит
в первой строке количество пар N (1 ≤ N ≤ 100000). Каждая из следующих
N строк содержит два натуральных числа, не превышающих 10 000.
Пример организации исходных данных во входном файле:
6
1 3
5 12
6 9
5 4
3 3
1 1
Для указанных входных данных значением искомой суммы должно быть
число 32.
В ответе укажите два числа: сначала значение искомой суммы для файла А,
затем для файла B.
Предупреждение: для обработки файла B не следует использовать
переборный алгоритм, вычисляющий сумму для всех возможных вариантов,
поскольку написанная по такому алгоритму программа будет выполняться
слишком долго.
Решение 1
begin
Assign(input,'27-b.txt');
var (s, d) := (0, MaxInt);
var n := ReadInteger;
loop n do
begin
var (a,b) := ReadInteger2;
s += Max(a,b);
var diff := Abs(a-b);
if diff mod 3 <> 0 then
d := Min(d, diff)
end;
if s mod 3 <> 0 then
Print(s)
else Print(s-d)
end.
Решение скорее всего позаимствовано с сайта К. Полякова с косметическими правками в стиле PascalABC.NET.
Ответ.
Далее рассматриваются задачи, которые не требуют решения в виде программы, однако с помощью программы можно проверить ответ.
Задача 5
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему
новое число R следующим образом.
- Строится двоичная запись числа N.
- К этой записи дописываются справа ещё два разряда по следующему
правилу:
а) складываются все цифры двоичной записи числа N, и остаток
от деления суммы на 2 дописывается в конец числа (справа). Например,
запись 11100 преобразуется в запись 111001;
б) над этой записью производятся те же действия – справа дописывается
остаток от деления суммы её цифр на 2.
Полученная таким образом запись (в ней на два разряда больше, чем
в записи исходного числа N) является двоичной записью искомого числа R.
Укажите такое наименьшее число N, для которого результат работы
данного алгоритма больше числа 77. В ответе это число запишите
в десятичной системе счисления.
Пояснение
Для решения используется функция Bin модуля School, содержащего ряд базовых математических алгоритмов:
uses School;
begin
for var NN := 1 to 100 do
begin
var N := NN;
var rem := Bin(N).Count(d->d='1') mod 2;
N := 2*N + rem;
rem := Bin(N).Count(d->d='1') mod 2;
N := 2*N + rem;
Println(NN,N);
end;
end.
Задача 12
Исполнитель Редактор получает на вход строку цифр и преобразовывает её.
Редактор может выполнять две команды, в обеих командах v и w обозначают
цепочки цифр.
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки v на
цепочку w. Например, выполнение команды
заменить (111, 27)
преобразует строку 05111150 в строку 0527150.
Если в строке нет вхождений цепочки v, то выполнение команды
заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя
Редактор. Если она встречается, то команда возвращает логическое значение
«истина», в противном случае возвращает значение «ложь». Строка
исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции
ЕСЛИ условие
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно) или команда2 (если условие
ложно).
Какая строка получится в результате применения приведённой ниже
программы к строке, состоящей из 70 идущих подряд цифр 8? В ответе
запишите полученную строку.
НАЧАЛО
ПОКА нашлось (2222) ИЛИ нашлось (8888)
ЕСЛИ нашлось (2222)
ТО заменить (2222, 88)
ИНАЧЕ заменить (8888, 22)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
Решение. Условие — слишком длинное ))
begin
var s := 70 * '8';
while ('2222' in s) or ('8888' in s) do
if '2222' in s
then s := s.Replace('2222', '88', 1)
else s := s.Replace('8888', '22', 1);
Print(s);
end.
Ответ
Задача 14
Значение арифметического выражения: 497 + 721 – 7 – записали в системе
счисления с основанием 7. Сколько цифр 6 содержится в этой записи?
Решение.
begin
var bb := 49bi ** 7 + 7bi ** 21 - 7;
var count := 0;
repeat
if bb mod 7 = 6 then
count += 1;
bb := bb div 7;
until bb = 0;
Count.Print;
end.
Пояснение 49bi, 7bi — это константы типа BigInteger
Ответ
Решение 2. Используем стандартный метод ToBase модуля School и стандартный метод последовательностей CountOf:
uses School;
begin
(49bi ** 7 + 7bi ** 21 - 7).ToBase(7).CountOf('6').Print
end.
Задача 15
Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без
остатка на натуральное число m».
Для какого наибольшего натурального числа А формула
¬ДЕЛ(x, А) → (ДЕЛ(x, 6) → ¬ДЕЛ(x, 9))
тождественно истинна (то есть принимает значение 1 при любом
натуральном значении переменной х)?
Решение.
begin
// Возьмём большой диапазон a: от 1 до 10000
for var a := 10000 downto 1 do
// Если для всех натуральных x (возьмём некоторый большой диапазон)
// выполняется условие задачи, то мы нашли a
if (1..100000).All(x -> not x.Divs(a) <= (x.Divs(6) <= not x.Divs(9))) then
begin
Print(a);
break;
end;
end.
Пояснение Импликация → в PascalABC.NET описывается операцией <=. Это легко показать таблицей истинности.
Пояснение
Тип BigInteger указан “на всякий случай” — если будут возникать очень большие целые. В задачах ЕГЭ — вряд ли
Задача 16
Алгоритм вычисления значения функции F(n), где n – натуральное число,
задан следующими соотношениями:
F(n) = 1 при n = 1;
F(n) = n + F(n − 1), если n – чётно,
F(n) = 2 × F(n − 2), если n > 1 и при этом n – нечётно.
Чему равно значение функции F(26)?
Решение.
function F(n: integer): BigInteger;
begin
if n = 1 then Result := 1
else if n.IsEven then Result := n + F(n - 1)
else Result := 2 * F(n - 2);
end;
begin
F(26).Print
end.
Ответ
Задание номер 8 — задание базового уровня сложности, выполнение которого предполагает знание о методах измерения количества информации и не требует использования специального ПО.
Зачастую в номере 8 мы можем встретить задания связанные с комбинаторикой — перестановками, количеством вариантов выборки и т.д. Для решения заданий такого типа можно приспособить модуль itertools языка python.
Сразу оговорюсь, что я не рекомендую решать задание именно таким способом. Я советую проверять свой ответ, полученный ручным решением. Написанная программа не должна быть единственным вариантом решения.
Модуль itertools доступен в питоне «из коробки», т.е. его нет необходимости устанавливать дополнительно. А значит, он будет доступен на экзамене.
Ссылка на документацию по модулю https://docs.python.org/3/library/itertools.html
Использованные в данной статье методы и функции доступны как минимум с версии питона 3.6
Для импорта необходимых функции необходимо их импортировать из модуля
from itertools import product, permutations
- product
Позволяет получить прямое, или декартово произведеение двух множеств — множество, элементами которого являются все возможные упорядоченные пары элементов исходных множеств.
a = ‘AB’
b = ‘CD’
print(*product(a, b))
(‘A’, ‘C’) (‘A’, ‘D’) (‘B’, ‘C’) (‘B’, ‘D’)
Получение произведения двух множеств не очень актуально в 8 задании, но мы можем использовать другую возможность функции product: получение всевозможных комбинаций определенной длины для одного множества.
a = ‘AB’
print(*product(a, repeat=3))
(‘A’, ‘A’, ‘A’) (‘A’, ‘A’, ‘B’) (‘A’, ‘B’, ‘A’) (‘A’, ‘B’, ‘B’) (‘B’, ‘A’, ‘A’) (‘B’, ‘A’, ‘B’) (‘B’, ‘B’, ‘A’) (‘B’, ‘B’, ‘B’)
Мы получили всевозможные комбинации длины 3 для набора из двух букв АВ. Причем результат работы функции — набор кортежей.
Параметр repeat отвечает за длину слова.
Из полученных наборов мы можем выбрать подходящие для нас. Например, так можно решить задание из демоверсии 2021.
Длина слова здесь 3, а набор букв — ШКОЛА. Получим всевозможные комбинации:
a = ‘ШКОЛА’
comb = product(a, repeat=3))
Осталось выбрать те, где буква К встречается ровно 1 раз.
Поскольку подсчет количества вхождений в кортеж организовать сложнее, чем в строке, здесь элементы кортежа «склеиваются» по пустой строке, образуя тем самым не кортеж, а строку. Метод count подсчитывает количество вхождений подстроки ‘K’.
Этот же код можно оформить в одну строку через списочное выражение
print(len([item for item in product(‘ШКОЛА’, repeat=3) if ”.join(item).count(‘К’) == 1]))
2. permutations
Позволяет получить всевозможные перестановки.
print(*permutations(‘ABC’))
(‘A’, ‘B’, ‘C’) (‘A’, ‘C’, ‘B’) (‘B’, ‘A’, ‘C’) (‘B’, ‘C’, ‘A’) (‘C’, ‘A’, ‘B’) (‘C’, ‘B’, ‘A’)
Это опять набор кортежей.
Рассмотрим такое задание с сайта kpolyakov.spb.ru
Получаем перестановки
a = ‘КАПКАН’
comb = permutations(a)
И отбираем нужные варианты
Поскольку в слове КАПКАН есть повторяющиеся буквы А и К, мы должны поделить итоговое количество на 4 (дважды поделить на 2), поскольку с нашей точки зрения эти комбинации неотличимы друг от друга.
Другой способ убрать повторяющиеся комбинации — превратить набор перестановок в множество, которое в питоне исключает повторы
Так-же можно написать решение в одну строку
print(len([i for i in set(permutations(‘КАПКАН’)) if all(i[j] != i[j + 1] for j in range(5))]))
Подведем итог. Задачи на составление слов путем выбора букв из набора или путем перестановки букв в слове можно решить с использованием модуля itertools. Написание кода не займет много времени, зато будет уверенность в ручном решении.
Сегодня посмотрим одно из самых интересных заданий из ЕГЭ по информатике 2023. Будем решать 24 задание. В этом задании нужно работать с файлами.
Все решения задач из задания 24 ЕГЭ по информатике 2023 будут приведены на языке программирования Python (Питон).
Поехали!
Задача (Самая простая)
Текстовый файл состоит не более чем из 106 символов A, B и C. Определите максимальное количество идущих подряд символов B. Для выполнения этого задания следует написать программу. Ниже приведён файл, который необходимо обработать с помощью данного алгоритма.
Решение:
Решим данную задачу на языке Python.
f=open('24_1.txt') s=f.read() k=0 kmax=0 for i in range(0, len(s)): if s[i]=='B': k=k+1 kmax=max(k, kmax) else: k=0 print(kmax)
С помощью команды open() подвязываемся к файлу. Чтобы не прописывать полный путь, файл должен лежать в той же папке, что и программа.
С помощью команды .read() зачитываем в переменную s всё содержимое файла.
Переменная k — это текущий счётчик символов «B». Задача переменной kmax сохранить максимальное значение k.
С помощью цикла for перебираем все символы из строки s. Переменная i пробегается по номерам всех симолов. Счёт символов начинается в строке с нуля. В начале берём нулевой символ, потом первый и т.д. Конструкция for i in range(0, len(s)) позволяет пройтись по всем символам строки до конца.
Если нам встретился нужный символ «B», то мы счётчик прибавляем на 1. Это значит, что мы подсчитываем текущую цепочку. Если будет стоять 3 символа «B» подряд, значит, счёт k покажет значение 3. Как только встретится дургой символ, то это означает, что цепочка прервалась и счётчик переводится в первоначальное положение 0.
При любом увеличении счётчика происходит анализ этого счётчика на максимальность. Функция max выбирает максимальное значение из старого значения kmax и нового показания счётчика k. Если счётчику k удалось победить kmax, то его значение будет считаться максимальным на данный момент времени.
В ответ идёт значение kmax. Это и есть длина максимальной цепочки. В этой задачке ответ получается 11.
Ответ: 11
Закрепим это простое задание из ЕГЭ по информатике 2023.
Задача (Простая, закрепление)
Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых нет символа Z. Для выполнения этого задания следует написать программу.
Решение:
Решение похоже на предыдущее.
f=open('24_2.txt') s=f.read() k=0 kmax=0 for i in range(0, len(s)): if s[i]!='Z': k=k+1 kmax=max(k, kmax) else: k=0 print(kmax)
Если нет символов «Z», то подсчитываем, иначе сбрасываем.
Задача (Обращаемся к соседу)
Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальное количество идущих подряд символов, расположенных в алфавитном порядке (возможно с повторением симолов). Для выполнения этого задания следует написать программу.
Решение:
f=open('24_2.txt') s=f.read() k=1 kmax=0 for i in range(0, len(s)-1): if s[i]<=s[i+1]: k=k+1 kmax=max(k, kmax) else: k=1 print(kmax)
В ответе получается 15. Символы можно сравнивать между собой с помощью знаков «>» или меньше «<» ( а так же «>=» или «<=»), причём это сравнение происходит в алфавитном порядке. Например, символ «B» будет больше, чем «A» и т.п. Теперь нам нужно уже обратится к соседу, уже важна связь между соседними символами. Раз мы обращаемся к следующему символу, то должны пробегать до len(s)-1, иначе куда мы будем обращаться, когда дойдём до последнего символа?
В самом начале цепочки мы анализируем два символа, а к счётчику прибавляем всего лишь 1. Чтобы это учесть, в начале счётчику (переменной k) присваиваем 1. Затем, по мере продвижения по цепочке, мы добавляем в наш анализ 1 новый символ, и к счётчику добавляется одна 1. Дальше уже таких проблем нет.
Раз мы присвоили в переменную k единицу, то и сбрасывать в ветке else мы тоже должны на 1. Эти значения обычно взаимосвязаны.
Если мы обращаемся к соседнему символу, как правило, счётчик и сброс устанавливаются в 1. Это не стопроцентная истина, но иметь ввиду это нужно.
Ответ: 15
Задача (Обращаемся к соседу, закрепление)
Текстовый файл состоит не более чем из 106 символов арабских цифр (0, 1, …,9). Определите максимальное количество идущих подряд цифр, среди которых каждые две соседние различны. Для выполнения этого задания следует написать программу.
Решение:
f=open('24_3.txt') s=f.read() k=1 kmax=0 for i in range(0, len(s)-1): if s[i]!=s[i+1]: k=k+1 kmax=max(k, kmax) else: k=1 print(kmax)
Если соседи различны, мы подсчитываем, иначе сбрасываем.
Ответ: 120
Задача (Обращаемся к соседу, ещё сложнее)
Текстовый файл состоит не более чем из 106 символов арабских цифр (0, 1, …,9). Определите максимальное количество идущих подряд нечётных цифр, расположенных в неубывающем порядке. Для выполнения этого задания следует написать программу.
Решение:
f=open('24_3.txt') s=f.read() k=1 kmax=0 for i in range(0, len(s)-1): if s[i]<=s[i+1] and s[i] in '13579' and s[i+1] in '13579' : k=k+1 kmax=max(k, kmax) else: k=1 print(kmax)
Здесь опять можно применить знаки сравнения прям к символам. Удобно проверить принадлежность к нечётным цифрам конструкцией s[i] in ‘13579’. Нечётной цифрой должна быть как текущая, так и следующая.
Ответ: 8
Решим ещё одну тренировочную задачу из ЕГЭ по информатике 2023.
Задача (Обращаемся к соседу, ещё сложнее, закрепление)
Текстовый файл состоит не более чем из 106 символов 1, 2, 3, A, B, С. Определите максимальное количество идущих подряд символов, среди которых никакие две буквы и никакие две цифры не стоят рядом. Для выполнения этого задания следует написать программу.
Решение:
f=open('24_4.txt') s=f.read() k=1 kmax=0 for i in range(0, len(s)-1): if (s[i] in '123' and s[i+1] in 'ABC') or (s[i] in 'ABC' and s[i+1] in '123') : k=k+1 kmax=max(k, kmax) else: k=1 print(kmax)
В этой задаче цифры и буквы должны чередоваться. Если у нас цифра, то следующая должны быть буква, или наоборот, если у нас буква, то следующая должна быть цифра. В этих двух случаях прибавляем к счётчику 1.
Ответ: 20
Задача (Исключаем строку из 2-х символов, демо 2022)
Текстовый файл состоит из символов P, Q, R и S.
Определите максимальное количество идущих подряд символов
в прилагаемом файле, среди которых нет идущих подряд символов P.
Для выполнения этого задания следует написать программу.
Решение:
Напишем решение на языке Python.
f=open('24_5.txt') s=f.read() k=1 kmax=0 for i in range(0, len(s)-1): if s[i]=='P' and s[i+1]=='P': k=1 else: k=k+1 kmax = max(k, kmax) print(kmax)
Подсчитываем символы, пока не встретилась комбинация двух P подряд. Как только встретилась данная комбинация, сбрасываем счётчик на 1. Здесь мы сбрасываем счётчик на значение 1, чтобы учесть один символ, которые находится в самой комбинации PP. И в начале мы тоже устанавливаем счётчик в значение 1 по этой же причине.
Мы проходим в цикле for до длины строки минус один. Значение 1 в счётчике при сбросе и в начале программы так же компенсирует и тот момент, что мы не подсчитываем последний символ!
При изменении счётчика, сохраняем максимальное значение в переменной mx
Если бы у нас была вместо PP другая комбинация, состоящая к примеру из 5 символов, то мы бы тогда в начале и при сбросе писали в счётчик значение 5-1=4.
Здесь тоже работает негласное правило, обращаемся к соседу, значит, счётчик устанавливаем в 1.
В этой задаче получается ответ 188.
Ответ: 188
Задача (Исключаем подстроку из 3-х символов)
Текстовый файл состоит из символов арабских цифр(0, 1, …,9).
Определите максимальное количество идущих подряд символов
в прилагаемом файле, среди которых нет трёх символов 0, стоящих рядом.
Для выполнения этого задания следует написать программу.
Решение:
Напишем решение на языке Python.
f=open('24_6.txt') s=f.read() k=2 kmax=0 for i in range(0, len(s)-2): if s[i]=='0' and s[i+1]=='0' and s[i+2]=='0': k=2 else: k=k+1 kmax = max(k, kmax) print(kmax)
Чтобы понять это решение, нужно посмотреть предыдущую задачу. Мы здесь обращаемся к двум соседям, значит, счётчик устанавливаем в 2. Так же проходим в цикле до len(s)-2. Нежелательная строка может состоять не только из одинаковых символов. Может быть строка «XYYZ», к примеру.
Ответ: 7684
Задача (Не более одного символа Z)
Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых символ Z встречается не более одного раза.
Решение:
В нашей цепочке один раз можно встретиь символ Z, а два раза уже нельзя. Здесь мы применим функцию .split(). Как работает эта фнкция? Напишем тестовую программу.
s='sadqttqtreq' a=s.split('q') print(a)
Результат данной программы будет следующим:
[‘sad’, ‘tt’, ‘tre’, »]
Команда split «разрезает» строку по символу «q». В результате мы получаем массив с кусочками этой строки.
Решение нашей задачи.
f=open('24_7.txt') s=f.read() a=s.split('Z') k=0 kmax=0 for i in range(0, len(a)-1): k = len(a[i]) + 1 + len(a[i+1]) kmax = max(k, kmax) print(kmax)
Разрезаем нашу строку по символу «Z». Пробегаемся уже по массиву a. Цепочка-кандидат это текущий кусочек (a[i]), символ Z (1) и следующий кусочек (a[i+1]).
Каждого кандитата проверяем сразу на максимальность.
Ответ: 43
Задача (Не более двух символов Z)
Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых символ Z встречается не более двух раз.
Решение:
Решение аналогично предыдущему.
f=open('24_7.txt') s=f.read() a=s.split('Z') k=0 kmax=0 for i in range(0, len(a)-2): k = len(a[i]) + 1 + len(a[i+1]) + 1 + len(a[i+2]) kmax = max(k, kmax) print(kmax)
Ответ: 50
Задача (Звенья)
Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальную длину цепочки символов, состоящей из повторяющихся фрагментов XYZ. Цепочка должна начинаться с символа X и заканчиваться символом Z. Например, для строки ZZZXYZXYZXZZZ длина цепочки равна 6: XYZ+XYZ
Решение:
Если мы подсчитаем количество идущих подряд звеньев XYZ, то, можно сказать, дело сделано.
f=open('24_8.txt') s=f.read() s=s.replace('XYZ', '1') k=0 kmax=0 for i in range(0, len(s)): if s[i]=='1': k=k+1 kmax=max(k, kmax) else: k=0 print(kmax*3)
Мы с помощью команды replace заменили звенья на «1» (на символ, которого точно нет в файле). Теперь задача свелась к самой простой, которую мы рассматривали в начале статьи. Нужно просто подсчитать количество идущих поряд единиц.
В ответе нас просили указать количество символов, а не звеньев, поэтому переменную kmax умножаем на 3.
Ответ: 66
Задача (Звенья, закрепление)
Текстовый файл состоит не более, чем из 106 символов из набора A, B, С. Найдите максимальное количество идущих пар символов AC или AB. Искомая подстрока может включать только пары AB, только пары AC или содержать одновременно как пары AC, так и пары AB.
Решение:
f=open('24_9.txt') s=f.read() s=s.replace('AB', '1') s=s.replace('AC', '1') k=0 kmax=0 for i in range(0, len(s)): if s[i]=='1': k=k+1 kmax=max(k, kmax) else: k=0 print(kmax)
Здесь нам подходит звено, как и AB, так и AC. В ответе нужно указать количество пар, поэтому не на что умножать переменную kmax не нужно.
Ответ: 19
Задача (Звенья, основная волна 20.06.22)
Текстовый файл состоит из символов A, B, C, D и O. Определите максимальное количество идущих подряд пар символов вида согласная + гласная в прилагаемом файле. Для выполенения этого задания следует написать программу.
Решение:
f=open('24_10.txt') s=f.read() s=s.replace('BA', '1') s=s.replace('CA', '1') s=s.replace('DA', '1') s=s.replace('BO', '1') s=s.replace('CO', '1') s=s.replace('DO', '1') k=0 kmax=0 for i in range(0, len(s)): if s[i]=='1': k=k+1 kmax=max(k, kmax) else: k=0 print(kmax)
Ответ: 174
Задача (Звенья, последнее звено неполное)
Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальную длину цепочки вида XYZXYZXYZ… (составленной из фрагментов XYZ, последний фрагмент может быть неполным). Для выполнения этого задания следует написать программу. Ниже приведён файл, который необходимо обработать с помощью данного алгоритма.
Решение:
Т.к. последнее звено может быть неполным, здесь удобно применить другой алгоритм.
Пусть в начале показания счётчика равно нулю. Если мы находим нужный нам символ в нужной последовательности, то прибавляем к счётчику 1. Если последовательность сбивается, то ставим счётчик в ноль.
На рисунке представлен данный алгоритм. В нижней строке указано показание счётчика в момент анализа символа.
На данном рисунке максимальная длина цепочки нужных символов равна 9.
Видим, что для символа X, когда он находится на своём месте, остаток от деления значения счётчика на 3 равен 0.
Для символа Y, когда данный символ находится на своём месте, остаток от деления значения счётчика на 3 равен 1.
Для символа Z, когда данный символ находится на своём месте, остаток от деления значения счётчика на 3 равен 2.
Мы смотрим остаток от деления на 3, потому что у нас длина звена равна трём (XYZ).
Таким образом, мы и наш анализ очередного символа привяжем к показанию счётчика:
f=open('24_11.txt') s=f.read() k=0 kmax=0 for i in range(0, len(s)): if (s[i]=='X' and k%3==0) or (s[i]=='Y' and k%3==1) or (s[i]=='Z' and k%3==2): k=k+1 kmax = max(k, kmax) else: if s[i]=='X': k=1 else: k=0 print(kmax)
Важный момент: Если нужную цепочку прервал символ X, то нужно счётчик сразу выставить в 1, иначе может произойти такая ошибка:
Т.е. первые три нужных символа в цепочке алгоритм не засчитал.
Поэтому мы не просто сбрасываем счётчик в ноль, а прописываем условие:
if s[i]=='X': k=1 else: k=0
Ответ: 13
Задача (Полезный приём)
Текстовый файл 24-157.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита (ABC…Z). Определите символ, который чаще всего встречается в файле между двумя одинаковыми символами. Например, в тексте CCBAABABCBC есть комбинации ABA, BAB, BCB и CBC. Чаще всего – 2 раза – между двумя одинаковыми символами стоит B, в ответе для этого случая надо написать B2 (без пробелов и других разделителей). Если таких символов несколько, выведите тот, который стоит раньше в алфавите.
Решение:
f=open('24-157.txt') s=f.read() a=[0]*150 for i in range(0, len(s)-2): if s[i]==s[i+2]: a[ord(s[i+1])] = a[ord(s[i+1])] + 1 ch='' mx=0 for i in range(0, 150): if a[i]>mx: mx=a[i] ch=chr(i) print(ch, mx)
Здесь мы заводим массив a. Индексы этого массива — это коды ANSI всех букв латинского алфавита (ABC…Z). Ведь, как мы знаем, каждая буква кодируется определённым числом (кодом ANSI). Вот часть этой таблицы.
Например, буква A кодируется кодом 65. Коды увеличиваются в алфавитном порядке на 1. Буква Z кодируется числом 90. Таким образом, 150 ячеек точно хватит для нашего алфавита. Здесь берём с запасом, потому что на экзамене можно точно не вспомнить коды, но достаточно запомнить, что 150 ячеек вполне хватит для заглавных и строчных букв латинского алфавита.
Значит, ячейка 65 отвечает за букву A, ячейка 66 отвечает за букву B и т.д. Если мы встретили букву между двумя одинаковыми буквами, то её ячейка увеличивается на 1.
Функция ord() превращает символ в код ANSI.
После того, как мы прошли всю строку и собрали информацию о наших буквах, нужно пройти массив a и найти наибольшее число в нём.
Здесь мы уже не пользуемся функцией max, а используем условие, потому что нужно кроме максимального числа тянуть ещё один параметр — сам код (переменную i). Функция chr() превращает код ANSI обратно в символ.
Ответ: W1608
Задача (Строки различной длины)
Текстовый файл 24-164.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита (ABC…Z). Текст разбит на строки различной длины. Необходимо найти строку, содержащую самую длинную цепочку стоящих подряд одинаковых букв. Если таких строк несколько, надо взять ту, которая в файле встретилась раньше. Определите, какая буква встречается в этой строке чаще всего. Если таких букв несколько, надо взять ту, которая стоит раньше в алфавите. Запишите в ответе эту букву, а затем – сколько раз она встречается во всем файле.
Пример. Исходный файл:
ZZQABA
ZALAAC
QRAQUT
В этом примере в первой и второй строках наибольшая длина цепочек одинаковых буквы равна 2 (ZZ в первой строке, AA во второй), в третьей – 1. Берём первую строку, т.к. она находится в файле раньше. В этой строке чаще других встречаются буквы Z и A (по 2 раза), выбираем букву A, т. к. она стоит раньше в алфавите. В ответе для этого примера надо записать A6, так как во всех строках файла буква A встречается 6 раз.
Решение:
Для считывания построчно файла, будем использовать конструкцию, как в задании 17. В начале найдём строчку, содержащую самую длинную цепочку стоящих подряд одинаковых букв.
f=open('24-164.txt') kmax=0 count=0 n=-1 for s in f.readlines(): count=count+1 k=1 for i in range(0, len(s)-1): if s[i]==s[i+1]: k=k+1 if k>kmax: kmax=k n=count else: k=1 print(n)
Получается строка под номером 162. Переменная count считает строки по порядку. В переменную n сохраняем номер нужной строки. Опять пользуемся условием, а не функцией max, т.к. здесь нужно и обновлять kmax, и сохранять значение n. У нас условие строгое k>kmax, значит, сохранится первая строка с наибольшей искомой цепочкой.
f=open('24-164.txt') count=0 a=[0]*150 for s in f.readlines(): count=count+1 k=1 if count==162: for i in range(0, len(s)): a[ord(s[i])] = a[ord(s[i])] + 1 ch='' mx=0 for i in range(0, 150): if a[i] > mx: mx=a[i] ch=chr(i) print(ch)
Теперь нас интересует только строка под номером 162. Далее используем приём из прошлой задачи. Заводим массив a из 150 ячеек и используем таблицу кодов ANSI. Так определяем какая буква встретилась чаще всего в строке под номером 162. Получается буква K.
f=open('24-164.txt') s=f.read() print(s.count('K'))
Осталось найти количестов букв K во всём файле. Для этого используем функцию .count()
Ответ: K36582
В задаче 15 «Задача (Полезный приём)», созданы переменные k и kmax — напрасно, они не используются.
Убрал, по привычке написал.
В статье собрали для вас полезные сайты, сервисы, YouTube-каналы и приложения. Смотрите и подготовка к ЕГЭ по информатике пройдет быстро и успешно. А главное — вы сдадите экзамен на максимальный балл.
Друзья, приветствуем! На связи «Сотка».
Онлайн–школа, которая подготовила к ЕГЭ более 60.000 учеников👇
Ниже вы увидите список из 21 ссылки с ресурсами.
Нажмите на ссылку, чтобы узнать подробнее о ресурсе.
Нажмите кнопку «назад» в браузере, чтобы вернутся к списку.
Сайты:
- ФИПИ
- Официальный сайт Рособрнадзора
- Калькулятор баллов
- Решу ЕГЭ
- Яндекс.ЕГЭ
- КЕГЭ
- Сайт Константина Полякова
- Stepik
- 4ЕГЭ
- Информатикc
- Планета информатики
- Pascal.Основы программирования
YouTube видео:
- Евгений Джобс
- Вадим Божко
- Информатик БУ
- Alex Danov
- /Dev/inf
- Алексей Кабанов
- Тимофей Хирьянов
Приложения:
- Enki
- Sololearn
🗿Бонус:
- Советы для успешной подготовки к ЕГЭ по информатике
- Бесплатные ресурсы по другим предметам
Подготовка к ЕГЭ по информатике: базовые сервисы
Прежде чем перейдем к ресурсам, которые направлены именно на подготовку к ЕГЭ по информатике: мы просто обязаны дать вам базовые сервисы. Их должен знать каждый ученик, который готовится к экзаменам.
-
ФИПИ (Федеральный институт педагогических измерений) — этот сайт важен также, как для «Первый канал» для русского телевидения. Все новости, нововведения и правила сдачи ЕГЭ по информатике и другим предметам можно посмотреть на ФИПИ.
-
Официальный сайт Рособрнадзора — это второй по значимости сервис для тех, кто готовится к экзаменам. Тут примерно также, как и на ФИПИ: публикуют новости об экзаменах и нововведения, которые ожидают ЕГЭ.
-
Калькулятор баллов — этот сервис пока что просто можете посмотреть. Он пригодится вам тогда, как вы сдадите все экзамены. Как только вам будут известны баллы за последний экзамен, зайдите на этот сайт, введите все баллы, и сервис покажет: в какие ВУЗы вы проходите. Если у вас есть значок ГТО, сервис это также учтет и приплюсует вам несколько дополнительных баллов.
Подготовка к ЕГЭ по информатике: сайты
-
Решу ЕГЭ — универсальный сайт для подготовки к ЕГЭ не только по информатике, но и к любому другому предмету. На сайте можно решать тесты и сразу же смотреть, сколько баллов вы набрали. Если вы допустили ошибку, сервис это покажет и объяснит, что именно вы сделали неправильно.
-
Яндекс.ЕГЭ — это аналог предыдущего сайта, но только гораздо удобнее. Можете сравнить оба, и решить на чьей стороне вы
А если без шуток, то вы можете пользоваться этим сервисом для разнообразия. Здесь можно также решать тесты и смотреть, сколько баллов вы за них получили. Сайт также подсвечивает ошибки и разбирает решения простым языком.
-
КЕГЭ — ЕГЭ по информатике проходит не так, как на других предметах. Здесь вы сдаете экзамен на компьютере. Поэтому вам нужно быть готовыми к такому нестандартному формату. Как все проходит, решается и в чем особенности такого формата сдачи, можете посмотреть на этом сайте. Это некий тренажер и эмулятор реального ЕГЭ по информатике.
-
Сайт Константина Полякова — на этом сайте можно полноценно подготовиться к ЕГЭ по информатике. Здесь есть тесты, программы, эмуляторы, тренажеры и теория. Это некий портал, на котором собраны все материалы и инструменты, с которыми подготовка к ЕГЭ по информатике пройдет быстро и эффективно. Только не судите сайт по обложке. У него простенький дизайн, но это не отменяет его эффективность.
-
Stepik — подготовка к ЕГЭ по информатике должна начинаться с теории. На этом сайте вы можете пройти бесплатный курс по информатике, который состоит из 71 урока и 420 тестов. Не пугайтесь, тесты решать необязательно
Цель курса: сделать так, чтобы вы усвоили с 1 по 15 задание, которые ждут вас на экзамене.
-
4ЕГЭ — на сайте вы можете прорешать тесты, посмотреть свежие КИМы, скачать шпаргалку по разным заданиям для экзамена. К слову, этот сайт поможет вам не только при подготовке к ЕГЭ по информатике, но и к другим предметам.
-
Информатикс — большая библиотека по информатике, которая разбита на темы. Просто откройте тот раздел, который вам нужно повторить. Кстати, здесь нет никакой нудной и длинной теории. Вся информация преподносится кратким и понятным языком.
-
Планета информатики — еще одна библиотека с краткими конспектами, разложенная по разделам информатике. Открывайте нужную тему и изучайте.
-
Pascal. Основы программирования — это точно такая же библиотека с теорией, но только по языку программирования «Паскаль». Если вам нужно выучить или повторить этот язык, смело переходите на сайт и изучайте теорию. Там есть даже задачи для того, чтобы закрепили знание языка на практике.
Подготовка к ЕГЭ по информатике: YouTube-каналы и видео-лекции
-
Евгений Джобс — в каждом ролике Евгений разбирает отдельные здания и делает это так подробно и интересно, что подготовка к ЕГЭ по информатике проходит весело и непринужденно. Если у вас есть затыки по отдельным заданиям, можете заходить на канал и смотреть видео.
-
Вадим Божко — особенность канала в том, что автор публикует не простые видео, а короткие Shorts. В этих небольших роликах он разбирает задания, которые вас ждут на экзамене по информатике. Удивительно, но даже в таком коротком формате, все легко усваивается.
-
Информатик БУ — канал с превосходной картинкой и качеством материала. Автор заморачивается над каждым видосом и делает так, чтобы вам было не просто приятно смотреть, но и было все понятно.
-
Alex Danov — особенность канала в том, что в нем также разбираются каждый заданий из ЕГЭ по информатике, но делается это в небольших видео, которые идут по 5-7 минут. Понравится тем, кто не любит нудные и долгие лекции.
-
/Dev/inf — на канале есть полезные плейлисты, которые разбиты по темам. Можно посмотреть базовый курс видеороликов по подготовке к ЕГЭ по математике. Можно посмотреть видео с решениями отдельных заданий. Не будем перечислять все преимущества этого канала. Просто перейдите и посмотрите сами. Но будьте осторожны — может затянуть
-
Алексей Кабанов — еще один канал, на которым понятным и простым языком можно посмотреть разборы и решения всех заданий из ЕГЭ по информатике. Есть как длинные ролики, так и короткие — их можно чередовать, чтобы подготовка не наскучила.
-
Тимофей Хирьянов — это канал настоящего профессора, который точно разбирается в информатике. Но при этом вся информация подается простым и понятным языком.
Подготовка к ЕГЭ по информатике: приложения
-
Enki (Android, iOS) — при помощи этого приложения можно научить программировать. Причем сделать это максимально легко и играючи. Просто скачайте это приложение и попробуйте сами. При подготовке к ЕГЭ по информатике оно точно не помешает.
-
Sololearn (Android, iOS) — еще одно приложение с помощью которого можно научить программировать. Причем вы можете выбрать любой из 20 языков и освоить их прямо в приложении.
Советы для успешной подготовки к ЕГЭ по информатике:
Теперь у вас есть полноценный список из полезных ресурсов, которые помогут успешно подготовиться к ЕГЭ по информатике. Но как ими пользоваться, что попробовать первым делом, и как подготовиться эффективнее всего?
Не переживайте, мы подготовили для вас небольшой список советов и рекомендаций, который даст ответы на все эти вопросы.
Советы от онлайн-школы «Сотка»👇
-
Не забывайте про теорию. Без теории сдать экзамен на высокий балл будет трудно, поэтому периодически заглядывайте в библиотеки с конспектами, которые мы вам дали.
Вот они: 4ЕГЭ, Планета информатики, Информатикс.
-
Решайте больше тестов. Теория важна, но без практики сдать ЕГЭ тоже будет трудно. Поэтому решайте как можно больше тестов и смотретие на свои ошибки.
-
Смотрите YouTube. Мы дали вам список полезных каналов, на которых вы можете смотреть разборы и решения заданий из ЕГЭ по информатике. Выберите себе 3-4 канала и периодически смотрите их.
-
Работайте над ошибками. На сайте «Решу ЕГЭ» и «Яндекс. ЕГЭ» после того, как вы решили тест, можно сразу же просмотреть свои ошибки. Так вот, работайте больше над теми заданиями, в которых вы чаще всего ошибаетесь.
-
Не переживайте. До экзаменов еще много времени. Но и не стоит расслабляться, готовиться пора уже сейчас.
-
Будьте дисциплинированы. Выделите определенные дни и время для подготовки к экзамену и не пропускайте их.
-
Чередуйте подготовку с отдыхом. Информация усваивается лучше того, когда тело и мозг отдохнувшие.
Мы уверены, что вы сдадите экзамены на максимальный балл и поступите на бюджет в тот ВУЗ, в который хотите.
💙С заботой, ваша «Сотка».
Бесплатные ресурсы по другим предметам
Курсы ЕГЭ: 33 бесплатных сайта
Статья содержит информацию о курсах ЕГЭ по различным предметам, включая: литературу, математику, химию, русский язык, обществознание, информатику, физику, английский язык и биологию. Все курсы ЕГЭ являются бесплатными. Материал регулярно обновляется — сохраняйте в закладки.
Курсы ЕГЭ | youtube.com/c/devinf74
ЕГЭ 2023: расписание, изменения, бесплатные лекции
В статье вы найдете всю необходимую информацию по теме ЕГЭ 2023: расписание, баллы, изменения, а также бесплатные ресурсы для подготовки по любому предмету. Статья регулярно обновляется, поэтому смело добавляйте ее в Закладки.
Подготовка к ЕГЭ: 139 бесплатных сайтов
В статье вы найдете 139 бесплатных ресурсов для подготовки к ЕГЭ по следующим предметам: математика, русский язык, обществознание, информатика, физика, английский язык, литература, химия, биология. Статья регулярно обновляется — добавляйте в закладки.
🗣Понимаем, что это далеко не полный список полезных ресурсов для подготовки к ЕГЭ по информатике, поэтому будет рады, если вы поделитесь своими рекомендациями в комментариях👇

































