Сегодня ключевой момент нашего ликбез-марафона. Мы с вами открываем второй раздел курса от 0 до Могу. Этот набор статей-лекций-видео - мощный практикум с применением программирования на Python, который будет посвящён алгоритмике – т.е. разного рода заданиям по обработке текстов, кодов, символов, чисел в разных исполнителях.
· Этот Урок 12 состоит из двух частей; он продолжит тему системы счисления и раскроет все тайны одного из самых сложных заданий ЕГЭ №5 – преобразование в системах счисления.
· Урок 13 покажет как эффективно и максимально просто разобраться в разного рода хитростях по обработке строковых переменных – задание ЕГЭ №12.
· Урок 14 победит одно из трудно решаемых заданий II части ЕГЭ по обработке текстов – задание ЕГЭ № 24.
· Урок 15 приблизит вас к 100 баллам ЕГЭ, научив безошибочно справляться со всеми разноплановыми сложностями в задании ЕГЭ №25 по маскам файлов и делителям в числовых рядах.
· Некоторые уроки могут идти в эфир оперативно как неплановые.
В ближайшее время такой неплановый урок будет по самому нестандартному заданию ЕГЭ №13 – маски сети, который откроет вам тайны мира сетей и суть ip-адресов наших ПК.
На данный момент из ранее представленных на канале статей курса вы уже практически владеете почти всеми основными базовыми знаниями в информатике, можете читать и понимать несложный программный код на Python и самое главное, надеюсь, логически понимать суть основных понятий такой многогранной предметной области, как информатика.
В общем, раздел курса, как и обещала ранее, будет своего рода боевым крещением и от победы в этом разделе, будет зависеть успех в освоении всего курса. Конечно же, ещё не все теоретические моменты были освещены в статьях ранее. Предстоит также пройти ряд понятий, связанных с логикой процессов в ПК, разобрать технические азы по ПК, по файловой системе, моделированию, игровым стратегиям и др. темам. Но всему своё время, а этот раздел курса я посвящаю творчеству и практическим наработкам, благодаря которым вы сможете по-другому увидеть информатику и себя в ней.
За многие годы практики мне вольно и невольно приходилось нести азы знаний и обучать работе как пользователей, так и учащихся и студентов; и я столкнулась с тем, что обучение именно этим навыкам сопряжено с немалыми трудностями и практически полным отсутствием у моих подопечных фундаментальных базовых знаний по предмету. Вот и созрела идея сделать этот курс своего рода стартом для вас в мир it c логической схемой подачи всей многогранной его мозаики. Некоторые читатели полемизируют по поводу названия предмета, его составляющих, его происхождения. Но как бы ни называлась информатика, думаю, все понимают, что будь ты гуманитарий или физик или лирик или просто человек, без этих знаний – ты просто не в теме самой жизни.
Скажу, что работа по созданию этого курса нелёгкая и подаётся на Дзен непросто, поэтому, кто дружит с нами, помогайте нам быть и творить!
Итак, идём дальше и сегодня мы с вами поднимем на более высокий уровень представленную на предыдущем уроке тему систем счисления, как бы разберём её в более сложном логическом варианте. Практикум урока построен на задании ЕГЭ №5 разной сложности.
Каждый год эксперты ЕГЭ не устают нас “веселить” своими отчаянными попытками загнать школьников в тупик и вынудить их бежать после 9 класса, куда глаза глядят или не глядят. Конечно, революция не стоит на месте и 60-летние академики хотят вложить в подростка всю всемирную мудрость мироздания, забирая у них детство, спокойный сон и время на увлечения и хобби. Но у нас с ребятами, по современной жизни, выработался девиз: “ всё, что нас не убьёт, сделает нас сильнее”. Очень хочется всегда, очередной раз разбирая творчество сочинителей экзаменов, напомнить им, что экзамен - не олимпиада и регламент 8 мин. не предполагает в режиме человека – не робота задач в два-три раза более затратных во времени. Конечно, сочинять – не решать, но почему-то здравый смысл и алогичные тенденции всё больше стали наполнять нашу реальность. Поэтому нам остаётся один путь – мирный, найти такие пути полётных решений, чтобы предвосхитить реальные цели организаторов всего этого процесса под названием ЕГЭ.
Итак, практикум №8 по теме системы счисления посвящаем заданию №5 ЕГЭ. На нём разберём преобразование двоичных, троичных и четверичных чисел в среде Python и для некоторых заданий разберём более эффективные ручные методы решения.
Коротко о сути заданий. Вам надо на основе поданного алгоритма найти либо исходное число, зная результат, либо конечное, зная исходное. Особенность и в какой-то степени сложность в том, что числа представлены не в десятичной системе, а в двоичной в основном. Но этого оказалось мало и в 2024 году ФИПИ добавило в ЕГЭ ещё троичные и четверичные числа. По мере усложнения разберём все типовые варианты. Но в любом случае, что бы ни добавилось ещё, если вы внимательно проработаете предыдущую статью и этот практикум,, то решите любое задание по этой теме.
Практикум №8
Задание 1: ЕГЭ Зад. 5
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
a) если сумма цифр в двоичной записи числа чётная, то к этой записи справа дописывается 10, а затем три левых разряда заменяются на 110;
b) если сумма цифр в двоичной записи числа нечётная, то к этой записи справа дописывается 101, а затем два левых разряда заменяются на 10;
Полученная таким образом запись является двоичной записью искомого числа R. Укажите такое минимальное число N , после обработки которого с помощью этого алгоритма получается число R, большее 120. В ответе запишите это число в 10-ичной системе счисления.
Решение: данное задание эффективнее и гораздо надёжнее решать программным путём; есть некое число N, которое преобразовали в 2-ичное и затем, с учётом кол-ва символов в двоичном представлении, изменили с прибавлением разных комбинаций 0 и 1; получили при этом некое число R - результат, которое перевели в 10-ичное и проверили на условие, что оно должно быть больше 120; на печать выдать требуется минимальное значение исходного числа N в 10-ичном представлении. Это небольшая интерпретация на русский, а теперь разберём программный код. 1) так как нужно найти число N, т.е. подобрать его, то в цикле for методом перебора (от 1 до 1000 приблизительно, поскольку ищем минимальное) в диапазоне (range) будем рассматривать десятичные числа и преобразовывать в двоичные.
Внимательно! Новая функция bin(число) даёт результат в виде строки, являющейся двоичным представлением числа без незначащих нулей впереди. Признак двоичности числа всегда прописывается в начале строки и представлен двумя символами 0b.
Для того, чтобы отделить этот признак от самого 2-ичного представления, используем ещё одну очень интересную функцию в Python
Внимательно! Новая функция slice() через формат строка[диапазон] даёт результат в виде части (среза) строки или массива (списка), указанного в [диапазоне]. В диапазоне указывается начальный и конечный индексы исходной строки для среза, а также может быть указан третий параметр - шаг для выбора элементов среза; отделяются все параметры двоеточием. Подробно будем рассматривать все особенности по мере освоения Python. Например возьмём строку s='23456789'; варианты срезов: 1 )s[1::]='3456789'; 2) s[3:6]='567'; 3) s[1::3]='369' 4) s[:-1]='9' 5) s[:-3]='23456' 6) s[0]='2'
Как видим из примеров, что можно указать срез, задав начальный символ при помощи его индекса и указав на все символы после него при помощи двоеточия (пример 1); можно задать часть строки при помощи начала и конца; при этом не забывайте, что признак окончания – не последнее число, а предпоследнее, пример 2, где выбираются не 5, 6, 7, 8 символы, а не включая последний (пограничный) элемент-5, 6, 7. Пример 3 показывает применение диапазона с шагом; от первого (не путать с нулевым) до конца строки берётся каждый третий символ. Ещё одна особенность срезов в том, что они могут иметь обратную индексацию с конца, на что указывает отрицательная нумерация (примеры 4,5.).
Возвращаемся к заданию, где во 2 строке применим срез для снятия признака двоичности строки . Затем при помощи уже известного нам метода count() проверяем чётность суммы цифр 2-ичного числа по кол-ву единиц: если единиц чётное кол-во, то и сумма всех цифр будет чётной. Последующие строки 4-6 показывают сборку строки при помощи срезов. Операция + позволяет ставить строки рядом, объединяя их, а срезы выбирают нужные фрагменты строк. Вот так всё просто! Поскольку результат R нужно перевести в десятичное число и сравнить с 120, то используем ещё одну функцию, о которой подробно описывалось в статье с практикумом по кодированию. Напоминаю, int(строка, система счисления), например int(1111,2) даст результат преобразования двоичного числа 1111 в десятичное 15. Не забывайте, что параметр всегда строка, а вместо 2-ичного могут быть указаны любые системы счисления.
А попробуйте объяснить, почему в Python можно в десятичное число перевести число любой системы счисления, а наоборот из десятичного в любое число (кроме двоичных) нет, Если предыдущий урок вы прочли внимательно, то сможете объяснить почему.
И завершаем разбор задания 1. После проверки условия на значение R выводим результат и поскольку надо найти минимальное значение N, то прерываем цикл командой break.
Задание 2: ЕГЭ Зад. 5
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
a) если N кратно 5, то к этой записи справа дописывается две последние цифры двоичной записи числа N;
b) если N не кратно 5, то остаток от деления числа N на 5 умножается на 2, переводится в двоичную систему и записывается справа от полученного числа.
Полученная таким образом запись является двоичной записью искомого числа R. Укажите такое максимальное число N, после обработки которого с помощью этого алгоритма получается число R, меньшее 150. В ответе запишите это число в 10-ичной системе счисления.
Решение: первое задание рассмотрено подробно, поэтому в данном решении опишем лишь особенности данного алгоритма. Так как надо найти максимальное число N, то можно задать пустой массив (1 строка), в который можно добавить все подходящие N (строка10), а затем функцией max() выбрать наибольшее из н их. Проверка кратности 5 и срезы последних цифр должны быть уже понятны.
Задание 3: ЕГЭ Зад. 5
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
a) если число чётное, то в конец числа (справа) дописывается 00, в противном случае дописывается 10;
b) если в полученном числе количество единиц чётное, то справа дописывается 0, в противном случае дописывается 1.
Полученная таким образом запись (в ней на три разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R. Укажите количество чисел R, которые принадлежат диапазону [130; 350] и могут являться результатом работы алгоритма.
Решение: рассмотрим особенности данного задания, где появляется интервал принадлежности для результата R. В Python мы уже рассматривали варианты принадлежности строкам и массивам отдельных элементов в виде: x in mas1 или ‘11’ in str1. В данном задании рассматривается принадлежность диапазону range десятичного значения R. В Python можно использовать при помощи in range (начало, конец) проверку принадлежности числовому отрезку. Поскольку надо найти количество R, то в 1 строке задаём нулевое значение для счётчика, который обновляем в строке 13. Можно принадлежность отрезку проверить и обычными операциями сравнения ><=; но короткая форма всегда лучше длинной.
Задание 4: ЕГЭ Зад. 5
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
a) если количество значащих цифр в двоичной записи числа чётное, то к этой записи в середину дописывается 1;
b) если количество значащих цифр в двоичной записи числа нечётное, то запись не изменяется.
Полученная таким образом запись является двоичной записью искомого числа R. Укажите такое минимальное число N, после обработки которого с помощью этого алгоритма получается число R, не меньшее, чем 26. В ответе запишите это число в 10-ичной системе счисления.
Решение: очень оригинальная задача и довольно простая, но почему то вызывает трудности в написании кода. Рассмотрим её особенности. Все строки должны быть понятны, рассмотрим лишь 3-5. Если требуется найти середину, значит строка должна содержать чётное число символов. Функцию len() мы уже рассматривали ранее на других уроках и для проверки кол-ва элементов можем ею воспользоваться для проверки делимости длины на две равные части (строка 3). Если длина отрезка делится на 2, то середина отрезка будет равна частному от деления отрезка на 2, причём нам надо использовать целочисленное деление, так как индекс не может быть вещественным (строка 4). В пятой строке, зная значение индекса середины (k), мы можем для разбиения отрезка воспользоваться срезами, и сложить обе части, добавив между ними символ 1 по условию задания. Вот такое простое решение, которое благодаря срезам значительно упрощает алгоритм.
Вообще Python уникален своими возможностями обработки строк, поэтому все сложности алгоритмов часто выруливают благодаря строковым преобразованиям и операциям над ними.
Задание 5: ЕГЭ Зад. 5
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. Каждый разряд этой записи заменяется двумя разрядами по следующему правилу: если в разряде стоит 0, то вместо него пишется 00; если в разряде стоит 1, то 1 заменяется на 11.
Полученная таким образом запись (в ней в два раза больше разрядов, чем в записи исходного числа N) является двоичной записью числа R – результата работы данного алгоритма. Укажите минимальное число R, большее 32, которое может являться результатом работы данного алгоритма. В ответе запишите это число в 10-ичной системе счисления.
Решение: практически всё должно быть уже понятно в коде, рассмотрим лишь особенность задания. Здесь упрощает подачу алгоритма также уже знакомый по предыдущим урокам метод замены элементов строки replace(old, new) (строка 3); параметры метода всегда строковые значения
Задание 6: ЕГЭ Зад. 5
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится четверичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
a) если число N делится на 4, то к этой записи дописываются две последние четверичные цифры;
b) если число N на 4 не делится, то остаток от деления умножается на 2, переводится в четверичную запись и дописывается в конец числа.
Полученная таким образом запись является четверичной записью искомого числа R.
3. Результат переводится в десятичную систему и выводится на экран.
Укажите максимальное число N, после обработки которого с помощью этого алгоритма, получается число R, меньшее 369.
Решение: данное задание гораздо сложнее, нежели предыдущие; сложность в том, что значения проверяются не в двоичной системе, а в 4-ричной, которой нет в Python для таких преобразований. Поэтому внимательно читаем предыдущий урок по связи n-ых степеней двоек в системах счисления. Т.е. два а двоичных символа могут представить один четверичный по дуаде, поэтому преобразовав попарно все элементы двоичной строки в 10-ичные можно получить 4-ричное представление. Поскольку такое преобразование надо делать для каждого N в цикле for, то воспользуемся ещё одной удобной и очень популярной в Python конструкцией def() – процедурой функции. В чём суть процедуры функции и главное отличие от процедуры подпрограммы?
*** Вот именно сейчас мы с вами переходим к настоящему программированию, главной особенностью которого является принцип универсальности и модульности.
Процедура функции представляет собой отдельный модуль, выполняющий какие-то повторяющиеся действия для главной программы. Вызов модулей осуществляется по имени и параметрам, например, def pr1(x,y). Параметры функции указывают на величины, которые необходимо обработать, чтобы главной программе вернуть результат. Возврат результата осуществляется при помощи оператора return результат.
Процедура функции всегда описывается в программе до главной части программы и использует локальные переменные в отличие от общих (глобальных)
Теперь рассмотрим код с 8 по 14 строки. Это основная программа, в которой мы в цикле for просматриваем варианты N числа и проверяем N на кратность 4. Здесь практически всё понятно за исключением строк 10 и 11, в которых мы вызываем процедуру функцию f(n) для перевода текущего N в 4-ричную систему счисления. При вызове процедуры параметр n указывает на то, что процедуре передается текущее значение n для обработки. Внимательно, n связана с циклом, поэтому параметру в def даём другое имя переменной, например, x (строка 1).
Строки 2-6 представляют алгоритм перевода числа в четверичную систему счисления. 1) сначала переводим число в 2-ичную систему (2 строка); 2) затем проверяем кратность длины строки двум, так как для перевода из 2-ичной в 4-ричную берутся дуады – пары цифр; если нет кратности 2, добавляем в 2-ичную строку 0 слева (3-4 строки); 3) затем при помощи самого мощного механизма Python – генератора массивов, создаём массив, элементами которого будут четверичные значения дуад (пар), полученные при переводе пары в 10-ичные числа функцией int(cтрока,2) (строка 5).
Обратите внимание на параметры диапазона for - range (0, (len(s)-1), 2) , где 2 – третий параметр, указывающий на то, что берётся ЧЕРЕЗ ОДИН (каждый второй) элемент строки i-ый и соседний с ним i+1; 3) результатом работы генератора является массив, преобразуемый в строку при помощи метода join(), с которым мы познакомились на предыдущих уроках (строка 6). Параметром join является массив ss, а результатом строка ss – четверичное число, которое мы возвращаем основной программе через return ss (строка 7).
Ещё раз вернёмся к строкам 10 и 12, здесь мы формируем R через прибавление к четверичной строке, сформированной в def(), её фрагментов. Вот такое решение для четверичных. Конечно, по времени реализации код программы может быть не быстрее ручного варианта решения, но по надёжности гораздо безопаснее.
Для сравнения рассмотрим ручной вариант решения данного задания в следующей II части данного практикума.
Также во второй части практикума рассмотрим ещё ряд оригинальных и усложнённых заданий с ручным решением.
Вот такой объёмный охват для 15 задания ЕГЭ! На этом уроке освоили ещё одну функцию bin() – для преобразования чисел из десятичных в двоичные, научились пользоваться функцией slice() для создания фрагментов строк и массивов по индексным выборкам. В данных практикумах набираем практическую базу по Python и одновременно проверяем свои силы в ЕГЭ.
Не забываем об энергообмене: подписки, лайки, комментарии, донаты помогут нашему каналу быть и вдохновят на новые классные уроки для вас!
До встречи на площадке Дзен!