Научная статья на тему 'МЕТОДИКА ВЫПОЛНЕНИЯ ЗАДАНИЙ ЕГЭ ПО ИНФОРМАТИКЕ НА ОСНОВЕ ЗНАНИЙ ОБ ОБРАБОТКЕ СТРОК НА ЯЗЫКЕ PYTHON'

МЕТОДИКА ВЫПОЛНЕНИЯ ЗАДАНИЙ ЕГЭ ПО ИНФОРМАТИКЕ НА ОСНОВЕ ЗНАНИЙ ОБ ОБРАБОТКЕ СТРОК НА ЯЗЫКЕ PYTHON Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
433
40
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
строка / срез / методика обучения информатике / регулярные выражения / Python / КЕГЭ / string / test / methods of teaching computer science / regular expressions / Python / CUSE

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Александр Григорьевич Гильдин, Светлана Галимулловна Зайдуллина, Наиль Тагирович Ахтямов

Предметом статьи является использование возможностей языка Python для решения современных заданий компьютерного единого государственного экзамена по информатике на тему «Строки и их обработка». Работа со строковыми данными, реализованная на разных уровнях сложности, может стать, наряду с базой решения одного типа задач в рамках государственной аттестации школьников по информатике, хорошим дополнением для целого ряда задач с математическим контекстом, поможет проверить знания по основным алгоритмическим конструкциями и алгоритмам, включаемых в содержание курса информатики основной школы. Один из новых приемов работы со строкамирегулярные выражения. Работа с регулярными выражениями реализована во всех современных языках программирования, но их реализация различается в различных языках. Python – один из языков программирования, позволяющих удобно их использовать, в том числе и при решении школьных задач. Результаты. В первой части статьи представлены общие сведения о строковом типе данных, приведены таблицы с примерами использования основных функций обработки строк, применяемых при решении школьных задач. Во второй части показаны приемы решения нетривиальных задач с помощью методов обработки строк. Представлены реализация алгоритмов на языке Python, задач из открытых и популярных в сети Интернет источников для подготовки школьников к сдаче компьютерного единого государственного экзамена по информатике. В статье продемонстрирована работа со строками с помощью регулярных выражений. Всесторонне рассмотрены аспекты формирования паттернов регулярных выражений. Выявлен ряд неоспоримых преимуществ, связанных с применением такого мощного средства обработки данных, как встроенная библиотека Python для работы с регулярными выражениями в рамках решения задач компьютерного единого государственного экзамена по информатике.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

METHODOLOGY FOR COMPLETING USE TASKS IN COMPUTER SCIENCE BASED ON KNOWLEDGE ABOUT PROCESSING STRINGS IN THE PYTHON LANGUAGE TECHNIQUE FOR PERFORMING TASKS OF CUSE BASED ON KNOWLEDGE OF STRING PROCESSING IN PYTHON

The subject of the article is to use the capabilities of the Python language to solve modern tasks of the computer unified state exam in computer science on the topic "Strings and their processing". Working with string data, implemented at different levels of complexity, can become, along with the basis for solving one type of problem, the state certification of schoolchildren in computer science. It will be a good addition for a number of tasks with a mathematical context, knowledge testing on basic algorithmic constructions and algorithms included in the content of the computer science course of the primary school. One of the new techniques of working with strings is. Working with regular expressions which is implemented in all modern programming languages, but their implementation differs in different languages. Python is one of the programming languages that make it convenient to use them, including when solving school problems. Results. The first part of the article provides general information about the string data type, tables with examples of the use of basic string processing functions used in solving school problems. The second part shows techniques for solving non-trivial problems using string processing methods. The paper presents the implementation of algorithms in Python, tasks from open and popular Internet sources for preparing schoolchildren for the computer unified state exam in computer science. The article demonstrates working with strings using regular expressions. Aspects of the formation of patterns of regular expressions are comprehensively considered. The authors have identified a number of indisputable advantages associated with the use of such a powerful data processing tool as the built-in Python library for working with regular expressions as part of solving the problems of the computer unified state exam in computer science.

Текст научной работы на тему «МЕТОДИКА ВЫПОЛНЕНИЯ ЗАДАНИЙ ЕГЭ ПО ИНФОРМАТИКЕ НА ОСНОВЕ ЗНАНИЙ ОБ ОБРАБОТКЕ СТРОК НА ЯЗЫКЕ PYTHON»

Педагогический журнал Башкортостана. 2023. № 2. С. 120-138. Pedagogical Journal of Bashkortostan. 2023; (2): 120-138.

ИННОВАЦИОННЫЕ ТЕХНОЛОГИИ И ЭЛЕКТРОННОЕ ОБРАЗОВАНИЕ

Научная статья УДК 372.8

DOI: 10.21510/18173292 2023 100 2 120 138

3

МЕТОДИКА ВЫПОЛНЕНИЯ ЗАДАНИИ ЕГЭ ПО ИНФОРМАТИКЕ НА ОСНОВЕ ЗНАНИЙ ОБ ОБРАБОТКЕ СТРОК НА ЯЗЫКЕ PYTHON

Александр Григорьевич Гильдин1, Светлана Галимулловна Зайдуллина2, Наиль Тагирович Ахтямов3

1 Инженерный лицей № 83 имени Пинского М.С. УГНТУ, Уфа, Россия, sgildin@mail.ru

2 Уфимский государственный нефтяной технический университет, Уфа, Россия, sv_sa@mail.ru

Уфимский государственный нефтяной технический университет, Уфа, Россия, nail9119@rambler.ru

Аннотация. Предметом статьи является использование возможностей языка Python для решения современных заданий компьютерного единого государственного экзамена по информатике на тему «Строки и их обработка». Работа со строковыми данными, реализованная на разных уровнях сложности, может стать, наряду с базой решения одного типа задач в рамках государственной аттестации школьников по информатике, хорошим дополнением для целого ряда задач с математическим контекстом, поможет проверить знания по основным алгоритмическим конструкциями и алгоритмам, включаемых в содержание курса информатики основной школы. Один из новых приемов работы со строками - регулярные выражения. Работа с регулярными выражениями реализована во всех современных языках программирования, но их реализация различается в различных языках. Python - один из языков программирования, позволяющих удобно их использовать, в том числе и при решении школьных задач.

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

Ключевые слова, строка, срез, методика обучения информатике, регулярные выражения, Python, КЕГЭ

Для цитирования: Гильдин А.Г., Зайдуллина С.Г., Ахтямов Н.Т. Методика выполнения заданий ЕГЭ по информатике на основе знаний об обработке строк на языке Python // Педагогический журнал Башкортостана. 2023. № 2 (100). С. 120-138.

© Гильдин А.Г., Зайдуллина С.Г., Ахтямов Н.Т., 2023

INNOVATIVE TECHNOLOGIES AND E-EDUCATION

Original article.

METHODOLOGY FOR COMPLETING USE TASKS IN COMPUTER SCIENCE BASED ON KNOWLEDGE ABOUT PROCESSING STRINGS IN THE PYTHON LANGUAGE TECHNIQUE FOR PERFORMING TASKS OF CUSE BASED ON KNOWLEDGE OF STRING PROCESSING IN PYTHON

1 2 3

Aleksandr G. Gildin , Svetlana G. Zaidullina , Nail T. Akhtyamov

1 Lyceum №83 of Ufa, Russia, sgildin@mail.ru

2 Ufa State Petroleum Technical University, Ufa, Russia, sv_sa@mail.ru

3 Ufa State Petroleum Technical University, Ufa, Russia, nail9119@rambler.ru

Abstracts. The subject of the article is to use the capabilities of the Python language to solve modern tasks of the computer unified state exam in computer science on the topic "Strings and their processing". Working with string data, implemented at different levels of complexity, can become, along with the basis for solving one type of problem, the state certification of schoolchildren in computer science. It will be a good addition for a number of tasks with a mathematical context, knowledge testing on basic algorithmic constructions and algorithms included in the content of the computer science course of the primary school. One of the new techniques of working with strings is. Working with regular expressions which is implemented in all modern programming languages, but their implementation differs in different languages. Python is one of the programming languages that make it convenient to use them, including when solving school problems.

Results. The first part of the article provides general information about the string data type, tables with examples of the use of basic string processing functions used in solving school problems. The second part shows techniques for solving non-trivial problems using string processing methods. The paper presents the implementation of algorithms in Python, tasks from open and popular Internet sources for preparing schoolchildren for the computer unified state exam in computer science. The article demonstrates working with strings using regular expressions. Aspects of the formation of patterns of regular expressions are comprehensively considered. The authors have identified a number of indisputable advantages associated with the use of such a powerful data processing tool as the built-in Python library for working with regular expressions as part of solving the problems of the computer unified state exam in computer science.

Key words: string, test, methods of teaching computer science, regular expressions, Python, CUSE

For citing: Gildin A.G., Zaidullina S.G., Akhtyamov N.T. Technique for performing tasks of CUSE based on knowledges of string processing in Python. Pedagogicheskij zhurnal Bashkortostana = Pedagogical Journal of Bashkortostan. 2023; 100 (2): 120-138.

Введение. Анализ кодификатора компьютерного ЕГЭ по информатике за 2023 год свидетельствует о том, что работа со строками, и их обработка непосредственно проверяется в задании 24 - проверяемый элемент содержания «Умение создавать собственные программы (10-20 строк) для обработки символьной информации». Однако, изучив задания компьютерного ЕГЭ и возможности языка Python, педагогическим сообществом подмечено, что тема обработки строк может быть использована также в заданиях №№: 5, 8, 12, 14, 23, 24, 25, что позволяет найти достаточно эффективные решения. Основная

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

Теоретическая часть. Строковые типы данных и стандартные средства их обработки представлены в большинстве современных языков программирования. В том числе в языке Python, который, по нашему мнению, оптимален при решении большинства задач КЕГЭ. Строка - это упорядоченная последовательность символов. Строки могут содержать любые символы Unicode. Литеры заключаются в кавычки, в Python допустимы как одинарные, так и двойные кавычки. Для многострочных литералов можно использовать утроенные апострофы или утроенные кавычки. Некоторые символы вводятся в виде особых экранированных последовательностей: \n - новая строка, \t -горизонтальная табуляция, \\ - обратная наклонная черта, \"- кавычки, \u код символа - символ, заданный юникодом и т.д. Примеры написания строковых литералов (здесь и далее после символа # приводится значение переменной или результат работы команды): si = "строка 1"

s2 = 'строка2 \n с переводом строки внутри' s3 = u'\u043f\u0440\u0438\u0432\u0435\u0442' #привет x = 3 y = 5

s4 = f"{x}+{y}={(x+y)} " #3+5=8 s5 = r"c:\n.txt" #c:\n.txt

Следует обратить внимание на f-строки (s4) и r-строки (s5). f-строки позволяют легко подставлять в строку значения переменных или выражений. Для этого достаточно заключить их в фигурные скобки, r-строки позволяют отменить действие символа как начала экранированной

последовательности. Например, в переменной s5 "\n" не является переходом на новую строку.

Некоторые операции над строками: конкатенация " + ", повторение " * ". Примеры: s1 = 'komp' s2 = 'Ege' s3 = 'Inf'

s1 + s2 + s3 #kompEgeInf s2 = 3 * s2 # EgeEgeEge

Из строки можно извлекать символ или набор символов, т.е. получать срез или иначе подстроку. Оператор извлечения среза из строки: [a:b], где a -это индекс начала среза, а b - индекс окончания, причем символ с номером b в срез не входит. Если отсутствует первый индекс, то срез берется от начала строки до второго индекса; при отсутствии второго индекса, срез берется от первого индекса до конца строки. Можно извлекать символы не подряд, а через определенное количество символов: [а:Ь:с]; где с - это шаг, через который осуществляется выбор элементов. Нумерация символов в строках - с нуля. Примеры срезов приведены в таблице 1.

Табл. 1. Срезы строк

Срезы строк Описание Пример. s = 'kompEgelnf'

s[4:7] срез подстроки Ege

s[-1] обращение к символу по индексу с конца строки f

s[0] обращение к символу по индексу с начала строки k

s[4:] срез подстроки, начиная с заданного номера до конца строки EgeInf

s[1:9:3] срез подстроки с заданным шагом oEI

s[:4] срез подстроки, начиная с начала до заданного номера в строке komp

В таблице 2 приведены часто употребляемые методы обработки строк. Следует обратить внимание, что строки в Python являются неизменяемым типом данных. Поэтому результатом работы многих функций, в действительности, являются новые строки. Преобразование строки возвращает новый объект, а не модифицирует существующий. Некоторые параметры функций не являются обязательными.

Табл. 2. Функции обработки строк

Функция/метод Описание Пример

chr() Возвращает символ по его коду print(chr(97)) #a

ord() Возвращает код символа print(ord('+')) #43

len() Возвращает длину строки s='kompEgeInf print(len(s)) #10

str() Возвращает преобразованный в строку объект s1=1 s2=2 print(str(s1)+str(s2)) #12

.lower()/.upper() Возвращает строку в нижнем / в верхнем регистре s='Ok' print(s.lower()) #ok print(s.upper()) #OK

.count(sub, x1,x2) Возвращает количество вхождений подстроки sub в строку в диапазоне от x1 до x2 s='komp_ege_Inf print(s.count('e')) #2 print(s.count('_',0,6) ) #1

.endswith(sub, x1,x2) Определяет, заканчивается ли строка заданной подстрокой sub s='komp_ege_Inf print(s.endswith('Inf)) # True

.startswith(sub, x1,x2) Определяет, начинается ли строка с заданной подстроки s='komp_ege_Inf print(s.startswith('Inf)) #False

.find(sub, x1,x2) Поиск вхождения подстроки sub в строку, в диапазоне от х1 до х2; возвращает индекс первого вхождения подстроки, или -1, если подстрока не найдена s='AAABBBCC' print(s.find('B')) #3 s="AAABBAABCC" print(s.find('AA',2,len(s))) #5 s='AAABBBCC' print(s.find('CB'))

#-1

.rfind(sub, x1,x2) Поиск в строке заданной подстроки, с конца строки s='AAABBBCC' print(s.rfind('B')) #5

.replace(old, new, count) Возвращает строку, заменяя все фрагменты old на фрагменты new. Осуществляется не более count замен s='AAABBBCC' print(s.replace('A', 'Z')) #ZZZBBBCC s='AAABBBCC' print(s.replace('A', 'Z',2)) #ZZABBBCC

.join(iterable) Возвращает строку, полученную в результате объединения объектов в iterable. В качестве разделителя используется исходная строка print(', 'join(['11A', '11B', '11C'])) #11A, 11B, 11C print(' '.join(['11A', '11B', '11C'])) #11A11B11C print(' ! ' join('Informatika')) #I!n!f!o!r!m!a!t!i!k!a

split(sep, maxsplit) Разбивает строку по разделителю sep. Возвращает список полученных строк. Осуществляется не более maxsplit разбиений. print('Informatika'.split('a')) #['Inform', 'tik', '']

Методы и приемы решения задач КЕГЭ. Рассмотрим ряд примеров задач за 2022-2023 года, представленных на https://kpolyakov.spb.ru и https://inf-ege.sdamgia.ru. Их решение на базе строк поможет учащимся эффективно ускорить подготовку к сдаче ЕГЭ по информатике.

Задание 5. При работе с числами удобно бывает переводить их в строку и обрабатывать с помощью операций среза, конкатенации строк, условного оператора, циклов и т.д. Рассмотрим на примерах:

Задача № 4131 (источник https://kpolyakov.spb.ru/, А. Богданов). Алгоритм получает на вход натуральное число N >1 и строит по нему новое число R следующим образом:

1) Число N переводим в двоичную запись.

2) Инвертируем все биты числа, кроме первого.

3) Переводим в десятичную запись.

4) Складываем результат с исходным числом N.

Полученное число является искомым числом R. Укажите наименьшее нечетное число N, для которого результат работы данного алгоритма больше 99. В ответе это число запишите в десятичной системе счисления. Решение (см. стр.117):

В данном примере мы осуществляем перевод числа N в двоичную систему счисления с помощью стандартной функции bin, получаем строку из 1 и 0. Функция bin в начале строки добавляет символы "ox". Удалим их с помощью среза: bin(N)[2:]. Далее в цикле инвертируем все биты, начиная с индекса 1. Напомним, что в строках нумерация символов осуществляется с

нуля. Из строки Ns2 на выходе получаем новое число N2 = int(Ns2, 2). Преобразование в число осуществляется функцией int (строка, система счисления). Складываем два числа и проверяем, превышает ли сумма 99, если условие верно, то число найдено и поиск прерывается.

Ответ: 65

Задание 12. В задачах задания 12 может потребоваться знание методов работы со строками, чаще всего это задачи на «Исполнитель Редактор», например:

Задача №4975 (источник https://kpolyakov.spb.ru/). Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки символов.

1. заменить (v, w)

2. нашлось (v)

Первая команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Если цепочки v в строке нет, эта команда не изменяет строку. Вторая команда проверяет, встречается ли цепочка v в строке исполнителя Редактор.

Дана программа для исполнителя Редактор: НАЧАЛО

ПОКА НЕ нашлось(00) заменить(01, 210) заменить(02, 3101) заменить(03, 2012) КОНЕЦ ПОКА КОНЕЦ

Известно, что исходная строка начиналась с нуля и заканчивалась нулём, а между ними были только цифры 1, 2 и 3. После выполнения данной программы получилась строка, содержащая 56 единиц, 44 двойки и 19 троек. Сколько цифр было в исходной строке?

В решении реализуем предложенный в условии задачи алгоритм. С помощью вложенных циклов будем формировать строки s с различным количеством символов '1', '2' и '3'. Обратим внимание, что метод replace в языке Python по умолчанию реализует замену всех найденных фрагментов строки. А

команда "заменить" из условия задачи выполняет только одну замену. Поэтому в строках кода 7 - 9 использован необязательный параметр метода replace: в скобочках на третьем месте указано максимальное количество замен - 1. Решение выполнено с учётом предположения, что результат работы алгоритма не зависит от порядка следования цифр 1, 2, 3 в исходной строке.

1 2 3

5

й

7

8 9

10 11 12

I

for X in range[1, 100):

for y in range[1, 100):

for z in range[1, 100):

s = '0' + "l" * x + -2" * y + '3" * z + '0'

si = s

while not '00' in s:

s = s.replace['01', 210', 1) s = s.replace['02', '3101', 1) s = s.replace[ '03', '2012', 1) if s.count['l') == 56 and s.count["2') == and s.count['3') — print(len (si) ) break

19:

Ответ 32

Задание 14. Несмотря на то, что задания этого типа не предусматривают обработку строк, а направлены на работу с числами в разных системах исчисления, решение ряда задач при компьютерном проведении ЕГЭ упрощается написанием алгоритма с использованием методов обработки строк. Задача № 5351 (ЕГЭ-2022) (источник https://kpolyakov.spb.ru/). Значение выражения 4-6251920 + 4-1251930 - 4-251940 - 3-51950 - 1960 записали в системе счисления с основанием 5. Определите количество значащих нулей в этой записи.

Ответ: 1891

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Задание 23. Решение некоторых задач этого блока осуществляется с использованием рекурсии и строк.

Задача № 6036 (источник ^^: //кро1уакоу. spb .ш/). Исполнитель Калькулятор преобразует число, записанное на экране. У исполнителя есть три команды, которым присвоены коды:

A. Вычти 1

B. Вычти 2

C. Найди целую часть от деления на 2

Сколько существует программ, для которых при исходном числе 34 результатом будет являться число 2, при этом программа соответствует маске «?А*СВ?» (символ «?» означает ровно один произвольный символ; символ «*» означает любую последовательность символов произвольной длины; в том числе «*» может задавать и пустую последовательность) и не содержит двух идущих подряд одинаковых команд?

Для решения этой задачи напишем рекурсивную функцию f(x, y, s). Параметр x - текущее число на экране исполнителя; y - ожидаемый результат; s - программа, с помощью которой получено число x. Мы осуществляем проверку соответствия программы, записанной в строке s, маске «?A*CB?» с помощью срезов: s[l] == 'A' and s[-2] == 'В' and s[-3] == 'С'.

i 2 3 А 5 £

7

8 9

10 11 12

13

14

15

def f(x, у, s):

if х -- у and ler[s) > 2 and f2[s) == 1 and s[l] = 'A' and s[-2] == 'B' and s[-3] == С

return 1 if x < y: return 0

return f(x - 1, y, s + 'A') + f[x - 2, y, s + 'B') + f[x // 2, y, s + 'C')

def Г?(s): if функция проверни условия «и не содержит двух идущих подряд одинаковых команд» t = 1

for i in range(len(s) - 1): if s[i] == s[i + 1]: t = 0

return t

print [f(34, 2, "))

Ответ:32

Задание 24. Основной тип задач на проверку умения работать со строками. Рассмотрим примеры использования срезов строк из таблицы 1 и методов из таблицы 2.

Ответ:433

Задача № 2556 (источник https://kpolyakov.spb.ru/). Текстовый файл 24-s1.txt состоит не более чем из 106 заглавных латинских букв (A..Z). Текст разбит на строки различной длины. Определите количество строк, в которых комбинация YZ встречается больше одного раза.

Суть алгоритма заключается в циклическом проходе по строкам файла и проверки условия на наличие комбинация YZ больше одного раза в строке. В этом алгоритме применен метод count.

В следующей задаче №4041 (источник https://kpolyakov.spb.ru/). Текстовый файл 24-164.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита (ABC...Z). Текст разбит на строки различной длины. В строках, содержащих менее 15 букв G, нужно определить и вывести максимальное расстояние между одинаковыми буквами в одной строке.

Пример. Исходный файл:

VOVA

ZAGALG

QRAGQT

В этом примере во всех строках меньше 15 букв G. Самое большое расстояние между одинаковыми буквами - в третьей строке между буквами Q, расположенными в строке на 1-й и 5-й позициях. В ответе для данного примера нужно вывести число 4.

Заметим, что задачу для уточнения условия нужно дополнить более корректным примером, например таким: "Для строки 'QRAGQTQB' ответ должен быть 5".

Ответ:916

В ходе решения находим строки соответствующие первому условию if s.count('G') < 15, после чего осуществляем поиск соответствия второму условию - расстояние между одинаковыми буквами в одной строке. Находим вхождение символа s[j] в строку s начиная с конца строки s.rfind(s[j]), значение len_p = b - j вычисляет количество символов между одинаковыми буквами. В переменную m сохраняем максимальную длину такой последовательности, с помощью встроенной функции max.

Рассмотрим еще один пример, базирующийся на строках и срезах: задача №33526 (источник https://inf-ege.sdamgia.ru/). Текстовый файл содержит только заглавные буквы латинского алфавита (ABC...Z). Определите символ, который чаще всего встречается в файле между двумя одинаковыми символами. Например, в тексте CBCABABACCC есть комбинации CBC, ABA (два раза), BAB и CCC. Чаще всего - 3 раза - между двумя одинаковыми символами стоит B, в ответе для этого случая надо написать B.

Используя переменную alf, хранящую строку алфавита и массив a, содержащий 26 элементов, проходим по строке s и между двумя одинаковыми символами (if s[i]==s[i+2]:) проводим подсчет букв латинского алфавита for j in range(26): if s[i+1]==alf[j]: a[j]+=1. Далее в цикле for определяем чаще всего встречающуюся букву, выводим ее по индексу в массиве.

э - орег ["24^33 Лхг'О . геасШпеО аТР = АБСОЕРбНиКЬНМОРрРЗТитеХУ:'

Ответ: Э

Задание 25. Приведем еще один пример не очевидного, на первый взгляд, использования строк, позволяющий упростить решение задачи из заданий 25.

Задача № 4410 (источник https://kpolyakov.spb.ru/). Среди чисел, больших 520000, найти такие, для которых сумма всех нетривиальных делителей (не считая единицы и самого числа) образует число-палиндром. Вывести первые пять чисел, удовлетворяющих выше описанному условию, справа от каждого числа вывести его максимальный нетривиальный делитель.

Рисунок 1. Выводим само число х и максимальный нетривиальный делитель

1 2 3

5

6

7

8 9

10 11 12 13 U

15

16

17

18

19

20 21 22

23

24

25

import math

def f[si):

s2 = sl[::-1] t - True if si != s2:

t = False return t

i = 0

X = 520000 while i < 5:

e = n = S

for y in range[2, irt[matfi.sqrt[x)) + 1): if x % y == 0:

s += y

in = max(y, m) if y != x n y: s += x // y in - maxCm, x // y)

z = str(s) if f(z) and s != 0: i += 1

print(x, ' ', n)

X = X + 1

520211 16781 520993 47363 521653 47423 521947 16837 522077 22699

В приведённом решении в функции f(s1), с помощью срезов строк, формируем строку перевертыш s2= s1[::-1], затем с помощью условия if s1!= s2 проверяем является она палиндромом или нет. В основной программе, в цикле while i < 5 находим 5 чисел, больших 520000, для которых сумма всех нетривиальных делителей (переменная s) образует число-палиндром - if f(z) and s!=0: print (x,' ',m). Выводим само число x и максимальный нетривиальный делитель (Рис.1.).

В задачах аналогичной № 5620 (источник https://kpolyakov.spb.ru) эффективно использовать f-строки Python.

Условие задачи: Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

- символ «?» означает ровно одну произвольную цифру;

- символ «Ч» означает ровно одну произвольную четную цифру;

- символ «Н» означает ровно одну произвольную нечетную цифру.

Например, маске Ч?Н2 соответствуют числа 2912, 6012, 6772 и т.д. Среди

натуральных чисел, не превышающих 10А8, найдите все числа, соответствующие маске 11Ч??Н11, делящиеся на 2023 без остатка. В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце - соответствующие им результаты деления этих чисел на 2023.

0твет:11039511 5457 11444111 5657 11848711 5857

Говоря об обработке строк, будет несправедливо обойти стороной так называемые "Регулярные выражения" (сокращение "РВ"). Их необычный синтаксис часто отпугивает начинающих программистов, хотя при умелом использовании, регулярные выражения могут значительно упросить решение задач обработки текста. Итак, речь идет о дополнительном (относительно базовых средств языка) механизме обработки строк. В основе РВ лежит понятие паттерна, иногда его называют шаблоном. Паттерн - это специальным образом сформированная строка, которой может соответствовать или не соответствовать некоторый фрагмент текста. Если паттерн не содержит

130

никаких специальных символов, то полностью ему соответствует фрагмент текста, который абсолютно совпадает с ним. Паттерну "Питон" соответствует только строка "Питон". Если в шаблон добавить специальные символы, то ему будут соответствовать различные фрагменты текста. Например, символ точка означает "один любой символ". Паттерну "Питон." будут полностью соответствовать такие строки: "Питону", "Питона" или "Питоны". А вот строка "Питон" паттерну "Питон." соответствовать не будет.

Для использования РВ в Python следует в самом начале программы прописать подключение модуля import re. Рассмотрим некоторые команды этого модуля в таблице 3.

Табл. 3. Методы модуля ге для работы с регулярными выражениями

Метод / команда Описание

re.match(pattern, string) Определяет, соответствует ли начало строки string паттерну pattern. Если не соответствует, то данный метод возвращает None. Поэтому re.match(...) можно использовать в обычной условной конструкции в качестве условия. Если начало строки string соответствует шаблону pattern, то метод возвращает объект класса mateh. Объект класса match содержит численные методы start() и end(). Они позволяют определить начало и конец соответствующего паттерну фрагмента. В данном случае метод start() может возвращать только 0. Объект класса match содержит также метод group(), возвращающий найденный фрагмент в виде строки. Третьим необязательным параметром здесь и далее может идти флаг. Например, re.I, или его полная версия re.IGNORECASE, отключающий различия между строчными и прописными буквами при сопоставлении строки с шаблоном.

re.fullmatch(pattern, string) Определяет, соответствует ли строка string целиком шаблону pattern. Если не соответствует — возвращает None. Поэтому re.fullmatch(...) можно использовать в обычной условной конструкции в качестве условия.

re.search(pattern, string) Ищет первое вхождение строки, соответствующей шаблону pattern слева направо в строке string. Если никакой фрагмент строки string не соответствует шаблону pattern - возвращает None. Если же такой фрагмент, или фрагменты есть, то возвращает объект класса mateh.

re.findall(pattern, string) Ищет в строке string все вхождения, соответствующие шаблону pattern. Возвращает найденные фрагменты в виде списка строк.

re.split(pattern, string, [maxsplit=0]) Разбивает строку string, используя в качестве разделителя шаблон pattern. Если задан параметр maxsplit, то выполняется не более заданного количества первых слева направо разбиений. Возвращает список строк.

re.sub(pattern, repl, string) Возвращает строку, в которой все подстроки строки string, соответствующие шаблону pattern заменены строкой repl.

re.finditer(pattern, string) Возвращает итератор, перебирающий все вхождения, соответствующие шаблону pattern, в виде объектов класса match.

Обычный неспециальный символ паттерна соответствует именно этому символу строки на своем месте. Помимо обычных символов в РВ используются специальные: . А $ * + ? { } [ ] \ | ( ) -. Если в искомом фрагменте требуется найти один из этих символов, то его экранируют и перед ним ставят символ \. Рассмотрим специальные символы и конструкции в таблице 4.

Табл. 4. Значение символов в шаблонах

Символ(ы) Описание

Один любой символ, кроме символа перевода строки \п. Если символ перевода строки тоже должен соответствовать точке в шаблоне, то при использовании методов, определяющих соответствие шаблону, следует добавлять флаг ге^ или его полную версию ге^ОТАЬЬ.

[..] Один из символов на месте точек. Допускаются диапазоны через тире.

Один любой символ, кроме тех, что на месте точек

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

\w Одна любая цифра или буква — все, кроме буквы или цифры)

\d Одна любая цифра, т.е. то же, что и [0-9] (\Э — все, кроме цифры)

\s Один любой пробельный символ (\Б — любой непробельный символ)

\b Граница слова (\В - не граница слова)

л и $ Начало и конец строки соответственно

Например, паттерн "па[123].те" означает, что в соответствующем ему фрагменте на первом месте будет располагаться буква "п", на втором - буква "а", на третьем - одна из цифр 1, 2, или 3. Четвертый символ - любой, на пятом месте - буква "т" и на шестом - "е". Теперь рассмотрим использование этого паттерна в конструкциях языка программирования. if re.fullmatch("па[123].те", "па123те"): print(1) else: print(0)

Вывод: 0

В строке "па123те" любая одна цифра является лишней. Фрагмент паттерна [123] означает, что на соответствующем месте должен быть ровно один из символов 1,2 или 3. Символ точка в паттерне означает любой символ, в том числе это может быть и цифра, но только одна.

Рассмотрим пример: if re.fullmatch("па[123].те", "па21те"): print(1) else: print(0)

Вывод: 1

В данном случае в строке "па21те" двойка - это один из символов [123], а единица - символ, обозначенный в паттерне точкой.

Следующий пример: if re. fullmatch ("па[123].те", "па21тема"): print (1)

else:

print(0)

Вывод:0

Начало строки "па21тема" полностью соответствует паттерну "па[123].те", но именно начало, а не вся строка целиком. Команда re.full match определяет, соответствует ли строка шаблону целиком.

Например, фрагмент: if re.match("па[123].те", "па21тема"): print(1) else: print(0)

Выведет в консоль 1, так как команда re.match определяет соответствие начала строки паттерну.

Вслед за любым символом РВ позволяют указать количество таких символов. Это можно сделать несколькими способами.

Табл. 5. Описание группы символов в шаблонах

+ 1 и более вхождений символа, записанного слева от знака +

* 0 и более вхождений символа, записанного слева от знака *

? 0 или 1 вхождение символа, записанного слева от знака ?

{n} Ровно п вхождений символа, указанного перед фигурными скобками

{n,m} От п до т вхождений символа, указанного перед фигурными скобками. Существуют альтернативные формы написания: {,т} — от 0 до т вхождений; {т,} — не менее т вхождений

Рассмотрим шаблон 7b[123456789][0123456789]{3}/b", ему соответствует любое четырехразрядное число десятичной системы счисления. На первом месте должна располагаться любая цифра кроме 0, а на следующих трех позициях - любые цифры от 0 до 9. Этот паттерн можно записать короче: "\b[1-9][0-9]{3}\b". Или с использованием специального символа "\d", означающего любую цифру: "\b[1-9]\d{3}\b". Можно записать так: "\b[1-9]\d\d\d\b".

С учетом сказанного, в одной и той же строке заданному паттерну может соответствовать фрагмент различной длины. Рассмотрим пример: st1 = re.match("na[123]Te!+."f "па2те!!!!!тика")

Плюс означает одно или более повторений восклицательного знака. В строке "па2тема!! Штика" существует несколько фрагментов, начинающихся с нулевого символа, которые соответствуют паттерну "па[123]те!+.". Это такие строки: "па2те!!", "па2те!!!", "па2те!!!!", "па2те!!!!!", "па2те!!!!!т". Обратите внимание, команда модуля re выполнит поиск максимально длинной подстроки, соответствующей паттерну.

stl = re.match["га[12J]re!+."r "па2те!!!!!тика")

Вывод программы: <re.Match object; span=(0, 11), match-па2те!!!! !т'>

Результаты работы подтверждают: si представляет собой объект класса re.Math. Найденный командой re.math фрагмент начинается в позиции 0 и продолжается до позиции 11 не включительно (метод span() возвращает начало

и конец найденного фрагмента в виде кортежа). Сам фрагмент такой: "па2те!!!!!т".

Довольно часто требуется указать не количество повторений одного символа, а количество повторов некоторого фрагмента. Это можно сделать с помощью такой конструкции в паттерне: (?:фрагмент) и далее количество повторений любым рассмотренным выше способом. Например:

import ге

li = ге.findall("(?:кот)+"г "рокот коткоткот катокот")

printCli)

Вывод программы: ['кот', 'коткоткот', 'кот']

В данном случае в переменной li будет сформировался список из всех найденных фрагментов: ['кот', 'коткоткот', 'кот'].

Рассмотрим более сложный пример:

р = ге.finfiallf"(?:тот)+", "котототототф")

Вывод программы: ['тот', 'тот']

В переменной p сформировался список из отдельных слов "тот": ['тот', 'тот']. Первый фрагмент "тот" python найдет в строке "котототототф", начиная со второго символа (нумерация с нуля). Таким образом, первое слово "тот" занимает символы с номерами 2,3,4. А вот следующее повторение слова "тот" python ищет со следующего, с пятого символа. Для того, чтобы показать, что фрагмент должен завершаться каким-либо символом, но последующий поиск осуществлялся бы именно с него, можно воспользоваться следующей конструкцией в паттерне: (?=концовка). Впрочем, сама концовка в найденный фрагмент включена не будет. При выполнении команды

p = re.findall("(?:To(?=T))+", "котототототф"), в переменной p будет сформирован следующий список: ['тототото'].

Рассмотрим решение некоторых задач КЕГЭ с помощью механизма РВ. Условия задач возьмем с сайта.

Задание 24. Задача №27689. Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальную длину цепочки вида XYZXYZXYZ... (составленной из фрагментов XYZ, последний фрагмент может быть неполным).

Сначала сформируем паттерн, соответствующий цепочке вида XYZXYZXYZ... Это должен быть фрагмент "XYZ" повторенный любое максимальное количество раз и добавленный к нему один раз символ "X" или сочетание символов "XY". Логическая связка "или" в РВ записывается вертикальной чертой. Описываемый паттерн может выглядеть, например, так "(?:XYZ)+(?:X|XY)?". Разберем этот паттерн по частям: (?:XYZ) строка "XYZ" объединена во фрагмент конструкцией "(?: )" для того, чтобы после нее можно было указать количество повторений. Это количество повторений, а

именно одно или более, задано символом "+". Мы получили первый фрагмент паттерна: "(?:XYZ)+". Далее, один из фрагментов: символ "X" или символы "XY" могут быть записаны ноль или один раз. Такое количество выражается символом "?". Получили вторую часть паттерна: "(?:X|XY)?".

Таким образом, список из всех подходящих цепочек может быть получен командой

t=re.findall("(?:XYZ)+(?:X|XY)?"/ open("24.txt"). readline())

Теперь из этого списка следует выбрать фрагмент максимальной длины. Нужно помнить, что по умолчанию строки сравниваются не по длине, а по алфавиту, таким образом, конструкцией max(t) будет получена не самая длинная строка, а последняя по алфавиту строка списка t.

Воспользуемся именованным параметром функции max. Это параметр key, позволяющий определить функцию для предшествующей сравнению обработке элементов последовательности, из которой определяется максимум. Теперь определение максимальной по длине строки будет выглядеть так: max(tf key=len). Саму длину получившейся строки определим с помощью функции len:

len (max(t, key=len)). Приведем полное решение.

Ответ: 13

Решение на основе РВ заняло три строчки кода. Подставив в последнюю строку вместо переменной X конструкцию ее получения, можно записать решение в две строки:

Ответ: 13

Задача №37159. Текстовый файл состоит не более чем из 107 строчных букв английского алфавита. Найдите максимальную длину подстроки, в которой символы «а» и «й» не стоят рядом.

В качестве одной из идей решения рассмотрим разбиение исходной строки на фрагменты, используя в качестве разделителей подстроку "аё" или "ёа". Рассмотрим пример исходной строки: "хххххххххххххаёссссссссёаррррррррёааёХХШ".

Разделяя эту строку описанным выше образом, получим такие строки: "ххххххххххххх", "сссссссс", "рррррррр", "","ХХХХХХ". Заметим, что это не максимально длинные фрагменты, соответствующие условию задачи. К строке "ххххххххххххх" можно еще дописать символ "а". Строка "сссссссс" должна с двух сторон содержать символ "ё". К строке "рррррррр" слева следует дописать символ "а", а справа - символ "ё". И т.д. Таким образом, длина первой и

последней строк увеличится на 1, а длина всех промежуточных строк (если полностью корректно, то кроме пустых) увеличится на 2. Поэтому выведем отдельно длины первого и последнего фрагментов и максимальную длину среди всех промежуточных:

import ге

s = open("24.txt>') . readlineO .rstripO myList ~ re.split(r"ad|da", s) print(len[myList[0]), ler[myList[-1]1) printClenCmaxCmyList, key=len)))

0твет:30 7772250

Следовательно, максимальную длину имеет фрагмент внутри строки и ответ будет 2250+2 = 2252.

Другое решение: заменим все сочетания "ad" и "da" на фрагменты с пробелом, например, на фрагменты "* *". Это можно сделать, например, конструкцией:

s = re.sub(r"ad|da"/"* *",s).

Теперь для получения ответа достаточно разбить строку s на фрагменты обычным методом split. В качестве стандартного разделителя будет использован пробел.

Приведем полное решение.

import re

s = open("2ii.txt"). readlineO ■ rstripO

s = re.sub(r"ad|da", *", s)

myList = s.split 0

print[ler[max(myList, key=len)))

В завершение разберем решение одной из рассмотренных выше задач; задача № 6036 (источник https://kpolyakov.spb.ru/).

Как и в предыдущем решении реализуем рекурсивную функцию А(х, s), на вход которой подадим два параметра: х - текущее число на экране исполнителя; ^ - программа, с помощью которой получено число х. Ожидаемый результат передавать в функцию не будем для сокращения кода.

Проверки соответствия программы в переменной s условиям задачи выполним с помощью РВ.

: 2 3

5

6

7

8 9

10 11 12

13

14

import re

def f (х, s):

if x < 2 or re.search(,,AA|BB|CC,,J s):

return 0 if x == 2:

if re.fullmatch(".A. *CB.'\ s):

return 1 else:

return 0

return fCx - 1, s + 'A') + f(x - 2, s + 'Б') + f[x Ц 2, s + 'С')

prirtCf[34, ■■))

В строке 4 в условной конструкции используется код re.search("AAlBBlcc", s). На естественный язык фраза переводится так: если в строке s встречается фрагмент AA, BB, или CC. Для определения соответствия программы, записанной в переменной s, маске из условия задачи используется паттерн ".A.*CB.". Здесь точка означает любой один символ, а .* означает любое количество произвольных символов.

Использование РВ позволило сократить код и избавится от функции f2.

Заключение. Нами были рассмотрены основные приемы обработки строк в решении задач компьютерного ЕГЭ по информатике. Предложены решения ряда задач на основе более привычных методов и срезов, а также подробно рассмотрены регулярные выражения и их реализация в языке Python. Последние еще не нашли, на настоящий момент времени, широкого применения у учителей школ. Выбор метода решения задачи всегда остается за экзаменуемым. Учителю в современных реалиях подготовки, учащихся к компьютерному ЕГЭ по информатике необходимо, на наш взгляд, уделить определенно больше времени теме «Обработка строк». Знакомство с различными технологиями обработки строк существенно расширяет арсенал будущего программиста.

Список источников

1. Документация по языку Python3. - URL: https://docs-python.ru/ (дата обращения: 02.04.2023).

2. Методические материалы и программное обеспечение для школьников и учителей -

URL: https://kpolyakov.spb.ru/ (дата обращения: 02.04.2023). 3. Образовательный портал для подготовки к экзаменам. - URL: https://inf-

ege.sdamgia.ru/(дата обращения: 02.04.2023). 4. Информатика и переводные экзамены в Лицее 83 / Режим доступа:

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

https://licey83.narod.ru/. - URL: https://licey83.narod.ru/(дата обращения: 02.04.2023).

References

1. Python3 language documentation. Available at: https://docs-python.ru/ (accessed 02 April 2023) (In Russian)

2. Methodological materials and software for schoolchildren and teachers. Available at: https://kpolyakov.spb.ru/(accessed 02 April 2023) (In Russian)

3. Educational portal for exam preparation / Available at: https://inf-ege.sdamgia.ru/(accessed 02 April 2023) (In Russian)

4. Informatics and translation exams at Lyceum 83. Available at: https://licey83.narod.ru/(accessed 02 April 2023) (In Russian)

Заявленный вклад авторов статьи:

Авторы внесли равный вклад в подготовку статьи.

The declared contribution of the authors of the article:

The authors contributed equally to the preparation of the article.

Авторы прочитали и одобрили окончательный вариант рукописи.

Authors have read and approved the final manuscript.

Статья поступила в редакцию 18.05.2023; одобрена после рецензирования 16.06.2023; принята к публикации 20.06.2023.

The article was submitted 18.05.2023; approved after reviewing 16.06.2023; accepted for publication 20.06.2023.

i Надоели баннеры? Вы всегда можете отключить рекламу.