Всем привет! Поехали дальше! Сегодня 9 урок в продолжение к 8 уроку с усложнением заданий по комбинаторике и кодированию – ЕГЭ Зад.8.
На прошлом уроке нырнули в омут с головой в разные фишки и уникальности Python. Кто одолел – молодцы, а кто не совсем, не отчаивайтесь, оставайтесь с нами и победа вам гарантирована.
Скажу, что учить о языке и учить язык – разные вещи! Когда я впервые приехала в Бельгию, то несмотря на мой живой французский, я вообще не могла воспринимать диалект бельгийцев и мне пришлось учить язык во второй раз. Если я французский родной осваивала около трёх лет, то на адаптацию в Бельгии мне было отведено пару месяцев. Я больше всех не ждала быстрого результата, но полная боевая мобилизация и целевая установка сделали своё дело. ЕГЭ в некотором смысле - это как тест на силу: ума, выдержки, концентрации, знаний. Но главное – уверенности в своих силах и желании быть успешным. Кто-то как-то сказал, что если ты победил врага, ты никого не победил, но если ты победил себя, ты победил всех.
Итак, идём дальше побеждать ЕГЭ.
Практикум №5
Задание 1. ЕГЭ 11 класс
· Определите количество чисел, для записи которых в восьмеричной системе счисления требуется ровно 7 цифр, ровно 3 из которых нечётные и никакие две нечётные цифры не стоят рядом.
· Решение: стартовые пояснения по первым четырём строкам программы пропускаю, на предыдущем уроке вся подробика по данному синтаксису ttps://dzen.ru/a/Z3fLc3syb0QH-JwI
4 строка кода исключает незначащий ноль в числе., а вот пятая строка интересней. Смотрим условие. Нам надо выбрать такие числа, которые содержат ровно три нечётных числа и два из них не стоят рядом. Какие нечётные числа для восьмеричного представления у нас есть всего? Это 3,5,7,1. Нам надо любые три из них. Мы могли бы пойти тем же путём, что и во втором задании на прошлом уроке, создав генератором массив, который выберет кол-во чисел, имеющихся в массиве нечетных чисел. Но это не поможет нам для выполнения ещё одного условия – рядом не должны стоять два нечётных числа. Когда речь идёт о положении типа рядом: впереди или после, то ищите возможность унификации самой строки, т.е. преобразования до минимума в различиях. Т.е. заменим 3,5,7 на 1, а затем проверим на наличие двух единиц в строке через ‘11’ in s, ведь у нас нет ограничения на определенные нечётные числа в условии задания. Вот такой трюк в принципе упрощает решение и ускоряет его, так как не используются дополнительные for- циклы, являющиеся самыми тяжёлыми для памяти в Python. Поэтому в данном задании используем ещё один новый метод Python - replace, применяемый для обработки строк s.replace(что изменяем, на что изменяем) - s.replace(‘5’,’1’). В данном методе есть ещё один параметр третий, указывающий на кол-во замен; по умолчанию - все, а по указанию на кол-во - в последовательной замене от начала строки, например s.replace(‘5’,’1’,3) указывает на замену всего (с начала строки) трёх символов ‘5’ на символ ‘1’. Вот и всё. 6 строка – единственное, что добавилось нового. Остальное в контексте не составляет никакой сложности. Метод count() нам уже знаком по предыдущему уроку, а логическое in и not in тоже понятны в применении (принадлежит –in; не принадлежит – not in, не in not).
Задание 2. ЕГЭ 11 класс
· Определите количество 12-ричных шестизначных чисел, в записи которых ровно одна цифра 7 и не более трёх цифр, с числовым значением более 9.
· Решение: задание простое, но очень часто почему-то не решаемо. До темы системы счисления на нашем курсе мы пока чуть-чуть не дошли – рассмотрим подробно на следующих уроках. А пока мы знаем из пройденных восьми уроков, как кодируются в ПК символы, графика и звук; но коротко поясню, что начиная с 11-ричной системы, в обозначениях базовых цифр систем счисления добавляются латинские символы А-10 B-11 C-12 D-13 E-14 F-15. Поэтому в параметрах product - функции (строка 3) прописываем ‘0123456789AB’ , так как по условию надо найти 12-ричные числа. 4 строка кода также уже должна быть понятна, как и 5 строка, где складываем кол-ва A=10>9 и B=11>9 при помощи уже известного вам метода count(). И ещё один синтаксический момент: в 4 строке: левый слеш \ используется в Python для переноса сложного оператора без разрыва цельности его составляющих.
Задание 3. ЕГЭ 11 класс
· Сколько существует 11-значных девятеричных чисел, в записи которых нет цифры 0 и любые две соседние цифры имеют разную чётность и никакая цифра не повторяется более 4 раз.
· Решение: нестандартная задача, поэтому внимательно разбираем нюансы. В предыдущих задачах мы представляли параметры product в виде строки символов, из которой будет формироваться комбинация и длины комбинации. Но в данной задаче покажу ещё одну возможность задания параметров. Вместо repeat можно представить длину комбинации позиционно попеременно через запятые, как элементы массива: c1,с2…., а значения для позиции кода задать в строке с именем позиции: с1=’1357’-позиции, т.е. переменная используется как строка и как позиция искомой комбинации. В условии известно, что цифры попарно не одинаковы по чётности и если их программно перебирать, то никаких ресурсов для обработки такого кода не хватит, поскольку комбинаций будет огроменное кол-во с учетом 11-позиций каждой комбинации. Поэтому упрощаем задачу, формируя позиции и их диапазон значений одновременно. Так как чётность и нечётность чередуются по условию, то представим две строки с чётным и нечётным набором с1 и с2 (строки кода 3 и 4), А затем в 5 строке представим их позиционно, указывая, что каждая позиция может иметь значение одного из четырёх чётных или нечётных чисел.. 6 строка кода должна быть понятна – она формирует из массива комбинаций строку для удобства работы с ней. 7 строка – новая функция all, которую используем в том случае, если для каждого элемента строки (массива) или каждой пары элементов выполняется одинаковое условие или ряд условий. В данном задании необходимо, чтобы ни одна цифра не повторялась более 4 раз, поэтому определяем условие в функции all (условие всегда указывается вначале), а затем в цикле for перебираем все элементы полученной в join строке-комбинации. Чем-то all похожа на генератор, но в генераторе параметры прописываются в квадратных скобках [ ] и условие оформляется в конце. Обратите внимание, что в полученной строке мы проверяем на count каждый элемент, поэтому указываем s[i], а не s, а в for задаём диапазон i по количеству чисел в строке, т..е. по длине строки - len(s). При таком диапазоне обязательно указываем скобки для len - range (len(s)) Вот и всё решение. Но в print мы выводим k*2 почему? Потому что можно комбинировать, начиная с нечётных с1,с2,с1,с2…или чётных с2,с1,с2,1 и т.д., чисел; но результат при этом будет одинаковым, так как те же наборы чисел, но в другой последовательности будут повторяться. Внимательно!
· Применяется all функция всегда в составе условного оператора if по умолчанию со значением истина для всех.
if all(s.count(s[i]) < 5 for i in range (len(s))), т.е. выражение в скобках должно быть истинно.
И ещё одну задачу рассмотрим с применением функции all для нескольких переменных.
Задание 4. ЕГЭ 11 класс
· Сколько существует восьмеричных пятизначных чисел, не содержащих в своей записи цифру 1, в которых все цифры различны и никакие две чётные или две нечётные цифры не стоят рядом.
· Решение: первые четыре строки уже должны быть понятны, а вот в 5 строке разбираемся по порядку. Нам необходимо найти комбинации чисел, в которых все цифры различны. Можно, конечно, было бы написать в коде проверку методом count по каждой цифре, Но а если у нас буде 20-ричное число, то это нерационально и с точки зрения программирования, неграмотно. Поэтому используем ещё один новый тип данных (мы уже знаем немного о строках и массивах), который называется множество set(). Что мы знаем о множестве из математики младших классов? Что они включают уникальные элементы одного типа или свойства. Так вот, мы можем из исходной строки, полученной в join, создать множество. Для этого используем в параметрах set название строки s - set(s). И затем надо проверить количество элементов, полученных в множестве. Если их будет пять, а по условию комбинации имеют пять позиций , то все цифры уникальны, т.е. не повторяются. А если их будет меньше, например, 3, то значит одна или более цифр повторяются в строке комбинации .Например: v1=‘33679’ set(v1)=4 или v2=’45777’ set(v2)=3 или v3=’66779’ set(v3)=3
· Уникальность проверили, теперь идём дальше. Что ещё нам дано в условии для выбора? Цифры в строке комбинации не должны попарно иметь одинаковую чётность, т.е. не допустимо, например 33567 или 12276 и т.д.
Т.е. в полученной в join строке нужно проверить все возможные пары на выполнение условия для них. Для этого мы применяем нам уже известную функцию all (для всех истинно). Но в этом примере, в отличие от предыдущего нам надо взять не по одному элементу строки, а по паре. Для этого мы должны использовать в индексах i и i+1, т.е. s[i] и s[i+1]. Как проверить чётность мы уже знаем, а кто не знает, запомните, что чётные числа имеют при делении на 2 остаток 0, а нечётные 1. Т.о., мы можем проверить пары на одинаковую четность. Поскольку all выполняет условие истинно, то нам для истины нужно иметь разные чётности, значит при делении на 2 значения не должны быть равны в условии all функции. Внимание! Мы получаем в join строки цифр как символов, а не числа, поэтому нам нужно перевести их в числа. Для этого числовой формат целых чисел определяется функцией int(), а для дробных (вещественных) float(), строковый формат задаётся str(); в скобках задаём строку или число соответственно. Все типы данных в Python подробно будем разбирать на дальнейших уроках нашего курса на канале.
· В нашем случае для остаточного деления % нам надо каждый символ строки перевести в число, поэтому используем int(элемента строки-s[i]), а затем в цикле for задаём повтор данного условия для всех пар поочерёдно.
· Внимание! В диапазоне цикла при попарном и более сравнении надо помнить о выходе за границы индексации. Последний элемент для сравнения должен быть предпоследним в строке - range (len(s)-1).
Вот такое решение с использованием all оператора, типов данных set() –множество и int() –целых чисел.
На следующем практикуме №6 добавим немного сложно понимаемой комбинаторики и подведём наши первые теоретические итоги по Python.
Ну и конечно, не забываем о домашнем задании для проверки себя в Python. Определите количество шестизначных чисел в девятеричной системе счисления, в записи которых ровно одна цифра 4 и ровно две нечётные цифры. (ответ: 53760)
Рада всем, кто с нами покоряет информатику и постигает кибермир!
Не забываем об энергообмене, подписках, лайках, донатах для развития нашего канала и вашего успеха в познании. До встречи на следующем уроке!
Для тех, кто хочет знать всё НА 100, добро пожаловать к IT-KLASS, https://vk.com/sev_informatika