Из заданных букв составили все слова — сколько из них подходит
и под каким номером нужное стоит в списке.
Всё задание — один перебор и пара строк условий.
Базовый уровень, один балл. Ответ — одно целое число.
Все пятибуквенные слова из букв А, К, Ц, Е, Н, Т записаны в алфавитном порядке и пронумерованы:
1. ААААА 2. ААААЕ 3. ААААК
4. ААААН 5. ААААТ 6. ААААЦ …
Под каким номером стоит первое слово с чётным номером, которое не начинается с букв А, Е или К и содержит хотя бы одну букву Т?
Набор букв, длина слова и условия. Слов 65 = 7776 — руками не перебрать, машине — доля секунды.
Не в условиях, а в порядке букв и в номере: буквы в условии идут вразнобой, а список — по алфавиту.
Вторая половина задач — про числа: «сколько семеричных пятизначных чисел…». Это те же слова, только из цифр.
| Сколько чисел | условие на состав цифр: ровно две чётные, не более двух цифр 7, не оканчиваются на 2 или 6 |
|---|---|
| Сколько чисел | условие на соседей: нет одинаковых подряд, нечётная не стоит рядом с нулём |
| Сколько слов | кодовые слова: не начинается с гласной, не оканчивается согласной |
| Номер первого | первое подходящее слово в алфавитном списке, часто — с чётным номером |
| Номер последнего | последнее подходящее, часто — с нечётным номером |
| Сколько в списке | сколько подходящих слов с нечётными номерами |
Замер по 14 задачам экзаменов 2024–2027: числа — 7, список — 6, кодовые слова — 1. Шесть форм — шесть задач практикума.
from itertools import *
for w in product('АБ', repeat=3):
w = ''.join(w)
print(w)
product даёт кортеж букв ('А', 'Б', 'А'),
''.join склеивает его в строку 'АБА'.
ААА
ААБ
АБА
АББ
БАА
БАБ
ББА
БББ
Последняя буква меняется быстрее всех — как в словаре. Номер слова — просто счётчик.
1. ААААА
2. ААААК # а в условии ААААЕ
3. ААААЦ
Порядок другой — и все номера другие. Ответ выйдет 2598 вместо 3914.
1. ААААА
2. ААААЕ
3. ААААК
Совпало с началом списка в условии. Сверяй всегда: условие само показывает первые строки.
n = 0
for w in product('АЕКНТЦ', repeat=5):
w = ''.join(w)
n += 1 # ДО проверки
if ...:
n += 1 стоит до проверки: у первого слова
номер 1, как в списке;n % 2 == 0, «с нечётным» —
n % 2 == 1;Буквы А, К, Ц, Е, Н, Т, слова из 5 букв, алфавитный список.
Первое слово с чётным номером, которое не начинается с А, Е или К и содержит хотя бы одну Т.
repeat=5n += 1 на каждом словеprint(n) и сразу
breakЭто слово НААТЕ. Без чётности вышло бы 3893 (НАААТ) — условие на номер решает.
Все пятибуквенные слова из букв А, К, Ц, Е, Н, Т записаны в алфавитном порядке и пронумерованы.
Под каким номером стоит первое слово с чётным номером, которое не начинается с букв А, Е или К и содержит хотя бы одну букву Т?
from itertools import *
n = 0 # номер слова в списке
for w in product('АЕКНТЦ', repeat=5): # буквы ПО АЛФАВИТУ
w = ''.join(w)
n += 1
if (n % 2 == 0 and # номер чётный
w[0] not in 'АЕК' and # не начинается с А, Е, К
w.count('Т') >= 1): # хотя бы одна Т
print(n) # первое — и сразу стоп
break
3914
Длинное условие удобно разбить по строкам в скобках — по условию на строку, с комментарием.
if ...:
print(n)
break
Нашли — печатаем и выходим.
if ...:
last = n
print(last)
Запоминаем каждое, в конце в last — последнее.
if ...:
k += 1
print(k)
Считаем. k = 0 до цикла.
В демоверсии «последнее» вместо «первого» дало бы 7770 — перепутать концы программы стоит балла.
Сколько существует восьмеричных пятизначных чисел, которые не начинаются с нечётной цифры и содержат ровно две цифры 7?
k = 0
for w in product('01234567', repeat=5):
w = ''.join(w)
if (w[0] != '0' and # без нуля впереди
w[0] not in '1357' and
w.count('7') == 2):
k += 1
print(k)
882
'00717' — не пятизначное число. У 15-ричной цифры —
'0123456789ABCDE'.
Сколько шестеричных пятизначных чисел, в записи которых ровно одна цифра 0, при этом никакая нечётная цифра не стоит рядом с нулём?
ok = True
for i in range(len(w) - 1):
a, b = w[i], w[i + 1]
if ((a == '0' and b in '135') or
(b == '0' and a in '135')):
ok = False
if w[0] != '0' and w.count('0') == 1 and ok:
k += 1
550
Тот же флаг ok, что в задании 1: одна плохая
пара — и число выбывает. Нет двух Ц рядом — короче:
'ЦЦ' not in w.
Все нечётные цифры заменяем одной — '1'. Тогда «нечётная
рядом с нулём» — это просто кусок '01' или
'10' в строке.
s = w # копия: w ещё нужен
for c in '135':
s = s.replace(c, '1')
if (w[0] != '0' and
w.count('0') == 1 and
s.count('01') == 0 and
s.count('10') == 0):
k += 1
550
| w | s | |
|---|---|---|
24053 | 24011 | есть '01' — мимо |
30422 | 10422 | есть '10' — мимо |
34022 | 14022 | подходит |
После замены в s не видно, какие были цифры. Поэтому
w[0] и w.count('0') проверяем по
исходной строке w.
Ответ тот же, 550. Оба способа верны — выбирай, какой понятнее.
Шестибуквенные слова из букв Л, И, С, Т, О, К по алфавиту. Номер первого слова с нечётным номером, которое начинается с С и в котором каждая буква встречается ровно один раз?
set(w) склеивает повторы:
set('СИКОТЛ') — 6 букв, set('СИКОТС') — 5.set: флаг ok и
w.count(c) == 1 для каждой c in w.product, а не перестановки.product('ИКЛОСТ', repeat=6) — все слова из 6 букв:
66 = 46 656. Буквы в слове могут повторяться:
ИИИИИИ, ИИИИИК, СИКОТС…
permutations('ИКЛОСТ') — только перестановки: слова,
где каждая из шести букв стоит ровно один раз, ни одна буква
в слове не повторяется: ИКЛОСТ, ИКЛОТС, ИКЛСОТ… Таких
6! = 720.
Слово СИКЛОТ в полном списке из условия стоит под номером
31 416, а у permutations — под номером
481: перед ним нет слов с повторами. Даже чётность
номера другая.
Перебираем весь список и оставляем слова без повторов условием
len(set(w)) == len(w) — как на прошлом слайде.
Сколько существует шестибуквенных слов из букв Л, И, С, Т, О, К, которые начинаются с С и в которых каждая буква встречается ровно один раз?
Номера в вопросе нет — нужно только количество.
В вопросе есть номер (первое, последнее, чётный номер) —
только product. Номера нет, спрашивают «сколько», и
буквы не повторяются — годится и permutations.
k = 0
for w in permutations('ИКЛОСТ'):
w = ''.join(w)
if w[0] == 'С':
k += 1
print(k)
120
permutations выдаёт каждое слово без повторов ровно
один раз — их можно просто посчитать. product с
условием len(set(w)) == len(w) даст те же 120.
Сколько шестибуквенных слов из букв Л, И, С, Т, О, К начинаются с С, и каждая буква в слове встречается ровно один раз?
k = 0
for w in product('ИКЛОСТ', repeat=6):
w = ''.join(w)
if w[0] == 'С' and len(set(w)) == len(w):
k += 1
print(k)
120k = 0
for w in permutations('ИКЛОСТ'):
w = ''.join(w)
if w[0] == 'С':
k += 1
print(k)
120| product | permutations | |
|---|---|---|
| сколько слов перебирает | 66 = 46 656 | 6! = 720 |
| условие «буквы не повторяются» | пишем сами: len(set(w)) == len(w) | не нужно — повторов там нет |
номер слова n | как в списке из условия | свой, с условием не совпадает |
| В условии | В программе |
|---|---|
| ровно две буквы Т · не более одной С | w.count('Т') == 2 · w.count('С') <= 1 |
| не начинается с букв А, Е или К | w[0] not in 'АЕК' |
| оканчивается цифрами 2 или 6 | w[-1] in '26' |
| ни одной из букв В, Е, К | 'В' not in w and 'Е' not in w and 'К' not in w |
| ровно две чётные цифры | счётчик even в цикле по w |
| каждая буква ровно один раз | len(set(w)) == len(w) |
| кодовое слово не начинается с гласной | w[0] not in 'АЕ' — гласные из этого набора |
n += 1 до проверки.w[0] != '0' у любых «N-значных чисел».n % 2 — номер, а не буква.break против last = n.Страница практикума узнаёт эти ошибки по ответу и подсказывает, какая из них случилась.
Шесть задач — по одной на каждую форму вопроса, все на экране сразу, порядок свой. Ошибся — появится разбор и программа, которая решает именно эту задачу, а кнопка «Новые числа» даст такую же с другими буквами.
| Числа | состав цифр · соседние цифры |
|---|---|
| Слова | кодовые слова · номер первого · номер последнего · сколько в списке |
Отметка практикума: шесть задач — «5», пять — «4», четыре — «3».
Те же шесть форм вопроса, по одной задаче на каждую. Тип закрывается одним верным ответом; ошибся — придёт такая же задача с другими буквами.
От четырёх закрытых типов появится код работы вида
SL-XXXX-XXXX и кнопка «Сдать работу».
Вторая кнопка открывает письмо: к коду прикладываются снимки своих программ и того, что они напечатали.
Число можно получить и не написав программу. Снимок кода показывает, что приём ваш, — поэтому он и просится вместе с ответом.
Отметка: шесть типов — «5», пять — «4», четыре — «3». В начале следующей пары — проверочная из пяти задач.