К содержанию

Подтема 5 из 6

Нумерованный список

Номер слова в списке по алфавиту и слово по номеру — и ответ задачи темы.

Список как счётчик

Вернёмся к задаче темы: слова пронумерованы по алфавиту. Как связан номер со словом?

Полный список слов по алфавиту меняется как счётчик в системе счисления: заменим буквы цифрами по порядку, и номер слова — это значение записи плюс один. Для трёхбуквенных слов из АБВ: А → 0, Б → 1, В → 2, список идёт как 000, 001, 002, 010, … в троичной системе.

Справа меняется последняя буква; когда она доходит до В, следующей становится А, а предпоследняя увеличивается — как в записи 002 → 010. Значение записи на единицу меньше номера.

Если в алфавите m букв, система счисления — с основанием m. Первое слово ААА — это 000 = 0, а его номер — 1.

Номер слова

Номер слова — это сколько слов стоит раньше него, плюс один. Для слова БАВБ из четырёхбуквенного списка АБВ: раньше идут 27 слов на А; слов на Б со второй буквой меньше А нет; слов БАА? и БАБ? — 6; и одно слово БАВА. Это и есть веса разрядов записи 1021₃.

БАВБ как запись 1021₃: веса разрядов 27, 9, 3, 1. Каждое слагаемое — сколько слов стоит раньше из-за одной позиции: 27 + 0 + 6 + 1 = 34, номер 35.

Программа вычисляет номер без перебора: дописывает цифры справа, как при чтении числа.

alphabet = 'АБВ'word = 'БАВБ'base = len(alphabet)value = 0for letter in word:    digit = alphabet.index(letter)    value = value * base + digit print(value + 1)
35

Слово по номеру

Слово по номеру находят обратным ходом: вычесть единицу, перевести в систему счисления делением, заменить цифры буквами. Пятидесятое четырёхбуквенное слово из АБВ: 50 − 1 = 49.

  1. Переводим 49 в систему с основанием 3. Цифры записи появятся справа налево.
  2. 49 = 3 · 16 + 1. Остаток 1 — цифра разряда 3⁰, дальше работаем с частным 16.
  3. 16 = 3 · 5 + 1. Остаток 1 — цифра разряда 3¹, дальше работаем с частным 5.
  4. 5 = 3 · 1 + 2. Остаток 2 — цифра разряда 3², дальше работаем с частным 1.
  5. 1 = 3 · 0 + 1. Остаток 1 — цифра разряда 3³, частное 0 — перевод закончен.
  6. Готово: 49 = 1211₃. Первый найденный остаток стоит справа, последний — слева.

49 = 1211₃ → БВББ. Начальные нули терять нельзя: пятое слово — 4 = 11₃ = 0011₃ → ААББ, ведь нули — это первые буквы алфавита.

alphabet = 'АБВ'length = 4number = 50base = len(alphabet)value = number - 1word = ''for i in range(length):    digit = value % base    word = alphabet[digit] + word    value = value // base print(word)
БВББ

Порядок алфавита

Буквы записывают по алфавиту сами: product идёт в порядке входной строки. В задаче темы буквы перечислены как Т, О, Р, К, А, а по алфавиту это 'АКОРТ': А → 0, К → 1, О → 2, Р → 3, Т → 4. С product('ТОРКА', repeat=5) список начался бы с ТТТТТ, и все номера были бы другими.

Со словами, начинающимися одинаково, удобно работать блоками: слова на А занимают номера 1–625, на К — 626–1250, и так далее.

81 слово из АБВ делится на три блока по 27 по первой букве, блок на Б — на три блока по 9 по второй. Слова на БА занимают номера 28–36.

Номер и счётчик

В нумерованном списке номер и количество подходящих слов — разные переменные: номер растёт на каждом слове полного списка, счётчик — только на подходящих.

Номер даёт enumerate(..., start=1): он приписывает каждому слову его номер, начиная с 1. Условие «нечётный номер» — number % 2 == 1. Вот программа для задачи темы:

from itertools import product count = 0for number, letters in enumerate(    product('АКОРТ', repeat=5), start=1):    word = ''.join(letters)    if (        word[0] != 'А'        and word.count('О') == 2        and 'ОО' not in word        and number % 2 == 1    ):        count += 1print(count)
168

Из 336 подходящих по буквам слов нечётные номера у 168. Это ответ задачи темы.

Первое и последнее

Первое подходящее слово находят с остановкой, последнее — запоминая каждый новый подходящий номер. Посмотри по шагам, как запоминается последний номер в маленьком списке АА, АБ, БА, ББ:

from itertools import product last_number = Nonefor number, letters in enumerate(        product('АБ', repeat=2), start=1):    word = ''.join(letters)    if word.count('А') == 1:        last_number = number print(last_number)
3

Для задачи темы: первое подходящее слово — номер 683 (КАОКО), последнее — номер 3073 (ТТОТО).

from itertools import product first = Nonelast = Nonefor number, letters in enumerate(    product('АКОРТ', repeat=5), start=1):    word = ''.join(letters)    if (        word[0] != 'А'        and word.count('О') == 2        and 'ОО' not in word        and number % 2 == 1    ):        if first is None:            first = (number, word)        last = (number, word)print(*first)print(*last)
683 КАОКО 3073 ТТОТО

None значит «пока не найдено»: первое запоминаем один раз, последнее перезаписываем при каждом подходящем слове.

Полный и новый список

Формула «запись + 1» верна только для полного списка. Если неподходящие слова удалили и оставшиеся пронумеровали заново, новый номер — это счётчик подходящих слов.

Слева полный список двухбуквенных слов из А и Б, справа — только слова с одной А, пронумерованные заново. АБ было вторым, стало первым.

Поэтому при поиске номеров в полном списке нельзя сокращать алфавит: удалённая буква изменит нумерацию.

Итого

  • Номер словабуквы → цифры по алфавиту, номер = запись + 1
  • Слово по номеруномер − 1 в систему счисления, нули не терять
  • Алфавитзаписать буквы по порядку самому
  • Номер и счётчикenumerate(..., start=1) и отдельный count
  • Первое, последнеезапомнить один раз; перезаписывать каждый раз

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Все четырёхбуквенные слова из АБВ записаны по алфавиту с номерами от 1. Какой номер у слова ВАБВ?
ОтветСкрыть ответ
Ответ
60: ВАБВ ↔ 2012₃ = 54 + 0 + 3 + 2 = 59, номер на единицу больше.
Вопрос 2
Какое слово в том же списке стоит под номером 20?
ОтветСкрыть ответ
Ответ
АВАБ: 20 − 1 = 19 = 0201₃, начальный ноль — это буква А.
Вопрос 3
Слова составлены «из букв Т, О, Р, К, А». Какую строку передать в product, чтобы номера шли по алфавиту?
ОтветСкрыть ответ
Ответ
'АКОРТ': product идёт в порядке входной строки, поэтому буквы записывают по алфавиту сами.
Вопрос 4
Спрашивают номер последнего подходящего слова. Почему ответ — не значение счётчика count?
ОтветСкрыть ответ
Ответ
Счётчик растёт только на подходящих словах, а номер — на каждом слове полного списка. Нужен номер.
Вопрос 5
Из списка удалили неподходящие слова и пронумеровали заново. Можно ли найти номер по формуле «запись + 1»?
ОтветСкрыть ответ
Ответ
Нет: формула верна только для полного списка. Новый номер — это счётчик подходящих слов.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Номер слова ВАБВ

Все четырёхбуквенные слова из АБВ записаны по алфавиту с номерами от 1. Какой номер у слова ВАБВ?

Введите число.

Номер слова ГАББА

Все пятибуквенные слова из АБВГ записаны по алфавиту и пронумерованы с 1. Какой номер у слова ГАББА?

Введите число.

Слова разной длины

Коды длины от 1 до 3 из букв А, Б, В записаны так: сначала по алфавиту все однобуквенные, затем двухбуквенные, затем трёхбуквенные. Под каким номером стоит код ВВ?

Введите число.

Слово под номером 20

В том же списке какое слово имеет номер 20?

Введите слово заглавными буквами.

Слово под номером 500

В том же списке какое слово стоит под номером 500?

Введите слово заглавными буквами.

Слово под номером 700

Все 5-буквенные слова, составленные из букв К, О, Т, Ы, записаны в алфавитном порядке и пронумерованы, начиная с 1. Какое слово стоит под номером 700?

Введите слово заглавными буквами.

Первое слово на В

В списке четырёхбуквенных слов из АБВ под каким номером первое слово, начинающееся с В?

Введите число.

Номер слова ТОК

Все трёхбуквенные слова из букв Т, О, К записаны в алфавитном порядке и пронумерованы с 1. Под каким номером стоит слово ТОК?

Введите число.

Номер слова РУДАР

Все 5-буквенные слова, составленные из букв Р, У, Д, А, записаны в алфавитном порядке и пронумерованы, начиная с 1. Под каким номером стоит слово РУДАР?

Введите число.

Первое слово на Й

Все 6-буквенные слова, составленные из букв М, А, Й, записаны в алфавитном порядке и пронумерованы, начиная с 1. Под каким номером стоит первое слово, которое начинается с буквы Й?

Введите число.

Чётные номера с одной А

Все трёхбуквенные слова из АБВГ записаны по алфавиту и пронумерованы с 1. Сколько слов с ровно одной А имеет чётный номер? Повторения разрешены.

Введите число.

Нечётные номера с одной А

В том же списке сколько слов с ровно одной А имеют нечётный номер?

Введите число.

Количество слов с чётными номерами

Все 6-буквенные слова, составленные из букв С, И, Н, Е, Л, записаны в алфавитном порядке и пронумерованы. Определи количество слов с чётными номерами, которые содержат не менее двух букв Е и не содержат двух букв Н, стоящих рядом.

Введите число.

Первое слово без А

Все четырёхбуквенные слова из АБВ записаны по алфавиту и пронумерованы с 1. Под каким номером первое слово, в котором нет буквы А?

Введите число.

Последнее слово с двумя В

В том же списке под каким номером последнее слово с ровно двумя буквами В?

Введите число.

Последнее слово с нечётным номером

Все 5-буквенные слова, составленные из букв К, Р, О, Т, А, записаны в алфавитном порядке и пронумерованы. Под каким номером в списке стоит последнее слово с нечётным номером, которое не начинается с буквы А и содержит ровно две буквы О?

Введите число.

Первое слово с чётным номером

Все 5-буквенные слова, составленные из букв М, Е, Л, К, А, записаны в алфавитном порядке и пронумерованы. Под каким номером стоит первое слово с чётным номером, которое не начинается с букв А или Е и содержит не менее двух букв Л?

Введите число.

Номер в сокращённом списке

Из четырёхбуквенных слов из АБВ оставили только слова без двух одинаковых букв подряд и пронумеровали их заново по алфавиту, начиная с 1. Какой номер получило слово БАБА?

Введите число.