egekit-study 1.2.0__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {egekit_study-1.2.0 → egekit_study-1.2.2}/GUIDE.html +11 -5
  2. {egekit_study-1.2.0 → egekit_study-1.2.2}/GUIDE.md +10 -4
  3. {egekit_study-1.2.0 → egekit_study-1.2.2}/PKG-INFO +23 -3
  4. {egekit_study-1.2.0 → egekit_study-1.2.2}/README.md +22 -2
  5. {egekit_study-1.2.0 → egekit_study-1.2.2}/RUSSIAN_NAMES.md +1 -1
  6. {egekit_study-1.2.0 → egekit_study-1.2.2}/VALIDATION.md +15 -2
  7. {egekit_study-1.2.0 → egekit_study-1.2.2}/build_docs.py +4 -3
  8. {egekit_study-1.2.0 → egekit_study-1.2.2}/egekit.py +64 -9
  9. {egekit_study-1.2.0 → egekit_study-1.2.2}/egekit_study.egg-info/PKG-INFO +23 -3
  10. {egekit_study-1.2.0 → egekit_study-1.2.2}/examples_man.py +2 -0
  11. {egekit_study-1.2.0 → egekit_study-1.2.2}/pyproject.toml +1 -1
  12. {egekit_study-1.2.0 → egekit_study-1.2.2}/tests/test_manual.py +27 -2
  13. {egekit_study-1.2.0 → egekit_study-1.2.2}/LICENSE +0 -0
  14. {egekit_study-1.2.0 → egekit_study-1.2.2}/MANIFEST.in +0 -0
  15. {egekit_study-1.2.0 → egekit_study-1.2.2}/egekit_study.egg-info/SOURCES.txt +0 -0
  16. {egekit_study-1.2.0 → egekit_study-1.2.2}/egekit_study.egg-info/dependency_links.txt +0 -0
  17. {egekit_study-1.2.0 → egekit_study-1.2.2}/egekit_study.egg-info/top_level.txt +0 -0
  18. {egekit_study-1.2.0 → egekit_study-1.2.2}/examples.py +0 -0
  19. {egekit_study-1.2.0 → egekit_study-1.2.2}/examples_ru.py +0 -0
  20. {egekit_study-1.2.0 → egekit_study-1.2.2}/setup.cfg +0 -0
  21. {egekit_study-1.2.0 → egekit_study-1.2.2}/tests/test_egekit.py +0 -0
  22. {egekit_study-1.2.0 → egekit_study-1.2.2}/tests/test_russian_names.py +0 -0
  23. {egekit_study-1.2.0 → egekit_study-1.2.2}/verify_official.py +0 -0
  24. {egekit_study-1.2.0 → egekit_study-1.2.2}//320/265/320/263/321/215.py" +0 -0
@@ -4,13 +4,14 @@
4
4
  :root{color-scheme:light;--ink:#172a3a;--blue:#075c80;--line:#dbe5ea;--pale:#edf5f8}
5
5
  *{box-sizing:border-box}body{margin:0;background:#f5f7f9;color:var(--ink);font:16px/1.65 system-ui,sans-serif}header{background:#122d40;color:white;padding:48px max(24px,calc((100vw - 1100px)/2))}header p{max-width:870px;color:#d4e7ef}h1{font-size:clamp(30px,5vw,48px);line-height:1.15;margin:8px 0 24px}h2{font-size:26px;margin:44px 0 18px}h3{margin:0;color:var(--blue);font-size:21px;overflow-wrap:anywhere}.eyebrow{letter-spacing:2px;font-size:12px;text-transform:uppercase}.wrap{max-width:1150px;margin:auto;padding:0 24px 64px}a{color:var(--blue)}header a{color:#bfe5f8}.intro,article{background:white;border:1px solid var(--line);padding:24px;border-radius:12px;margin:14px 0}pre{white-space:pre-wrap;overflow-wrap:anywhere;background:#eef3f6;border-radius:8px;padding:16px;font-size:14px;line-height:1.6}code{font-family:ui-monospace,Consolas,monospace}table{width:100%;border-collapse:collapse;font-size:14px}th,td{text-align:left;border-bottom:1px solid var(--line);padding:12px;vertical-align:top}th{background:var(--pale)}.tablewrap{overflow-x:auto}td:first-child{font-weight:bold;min-width:40px}td code{overflow-wrap:anywhere}.controls{position:sticky;top:0;background:#f5f7f9f2;border-bottom:1px solid var(--line);padding:18px 0;z-index:1;display:flex;flex-wrap:wrap;gap:12px;align-items:end}.control{display:flex;flex-direction:column;font-size:13px;font-weight:600}.search{flex:1;min-width:220px}input,select{font:inherit;background:white;border:1px solid #9cb5c3;border-radius:6px;padding:10px;color:var(--ink);max-width:100%}input:focus,select:focus{outline:3px solid #a0d9ee}.tags{font-size:13px;color:#49687b;margin:6px 0 14px}.example{border-left:3px solid #1c8cad;padding-left:14px}li{margin:12px 0}.muted{color:#587081;font-size:14px}article[hidden]{display:none}.count{min-width:120px;font-size:13px;align-self:center}details{background:white;border:1px solid var(--line);padding:18px;border-radius:10px}summary{cursor:pointer;font-weight:600}@media print{.controls{display:none}body{background:white}header{padding:20px;color:#172a3a;background:white}header p{color:#172a3a}article{break-inside:avoid}details>*{display:block}}@media(max-width:600px){.wrap{padding:0 14px 40px}header{padding:30px 20px}article{padding:16px}td,th{padding:8px}}
6
6
  </style>
7
- <header><div class="eyebrow">Python 3.10+ · версия 1.2.0 · без зависимостей</div><h1>EGEKit<br>112 функций для подготовки к ЕГЭ</h1><p>Учебная библиотека Python 3.10+ без внешних зависимостей. 112 функций для тем всех 27 номеров. Это инструменты и шаблоны: условие, диапазон и критерий проверки переносите из конкретной задачи. Автоматического решения любой формулировки и гарантии всех будущих подтипов здесь нет. Все функции доступны под понятными русскими именами; английские варианты также работают.</p><a href="#catalog">Перейти к справочнику ↓</a></header>
7
+ <header><div class="eyebrow">Python 3.10+ · версия 1.2.2 · без зависимостей</div><h1>EGEKit<br>112 функций для подготовки к ЕГЭ</h1><p>Учебная библиотека Python 3.10+ без внешних зависимостей. 112 функций для тем всех 27 номеров. Это инструменты и шаблоны: условие, диапазон и критерий проверки переносите из конкретной задачи. Автоматического решения любой формулировки и гарантии всех будущих подтипов здесь нет. Все функции доступны под понятными русскими именами; английские варианты также работают.</p><a href="#catalog">Перейти к справочнику ↓</a></header>
8
8
  <main class="wrap"><section class="intro"><h2 style="margin-top:0">Начало работы</h2><p>Положите <code>egekit.py</code> и <code>егэ.py</code> рядом со своим <code>solution.py</code> либо установите пакет egekit-study версии 1.2.0 и новее. Установка не нужна. Запустите <code>python solution.py</code> в терминале этой папки. Полная инструкция — в README.md.</p><pre><code>from егэ import *
9
9
 
10
10
  print(делители(120))
11
11
  print(перевести_в_систему(125, 3))
12
12
  man(делители) # Назначение, параметры и пример
13
13
  man(17) # Функции для задания 17
14
+ man(по_заданиям=False) # При необходимости — алфавитный список
14
15
  man(поиск=&#x27;простые&#x27;) # Поиск в справочнике
15
16
  </code></pre><p>Примеры по всем номерам: <code>python examples_ru.py</code>. Отдельный номер: <code>python examples_ru.py --year 2027 23</code>.</p></section>
16
17
  <h2>Номера и основные функции</h2><p>Базовая нумерация — 2026. В правом столбце тем указаны изменения проекта ФИПИ 2027.</p><div class="tablewrap"><table><thead><tr><th>№</th><th>Тема 2026</th><th>Проект 2027</th><th>С чего начать</th></tr></thead><tbody><tr><td>1</td><td>Графы и соответствие вершин</td><td>—</td><td><code>сопоставить_вершины_графов, кратчайшие_расстояния</code></td></tr><tr><td>2</td><td>Логика и таблицы истинности</td><td>—</td><td><code>таблица_истинности, определить_столбцы_таблицы, следование</code></td></tr><tr><td>3</td><td>Таблицы и базы данных</td><td>—</td><td><code>прочитать_xlsx, прочитать_ods, соединить_таблицы, сгруппировать_и_вычислить, запрос_к_базе</code></td></tr><tr><td>4</td><td>Коды и условие Фано</td><td>—</td><td><code>проверка_условия_Фано, допустимые_кодовые_слова, коды_Хаффмана, длина_кодированного_сообщения</code></td></tr><tr><td>5</td><td>Алгоритмы преобразования чисел</td><td>—</td><td><code>преобразовать_двоичную_запись, перевести_в_систему, найти_значения</code></td></tr><tr><td>6</td><td>Черепаха и геометрия</td><td>—</td><td><code>вершины_черепахи, внутренние_точки_по_Пику, целые_точки_в_фигурах</code></td></tr><tr><td>7</td><td>Изображения, звук и передача данных</td><td>—</td><td><code>объём_изображения_в_битах, объём_звука_в_битах, время_передачи</code></td></tr><tr><td>8</td><td>Комбинаторика и порядок слов</td><td>—</td><td><code>количество_слов, номер_слова, слово_по_номеру, различные_перестановки</code></td></tr><tr><td>9</td><td>Обработка строк таблицы</td><td>—</td><td><code>характеристики_строки, отобрать_строки</code></td></tr><tr><td>10</td><td>Поиск в текстовом документе</td><td>IPv4 и маски сетей</td><td><code>текст_из_docx, количество_вхождений</code></td></tr><tr><td>11</td><td>Объём хранения идентификаторов</td><td>—</td><td><code>бит_на_символ, объём_хранения_в_байтах</code></td></tr><tr><td>12</td><td>Редактор и машина Тьюринга</td><td>—</td><td><code>редактор_строк, машина_Тьюринга</code></td></tr><tr><td>13</td><td>IPv4 и маски сетей</td><td>Исполнители и количество программ</td><td><code>сведения_о_сети, количество_ip_по_условию, распределение_ip_по_единицам</code></td></tr><tr><td>14</td><td>Системы счисления</td><td>—</td><td><code>перевести_в_систему, перевести_из_системы, цифры_числа</code></td></tr><tr><td>15</td><td>Логические условия и параметры</td><td>—</td><td><code>следование, допустимые_параметры, принадлежит_интервалу</code></td></tr><tr><td>16</td><td>Рекурсия и рекуррентные формулы</td><td>—</td><td><code>вычислить_рекуррентную_функцию, рекурсивная_функция</code></td></tr><tr><td>17</td><td>Последовательности, пары и тройки</td><td>—</td><td><code>прочитать_числа, соседние_группы, статистика_соседних_групп</code></td></tr><tr><td>18</td><td>Робот и пути по таблице</td><td>—</td><td><code>суммы_путей_робота</code></td></tr><tr><td>19</td><td>Игры: первый ход</td><td>—</td><td><code>анализатор_игры</code></td></tr><tr><td>20</td><td>Игры: стратегия победы</td><td>—</td><td><code>анализатор_игры</code></td></tr><tr><td>21</td><td>Игры: неизбежное поражение</td><td>—</td><td><code>анализатор_игры</code></td></tr><tr><td>22</td><td>Параллельные процессы и зависимости</td><td>—</td><td><code>процессы_из_таблицы, расписание_процессов, активные_процессы, максимум_одновременных_интервалов</code></td></tr><tr><td>23</td><td>Исполнители и количество программ</td><td>Пути в ориентированном графе</td><td><code>количество_программ, количество_программ_через_точки</code></td></tr><tr><td>24</td><td>Строки, подстроки и выражения</td><td>—</td><td><code>подстрока_не_более, подстрока_ровно, подстрока_не_менее, найти_по_регулярному_выражению</code></td></tr><tr><td>25</td><td>Делители, простые числа и маски</td><td>—</td><td><code>делители, разложить_на_простые, решето_простых, кратные_по_маске</code></td></tr><tr><td>26</td><td>Сортировка, выбор и моделирование</td><td>—</td><td><code>выбрать_файлы_для_архива, выбрать_непересекающиеся_интервалы, вложенные_коробки, свободные_места, очередь_обслуживания, журнал_резервных_копий</code></td></tr><tr><td>27</td><td>Кластеризация и алгоритмы анализа данных</td><td>Анализ данных: точки, признаки и энергия частиц</td><td><code>кластеры_по_расстоянию, центр_по_сумме_расстояний, кластеры_по_размаху_признака, центр_по_медиане_признака; дополнительно — префиксы, остатки, динамика</code></td></tr></tbody></table></div>
@@ -403,19 +404,24 @@ man(поиск=&#x27;простые&#x27;) # Поиск в справ
403
404
  <p class="example"><strong>Пример:</strong> соседние_группы([1,2,3],2,lambda w:sum(w)&gt;3). В отличие от всех пар берёт только соседние элементы.</p></article>
404
405
  <article id="man" data-name="man" data-y26='[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]' data-y27='[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]'>
405
406
  <h3>справка</h3><p class="muted">Английское имя: <code>man</code></p><div class="tags" data-tags></div>
406
- <pre><code>справка(функция=None, *, задание=None, год=2026, поиск=None, листать=False)</code></pre><p>Справочник EGEKit в терминале: назначение, сигнатура, параметры, пример и номера заданий.
407
+ <pre><code>справка(функция=None, *, задание=None, год=2026, поиск=None, листать=False, по_заданиям=True)</code></pre><p>Справочник EGEKit в терминале: назначение, сигнатура, параметры, пример и номера заданий.
407
408
 
408
409
  функция — объект функции либо её русское/английское имя строкой.
409
410
  Без функции выводится список с краткими описаниями. Целое число первым
410
411
  аргументом означает номер задания. задание и год фильтруют список;
411
- поиск ищет текст в именах и описаниях; листать=True открывает системный
412
+ поиск ищет текст в именах и описаниях; по_заданиям=True группирует список
413
+ по номерам 1–27 с названиями тем (режим по умолчанию).
414
+ по_заданиям=False включает алфавитный список. Каждый пункт показывает номера
415
+ заданий для выбранного года; листать=True открывает системный
412
416
  просмотрщик через pydoc.pager (выход обычно клавишей q).
413
417
  По умолчанию справка просто печатается, не требует действий и возвращает None.
414
418
  Ничего не выполняет из переданной строки: имена берутся только из каталога.
415
419
 
416
420
  </p>
417
421
  <p class="example"><strong>Пример:</strong>
418
- справка() # Все функции с описаниями
422
+ справка() # Функции по заданиям от №1 до №27
423
+ справка(по_заданиям=False) # Алфавитный список
424
+ справка(по_заданиям=True) # Группы по заданиям 1–27
419
425
  справка(делители) # Подробная справка о функции
420
426
  справка(&#x27;делители&#x27;) # То же по строковому имени
421
427
  справка(&#x27;делители&#x27;) # Английское имя тоже подходит
@@ -483,7 +489,7 @@ man(поиск=&#x27;простые&#x27;) # Поиск в справ
483
489
  <h3>цифры_числа</h3><p class="muted">Английское имя: <code>base_digits</code></p><div class="tags" data-tags></div>
484
490
  <pre><code>цифры_числа(n, base)</code></pre><p>Цифры неотрицательного числа списком, от старшей к младшей; допускает основания больше 36. </p>
485
491
  <p class="example"><strong>Пример:</strong> цифры_числа(10,3) == [1,0,1].</p></article></div><p id="empty" hidden>Функций с такими условиями не найдено. Попробуйте другое слово или номер.</p>
486
- <h2>Проверки и источники</h2><p>22 автоматических тестовых методов, в том числе сотни случайных сравнений с полным перебором. На файлах демоверсии 2027 совпали официальные ответы №22, №23, №24, №26 и №27. Это проверка конкретных алгоритмов и данных, а не доказательство универсальной применимости.</p><p>ФИПИ: <a href="https://fipi.ru/ege/demoversii-specifikacii-kodifikatory">демоверсии, спецификации, кодификаторы</a>. Проверено 18.10.2026. Изменения 2027 приведены по опубликованному проекту.</p><p class="muted">Исходный код — egekit.py · Полные примеры — examples_ru.py · Текстовая версия — GUIDE.md · Проверки — VALIDATION.md. Страница работает без интернета.</p></main>
492
+ <h2>Проверки и источники</h2><p>24 автоматических тестовых метода, в том числе сотни случайных сравнений с полным перебором. На файлах демоверсии 2027 совпали официальные ответы №22, №23, №24, №26 и №27. Это проверка конкретных алгоритмов и данных, а не доказательство универсальной применимости.</p><p>ФИПИ: <a href="https://fipi.ru/ege/demoversii-specifikacii-kodifikatory">демоверсии, спецификации, кодификаторы</a>. Проверено 18.10.2026. Изменения 2027 приведены по опубликованному проекту.</p><p class="muted">Исходный код — egekit.py · Полные примеры — examples_ru.py · Текстовая версия — GUIDE.md · Проверки — VALIDATION.md. Страница работает без интернета.</p></main>
487
493
  <script>
488
494
  const cards=[...document.querySelectorAll('article')], search=document.querySelector('#search'), year=document.querySelector('#year'), task=document.querySelector('#task');
489
495
  function filter(){let shown=0;const q=search.value.trim().toLocaleLowerCase('ru');for(const card of cards){const tags=JSON.parse(card.dataset['y'+year.value]);card.querySelector('[data-tags]').textContent='Номера '+(year.value==='26'?'2026':'проекта 2027')+': '+(tags.length?tags.join(', '):'историческая функция');const visible=(!q||card.textContent.toLocaleLowerCase('ru').includes(q))&&(!task.value||tags.includes(Number(task.value)));card.hidden=!visible;if(visible)shown++;}document.querySelector('#count').textContent=shown+' из '+cards.length+' функций';document.querySelector('#empty').hidden=shown>0;}
@@ -13,6 +13,7 @@ print(делители(120))
13
13
  print(перевести_в_систему(125, 3))
14
14
  man(делители) # Назначение, параметры и пример
15
15
  man(17) # Функции для задания 17
16
+ man(по_заданиям=False) # При необходимости — алфавитный список
16
17
  man(поиск='простые') # Поиск в справочнике
17
18
 
18
19
  ```
@@ -1224,7 +1225,7 @@ FCFS-очередь к одинаковым серверам. arrivals — (пр
1224
1225
  ### справка
1225
1226
 
1226
1227
  ```python
1227
- справка(функция=None, *, задание=None, год=2026, поиск=None, листать=False)
1228
+ справка(функция=None, *, задание=None, год=2026, поиск=None, листать=False, по_заданиям=True)
1228
1229
  ```
1229
1230
 
1230
1231
  Английское имя: `man`.
@@ -1236,13 +1237,18 @@ FCFS-очередь к одинаковым серверам. arrivals — (пр
1236
1237
  функция — объект функции либо её русское/английское имя строкой.
1237
1238
  Без функции выводится список с краткими описаниями. Целое число первым
1238
1239
  аргументом означает номер задания. задание и год фильтруют список;
1239
- поиск ищет текст в именах и описаниях; листать=True открывает системный
1240
+ поиск ищет текст в именах и описаниях; по_заданиям=True группирует список
1241
+ по номерам 1–27 с названиями тем (режим по умолчанию).
1242
+ по_заданиям=False включает алфавитный список. Каждый пункт показывает номера
1243
+ заданий для выбранного года; листать=True открывает системный
1240
1244
  просмотрщик через pydoc.pager (выход обычно клавишей q).
1241
1245
  По умолчанию справка просто печатается, не требует действий и возвращает None.
1242
1246
  Ничего не выполняет из переданной строки: имена берутся только из каталога.
1243
1247
 
1244
1248
  Пример:
1245
- справка() # Все функции с описаниями
1249
+ справка() # Функции по заданиям от №1 до №27
1250
+ справка(по_заданиям=False) # Алфавитный список
1251
+ справка(по_заданиям=True) # Группы по заданиям 1–27
1246
1252
  справка(делители) # Подробная справка о функции
1247
1253
  справка('делители') # То же по строковому имени
1248
1254
  справка('делители') # Английское имя тоже подходит
@@ -1437,4 +1443,4 @@ FCFS-очередь к одинаковым серверам. arrivals — (пр
1437
1443
 
1438
1444
  Архив проекта 2027: https://doc.fipi.ru/ege/demoversii-specifikacii-kodifikatory/2027/inf_11_2027.zip
1439
1445
 
1440
- 22 автоматических тестовых методов; сотни случайных сравнений с полным перебором. Совпадение официальных ответов №22, 23, 24, 26 и 27 проекта 2027. Подробности в VALIDATION.md.
1446
+ 24 автоматических тестовых метода; сотни случайных сравнений с полным перебором. Совпадение официальных ответов №22, 23, 24, 26 и 27 проекта 2027. Подробности в VALIDATION.md.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: egekit-study
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: Алгоритмические инструменты для подготовки к ЕГЭ по информатике
5
5
  License-Expression: MIT
6
6
  Requires-Python: >=3.10
@@ -10,7 +10,7 @@ Dynamic: license-file
10
10
 
11
11
  # EGEKit — библиотека для подготовки к ЕГЭ по информатике
12
12
 
13
- Версия 1.2.0 · Python 3.10+ · 112 функций · внешние зависимости не нужны.
13
+ Версия 1.2.2 · Python 3.10+ · 112 функций · внешние зависимости не нужны.
14
14
 
15
15
  Библиотека охватывает темы всех 27 номеров: логика, базы данных, кодирование,
16
16
  исполнители, комбинаторика, геометрия, сети, рекурсия, игры, строки,
@@ -181,8 +181,28 @@ python -m unittest discover -s tests -v
181
181
  старых архивов. После публикации пользователи обновляют пакет через
182
182
  `python -m pip install --upgrade ИМЯ_ВАШЕГО_ПАКЕТА`.
183
183
 
184
- Готовые файлы для публикации версии 1.2.0 находятся в папке dist. После
184
+ Готовые файлы для публикации версии 1.2.2 находятся в папке dist. После
185
185
  проверки `python -m twine check dist/*` их можно загрузить командой
186
186
  `python -m twine upload dist/*`. Если меняете код, пересоберите пакет.
187
187
  После публикации обновите установленный пакет:
188
188
  `python -m pip install --upgrade egekit-study`.
189
+
190
+ ## Номера заданий в справке: версия 1.2.2
191
+
192
+ `man()` по умолчанию группирует функции по номерам от №1 до №27 и подписывает у каждой функции номера заданий выбранного года. Для алфавитного списка: `man(по_заданиям=False)`.
193
+ `man(по_заданиям=True)` выводит группы с заголовками «ЗАДАНИЕ №1», «ЗАДАНИЕ
194
+ №2» и так далее. Общие инструменты вынесены в отдельный раздел. Функция,
195
+ подходящая нескольким номерам, появляется в каждой соответствующей группе.
196
+
197
+ ```python
198
+ from егэ import *
199
+ man() # Разделы от задания №1 до №27
200
+ man(по_заданиям=False) # Алфавитный список с номерами
201
+ man(по_заданиям=True) # Группы по заданиям
202
+ man(17) # Только функции для №17
203
+ man(по_заданиям=True, год=2027) # Нумерация проекта 2027
204
+ ```
205
+
206
+ На установленной версии 1.2.0 эти новые параметры ещё не работают.
207
+ Для установки без ожидания обновления индекса PyPI можно установить
208
+ готовый файл dist/egekit_study-1.2.2-py3-none-any.whl из этого архива.
@@ -1,6 +1,6 @@
1
1
  # EGEKit — библиотека для подготовки к ЕГЭ по информатике
2
2
 
3
- Версия 1.2.0 · Python 3.10+ · 112 функций · внешние зависимости не нужны.
3
+ Версия 1.2.2 · Python 3.10+ · 112 функций · внешние зависимости не нужны.
4
4
 
5
5
  Библиотека охватывает темы всех 27 номеров: логика, базы данных, кодирование,
6
6
  исполнители, комбинаторика, геометрия, сети, рекурсия, игры, строки,
@@ -171,8 +171,28 @@ python -m unittest discover -s tests -v
171
171
  старых архивов. После публикации пользователи обновляют пакет через
172
172
  `python -m pip install --upgrade ИМЯ_ВАШЕГО_ПАКЕТА`.
173
173
 
174
- Готовые файлы для публикации версии 1.2.0 находятся в папке dist. После
174
+ Готовые файлы для публикации версии 1.2.2 находятся в папке dist. После
175
175
  проверки `python -m twine check dist/*` их можно загрузить командой
176
176
  `python -m twine upload dist/*`. Если меняете код, пересоберите пакет.
177
177
  После публикации обновите установленный пакет:
178
178
  `python -m pip install --upgrade egekit-study`.
179
+
180
+ ## Номера заданий в справке: версия 1.2.2
181
+
182
+ `man()` по умолчанию группирует функции по номерам от №1 до №27 и подписывает у каждой функции номера заданий выбранного года. Для алфавитного списка: `man(по_заданиям=False)`.
183
+ `man(по_заданиям=True)` выводит группы с заголовками «ЗАДАНИЕ №1», «ЗАДАНИЕ
184
+ №2» и так далее. Общие инструменты вынесены в отдельный раздел. Функция,
185
+ подходящая нескольким номерам, появляется в каждой соответствующей группе.
186
+
187
+ ```python
188
+ from егэ import *
189
+ man() # Разделы от задания №1 до №27
190
+ man(по_заданиям=False) # Алфавитный список с номерами
191
+ man(по_заданиям=True) # Группы по заданиям
192
+ man(17) # Только функции для №17
193
+ man(по_заданиям=True, год=2027) # Нумерация проекта 2027
194
+ ```
195
+
196
+ На установленной версии 1.2.0 эти новые параметры ещё не работают.
197
+ Для установки без ожидания обновления индекса PyPI можно установить
198
+ готовый файл dist/egekit_study-1.2.2-py3-none-any.whl из этого архива.
@@ -1,4 +1,4 @@
1
- # Русские названия функций EGEKit 1.2.0
1
+ # Русские названия функций EGEKit 1.2.2
2
2
 
3
3
  112 функций: 111 прежних алгоритмов и встроенная справка man/справка.
4
4
 
@@ -1,11 +1,11 @@
1
- # Проверка EGEKit 1.2.0
1
+ # Проверка EGEKit 1.2.2
2
2
 
3
3
  Дата: 18 октября 2026 года. Среда проверки: Python 3.12.14, Linux.
4
4
  Минимальная заявленная версия Python — 3.10 (отдельный запуск под 3.10 не выполнялся).
5
5
 
6
6
  ## Автоматические проверки
7
7
 
8
- 22 тестовых метода unittest проходят. Внутри них:
8
+ 24 тестовых метода unittest проходят. Внутри них:
9
9
 
10
10
  - 300 случайных наборов: пары с остатком суммы, максимум суммы пары,
11
11
  кратность произведения, суммы и длины подмассивов, выбор из групп,
@@ -90,3 +90,16 @@ wheel установлен в отдельное чистое окружение
90
90
  Проверены `from егэ import *`, русские функции и man в установленном пакете.
91
91
  Автоматическая интерактивная проверка поведения системного pager в Windows
92
92
  не выполнялась; по умолчанию man печатает справку без pager.
93
+
94
+ ## Номера заданий в man, версия 1.2.1
95
+
96
+ Два новых тестовых метода проверяют подписи у функций для обоих годов,
97
+ все 27 групп, отдельный раздел общих инструментов, фильтрацию по номеру,
98
+ поиск и пустую выдачу. Всего 24 тестовых метода проходят.
99
+
100
+ ## Сортировка по умолчанию, версия 1.2.2
101
+
102
+ man() теперь эквивалентен man(по_заданиям=True). Тест проверяет числовой
103
+ порядок заголовков №1–27 и алфавитный порядок альтернативного режима
104
+ man(по_заданиям=False). Все 24 тестовых метода проходят. Алгоритмы задач
105
+ не менялись.
@@ -69,6 +69,7 @@ print(делители(120))
69
69
  print(перевести_в_систему(125, 3))
70
70
  man(делители) # Назначение, параметры и пример
71
71
  man(17) # Функции для задания 17
72
+ man(по_заданиям=False) # При необходимости — алфавитный список
72
73
  man(поиск='простые') # Поиск в справочнике
73
74
  """
74
75
  notes.insert(0, 'Новый модуль: from егэ import *. После импорта используйте функции без префикса. man() показывает список, man(делители) или man("делители") — подробную справку, man(17) — функции задания 17. Синоним man — справка. Для постраничного просмотра: man(листать=True), выход обычно q.')
@@ -105,7 +106,7 @@ for name in sorted(e.CATALOG, key=lambda n:e.РУССКИЕ_ИМЕНА[n]):
105
106
  <p class="example"><strong>Пример:</strong> {html.escape(example)}</p></article>''')
106
107
  md += ['## Источники и проверка','','ФИПИ: https://fipi.ru/ege/demoversii-specifikacii-kodifikatory','',
107
108
  'Архив проекта 2027: https://doc.fipi.ru/ege/demoversii-specifikacii-kodifikatory/2027/inf_11_2027.zip','',
108
- '22 автоматических тестовых методов; сотни случайных сравнений с полным перебором. Совпадение официальных ответов №22, 23, 24, 26 и 27 проекта 2027. Подробности в VALIDATION.md.']
109
+ '24 автоматических тестовых метода; сотни случайных сравнений с полным перебором. Совпадение официальных ответов №22, 23, 24, 26 и 27 проекта 2027. Подробности в VALIDATION.md.']
109
110
  (root/'GUIDE.md').write_text('\n'.join(md)+'\n',encoding='utf-8')
110
111
  rows=''.join(f'<tr><td>{n}</td><td>{html.escape(TOPICS[n])}</td><td>{html.escape(TOPICS27[n] if TOPICS27[n]!=TOPICS[n] else "—")}</td><td><code>{html.escape(ROUTES[n])}</code></td></tr>' for n in TOPICS)
111
112
  page='''<!doctype html><html lang="ru"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
@@ -114,14 +115,14 @@ page='''<!doctype html><html lang="ru"><meta charset="utf-8"><meta name="viewpor
114
115
  :root{color-scheme:light;--ink:#172a3a;--blue:#075c80;--line:#dbe5ea;--pale:#edf5f8}
115
116
  *{box-sizing:border-box}body{margin:0;background:#f5f7f9;color:var(--ink);font:16px/1.65 system-ui,sans-serif}header{background:#122d40;color:white;padding:48px max(24px,calc((100vw - 1100px)/2))}header p{max-width:870px;color:#d4e7ef}h1{font-size:clamp(30px,5vw,48px);line-height:1.15;margin:8px 0 24px}h2{font-size:26px;margin:44px 0 18px}h3{margin:0;color:var(--blue);font-size:21px;overflow-wrap:anywhere}.eyebrow{letter-spacing:2px;font-size:12px;text-transform:uppercase}.wrap{max-width:1150px;margin:auto;padding:0 24px 64px}a{color:var(--blue)}header a{color:#bfe5f8}.intro,article{background:white;border:1px solid var(--line);padding:24px;border-radius:12px;margin:14px 0}pre{white-space:pre-wrap;overflow-wrap:anywhere;background:#eef3f6;border-radius:8px;padding:16px;font-size:14px;line-height:1.6}code{font-family:ui-monospace,Consolas,monospace}table{width:100%;border-collapse:collapse;font-size:14px}th,td{text-align:left;border-bottom:1px solid var(--line);padding:12px;vertical-align:top}th{background:var(--pale)}.tablewrap{overflow-x:auto}td:first-child{font-weight:bold;min-width:40px}td code{overflow-wrap:anywhere}.controls{position:sticky;top:0;background:#f5f7f9f2;border-bottom:1px solid var(--line);padding:18px 0;z-index:1;display:flex;flex-wrap:wrap;gap:12px;align-items:end}.control{display:flex;flex-direction:column;font-size:13px;font-weight:600}.search{flex:1;min-width:220px}input,select{font:inherit;background:white;border:1px solid #9cb5c3;border-radius:6px;padding:10px;color:var(--ink);max-width:100%}input:focus,select:focus{outline:3px solid #a0d9ee}.tags{font-size:13px;color:#49687b;margin:6px 0 14px}.example{border-left:3px solid #1c8cad;padding-left:14px}li{margin:12px 0}.muted{color:#587081;font-size:14px}article[hidden]{display:none}.count{min-width:120px;font-size:13px;align-self:center}details{background:white;border:1px solid var(--line);padding:18px;border-radius:10px}summary{cursor:pointer;font-weight:600}@media print{.controls{display:none}body{background:white}header{padding:20px;color:#172a3a;background:white}header p{color:#172a3a}article{break-inside:avoid}details>*{display:block}}@media(max-width:600px){.wrap{padding:0 14px 40px}header{padding:30px 20px}article{padding:16px}td,th{padding:8px}}
116
117
  </style>
117
- <header><div class="eyebrow">Python 3.10+ · версия 1.2.0 · без зависимостей</div><h1>EGEKit<br>112 функций для подготовки к ЕГЭ</h1><p>INTRO</p><a href="#catalog">Перейти к справочнику ↓</a></header>
118
+ <header><div class="eyebrow">Python 3.10+ · версия 1.2.2 · без зависимостей</div><h1>EGEKit<br>112 функций для подготовки к ЕГЭ</h1><p>INTRO</p><a href="#catalog">Перейти к справочнику ↓</a></header>
118
119
  <main class="wrap"><section class="intro"><h2 style="margin-top:0">Начало работы</h2><p>Положите <code>egekit.py</code> и <code>егэ.py</code> рядом со своим <code>solution.py</code> либо установите пакет egekit-study версии 1.2.0 и новее. Установка не нужна. Запустите <code>python solution.py</code> в терминале этой папки. Полная инструкция — в README.md.</p><pre><code>QUICK</code></pre><p>Примеры по всем номерам: <code>python examples_ru.py</code>. Отдельный номер: <code>python examples_ru.py --year 2027 23</code>.</p></section>
119
120
  <h2>Номера и основные функции</h2><p>Базовая нумерация — 2026. В правом столбце тем указаны изменения проекта ФИПИ 2027.</p><div class="tablewrap"><table><thead><tr><th>№</th><th>Тема 2026</th><th>Проект 2027</th><th>С чего начать</th></tr></thead><tbody>ROWS</tbody></table></div>
120
121
  <h2>Как применять функции</h2><details><summary>Правила, ограничения и частые ошибки</summary><ul>NOTES</ul></details>
121
122
  <h2 id="catalog">Полный справочник</h2><p>У каждой функции: сигнатура, назначение, параметры, пример и ограничения. Фильтр ищет по имени и описанию. Номера показывают также смежные вспомогательные алгоритмы.</p>
122
123
  <div class="controls"><label class="control search">Поиск<input id="search" type="search" placeholder="например: делители, энергия, count_pairs"></label><label class="control">Год<select id="year"><option value="26">2026</option><option value="27">2027 — проект</option></select></label><label class="control">Номер<select id="task"><option value="">Все номера</option>OPTIONS</select></label><div id="count" class="count" aria-live="polite"></div></div>
123
124
  <div id="cards">CARDS</div><p id="empty" hidden>Функций с такими условиями не найдено. Попробуйте другое слово или номер.</p>
124
- <h2>Проверки и источники</h2><p>22 автоматических тестовых методов, в том числе сотни случайных сравнений с полным перебором. На файлах демоверсии 2027 совпали официальные ответы №22, №23, №24, №26 и №27. Это проверка конкретных алгоритмов и данных, а не доказательство универсальной применимости.</p><p>ФИПИ: <a href="https://fipi.ru/ege/demoversii-specifikacii-kodifikatory">демоверсии, спецификации, кодификаторы</a>. Проверено 18.10.2026. Изменения 2027 приведены по опубликованному проекту.</p><p class="muted">Исходный код — egekit.py · Полные примеры — examples_ru.py · Текстовая версия — GUIDE.md · Проверки — VALIDATION.md. Страница работает без интернета.</p></main>
125
+ <h2>Проверки и источники</h2><p>24 автоматических тестовых метода, в том числе сотни случайных сравнений с полным перебором. На файлах демоверсии 2027 совпали официальные ответы №22, №23, №24, №26 и №27. Это проверка конкретных алгоритмов и данных, а не доказательство универсальной применимости.</p><p>ФИПИ: <a href="https://fipi.ru/ege/demoversii-specifikacii-kodifikatory">демоверсии, спецификации, кодификаторы</a>. Проверено 18.10.2026. Изменения 2027 приведены по опубликованному проекту.</p><p class="muted">Исходный код — egekit.py · Полные примеры — examples_ru.py · Текстовая версия — GUIDE.md · Проверки — VALIDATION.md. Страница работает без интернета.</p></main>
125
126
  <script>
126
127
  const cards=[...document.querySelectorAll('article')], search=document.querySelector('#search'), year=document.querySelector('#year'), task=document.querySelector('#task');
127
128
  function filter(){let shown=0;const q=search.value.trim().toLocaleLowerCase('ru');for(const card of cards){const tags=JSON.parse(card.dataset['y'+year.value]);card.querySelector('[data-tags]').textContent='Номера '+(year.value==='26'?'2026':'проекта 2027')+': '+(tags.length?tags.join(', '):'историческая функция');const visible=(!q||card.textContent.toLocaleLowerCase('ru').includes(q))&&(!task.value||tags.includes(Number(task.value)));card.hidden=!visible;if(visible)shown++;}document.querySelector('#count').textContent=shown+' из '+cards.length+' функций';document.querySelector('#empty').hidden=shown>0;}
@@ -17,7 +17,7 @@ import sqlite3
17
17
  import zipfile
18
18
  import xml.etree.ElementTree as ET
19
19
 
20
- __version__ = '1.2.0'
20
+ __version__ = '1.2.2'
21
21
  CATALOG = {}
22
22
 
23
23
  def _task(*numbers):
@@ -1291,19 +1291,24 @@ __all__ = ['CATALOG', 'CATALOG_2027', 'РУССКИЕ_ИМЕНА', '__version__'
1291
1291
 
1292
1292
 
1293
1293
  @_task(*range(1, 28))
1294
- def man(функция=None, *, задание=None, год=2026, поиск=None, листать=False):
1294
+ def man(функция=None, *, задание=None, год=2026, поиск=None, листать=False, по_заданиям=True):
1295
1295
  """Справочник EGEKit в терминале: назначение, сигнатура, параметры, пример и номера заданий.
1296
1296
 
1297
1297
  функция — объект функции либо её русское/английское имя строкой.
1298
1298
  Без функции выводится список с краткими описаниями. Целое число первым
1299
1299
  аргументом означает номер задания. задание и год фильтруют список;
1300
- поиск ищет текст в именах и описаниях; листать=True открывает системный
1300
+ поиск ищет текст в именах и описаниях; по_заданиям=True группирует список
1301
+ по номерам 1–27 с названиями тем (режим по умолчанию).
1302
+ по_заданиям=False включает алфавитный список. Каждый пункт показывает номера
1303
+ заданий для выбранного года; листать=True открывает системный
1301
1304
  просмотрщик через pydoc.pager (выход обычно клавишей q).
1302
1305
  По умолчанию справка просто печатается, не требует действий и возвращает None.
1303
1306
  Ничего не выполняет из переданной строки: имена берутся только из каталога.
1304
1307
 
1305
1308
  Пример:
1306
- man() # Все функции с описаниями
1309
+ man() # Функции по заданиям от №1 до №27
1310
+ man(по_заданиям=False) # Алфавитный список
1311
+ man(по_заданиям=True) # Группы по заданиям 1–27
1307
1312
  man(делители) # Подробная справка о функции
1308
1313
  man('делители') # То же по строковому имени
1309
1314
  man('divisors') # Английское имя тоже подходит
@@ -1381,15 +1386,65 @@ def man(функция=None, *, задание=None, год=2026, поиск=Non
1381
1386
  query = поиск.casefold()
1382
1387
  candidates = [name for name in candidates if query in
1383
1388
  (name + ' ' + РУССКИЕ_ИМЕНА[name] + ' ' + documentation(name)).casefold()]
1384
- lines.append('СПИСОК ФУНКЦИЙ' + (f' — задание {задание}, {год}' if задание else ''))
1385
- lines.append(f'Найдено: {len(candidates)}')
1386
- for name in sorted(candidates, key=lambda n: РУССКИЕ_ИМЕНА[n]):
1389
+ lines.append('СПИСОК ФУНКЦИЙ' + (f' — задание {задание}' if задание else ''))
1390
+ lines.append(f'Нумерация: {год}' + (' (проект)' if год == 2027 else ''))
1391
+ lines.append(f'Найдено функций: {len(candidates)}')
1392
+
1393
+ def add_entry(name):
1394
+ numbers = catalog[name]
1395
+ if tuple(numbers) == tuple(range(1, 28)):
1396
+ label = '№1–27'
1397
+ elif numbers:
1398
+ label = '№' + ', '.join(map(str, numbers))
1399
+ else:
1400
+ label = 'историческая/вспомогательная'
1387
1401
  description = documentation(name).split('Пример:')[0].split('. ')[0].split('\n')[0]
1388
- lines.extend([f' {РУССКИЕ_ИМЕНА[name]} [{name}]',
1402
+ lines.extend([f' {РУССКИЕ_ИМЕНА[name]} [{name}] — {label}',
1389
1403
  textwrap.fill(description, width=96, initial_indent=' ', subsequent_indent=' ')])
1404
+
1405
+ if по_заданиям:
1406
+ topics = {
1407
+ 1: 'Графы и соответствие вершин', 2: 'Логика и таблицы истинности',
1408
+ 3: 'Таблицы и базы данных', 4: 'Коды и условие Фано',
1409
+ 5: 'Преобразование чисел', 6: 'Черепаха и геометрия',
1410
+ 7: 'Изображения, звук и передача данных', 8: 'Комбинаторика и слова',
1411
+ 9: 'Строки таблицы', 10: 'Поиск в текстовом документе',
1412
+ 11: 'Объём хранения', 12: 'Редактор и машина Тьюринга',
1413
+ 13: 'IPv4 и маски сетей', 14: 'Системы счисления',
1414
+ 15: 'Логические условия и параметры', 16: 'Рекурсия',
1415
+ 17: 'Последовательности: пары и тройки', 18: 'Робот и пути по таблице',
1416
+ 19: 'Игры: первый ход', 20: 'Игры: стратегия победы',
1417
+ 21: 'Игры: неизбежное поражение', 22: 'Параллельные процессы',
1418
+ 23: 'Исполнители и количество программ', 24: 'Строки и подстроки',
1419
+ 25: 'Делители, простые числа и маски', 26: 'Сортировка и моделирование',
1420
+ 27: 'Кластеризация и анализ данных'}
1421
+ if год == 2027:
1422
+ topics.update({10: 'IPv4 и маски сетей',
1423
+ 13: 'Исполнители и количество программ',
1424
+ 23: 'Пути в ориентированном графе',
1425
+ 27: 'Анализ данных: точки, признаки и энергия частиц'})
1426
+ common = [name for name in candidates if tuple(catalog[name]) == tuple(range(1, 28))]
1427
+ for number in ([задание] if задание is not None else range(1, 28)):
1428
+ group = [name for name in candidates if number in catalog[name] and name not in common]
1429
+ if group:
1430
+ lines.extend(['', f'ЗАДАНИЕ №{number} — {topics[number]}'])
1431
+ for name in sorted(group, key=lambda n: РУССКИЕ_ИМЕНА[n]):
1432
+ add_entry(name)
1433
+ historical = [name for name in candidates if not catalog[name]]
1434
+ if historical:
1435
+ lines.extend(['', 'ИСТОРИЧЕСКИЕ И ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ'])
1436
+ for name in sorted(historical, key=lambda n: РУССКИЕ_ИМЕНА[n]): add_entry(name)
1437
+ if common:
1438
+ lines.extend(['', 'ОБЩИЕ ИНСТРУМЕНТЫ ДЛЯ ВСЕХ ЗАДАНИЙ'])
1439
+ for name in sorted(common, key=lambda n: РУССКИЕ_ИМЕНА[n]): add_entry(name)
1440
+ else:
1441
+ for name in sorted(candidates, key=lambda n: РУССКИЕ_ИМЕНА[n]):
1442
+ add_entry(name)
1390
1443
  lines.extend(['', 'Подробнее: man(делители) или man("делители")',
1391
1444
  'Поиск: man(поиск="строк") | По заданию: man(17)',
1392
- 'Постраничный просмотр: man(листать=True)'])
1445
+ 'Алфавитный список: man(по_заданиям=False)',
1446
+ 'Постраничный просмотр: man(листать=True)',
1447
+ 'Номера включают смежные и вспомогательные инструменты, а не только готовые решения.'])
1393
1448
  text = '\n'.join(lines)
1394
1449
  if листать:
1395
1450
  import pydoc
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: egekit-study
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: Алгоритмические инструменты для подготовки к ЕГЭ по информатике
5
5
  License-Expression: MIT
6
6
  Requires-Python: >=3.10
@@ -10,7 +10,7 @@ Dynamic: license-file
10
10
 
11
11
  # EGEKit — библиотека для подготовки к ЕГЭ по информатике
12
12
 
13
- Версия 1.2.0 · Python 3.10+ · 112 функций · внешние зависимости не нужны.
13
+ Версия 1.2.2 · Python 3.10+ · 112 функций · внешние зависимости не нужны.
14
14
 
15
15
  Библиотека охватывает темы всех 27 номеров: логика, базы данных, кодирование,
16
16
  исполнители, комбинаторика, геометрия, сети, рекурсия, игры, строки,
@@ -181,8 +181,28 @@ python -m unittest discover -s tests -v
181
181
  старых архивов. После публикации пользователи обновляют пакет через
182
182
  `python -m pip install --upgrade ИМЯ_ВАШЕГО_ПАКЕТА`.
183
183
 
184
- Готовые файлы для публикации версии 1.2.0 находятся в папке dist. После
184
+ Готовые файлы для публикации версии 1.2.2 находятся в папке dist. После
185
185
  проверки `python -m twine check dist/*` их можно загрузить командой
186
186
  `python -m twine upload dist/*`. Если меняете код, пересоберите пакет.
187
187
  После публикации обновите установленный пакет:
188
188
  `python -m pip install --upgrade egekit-study`.
189
+
190
+ ## Номера заданий в справке: версия 1.2.2
191
+
192
+ `man()` по умолчанию группирует функции по номерам от №1 до №27 и подписывает у каждой функции номера заданий выбранного года. Для алфавитного списка: `man(по_заданиям=False)`.
193
+ `man(по_заданиям=True)` выводит группы с заголовками «ЗАДАНИЕ №1», «ЗАДАНИЕ
194
+ №2» и так далее. Общие инструменты вынесены в отдельный раздел. Функция,
195
+ подходящая нескольким номерам, появляется в каждой соответствующей группе.
196
+
197
+ ```python
198
+ from егэ import *
199
+ man() # Разделы от задания №1 до №27
200
+ man(по_заданиям=False) # Алфавитный список с номерами
201
+ man(по_заданиям=True) # Группы по заданиям
202
+ man(17) # Только функции для №17
203
+ man(по_заданиям=True, год=2027) # Нумерация проекта 2027
204
+ ```
205
+
206
+ На установленной версии 1.2.0 эти новые параметры ещё не работают.
207
+ Для установки без ожидания обновления индекса PyPI можно установить
208
+ готовый файл dist/egekit_study-1.2.2-py3-none-any.whl из этого архива.
@@ -6,3 +6,5 @@ print("Число 125 в троичной системе:", перевести_
6
6
  man(делители)
7
7
  man(17)
8
8
  man(поиск="простые")
9
+
10
+ man(по_заданиям=True)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "egekit-study"
7
- version = "1.2.0"
7
+ version = "1.2.2"
8
8
  description = "Алгоритмические инструменты для подготовки к ЕГЭ по информатике"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -29,7 +29,7 @@ class ManualTests(unittest.TestCase):
29
29
  self.assertEqual(self.output(17),self.output(задание=17))
30
30
  self.assertIn('сведения_о_сети',self.output(задание=10,год=2027))
31
31
  self.assertIn('простое_число',self.output(поиск='is_prime'))
32
- self.assertIn('Найдено: 0',self.output(поиск='несуществующее_слово_8472'))
32
+ self.assertIn('Найдено функций: 0',self.output(поиск='несуществующее_слово_8472'))
33
33
  self.assertIn('Функция не найдена',self.output('делител'))
34
34
  self.assertIn('делители',self.output('делител'))
35
35
  self.assertIn('Функция не найдена',self.output('__import__("os")'))
@@ -43,6 +43,31 @@ class ManualTests(unittest.TestCase):
43
43
  self.assertIn('делители',pager.call_args.args[0])
44
44
  pager.assert_called_once()
45
45
 
46
+ def test_numbers_are_shown_beside_every_function(self):
47
+ text=self.output()
48
+ self.assertIn('делители [divisors] — №25',text)
49
+ self.assertIn('сведения_о_сети [network_info] — №13',text)
50
+ self.assertIn('сведения_о_сети [network_info] — №10',self.output(год=2027))
51
+ self.assertIn('Нумерация: 2027 (проект)',self.output(год=2027))
52
+
53
+ def test_grouped_catalog_and_filters(self):
54
+ text=self.output(по_заданиям=True)
55
+ self.assertEqual(text,self.output())
56
+ positions=[text.index(f"ЗАДАНИЕ №{n} —") for n in range(1,28)]
57
+ self.assertEqual(positions,sorted(positions))
58
+ alphabetical=self.output(по_заданиям=False)
59
+ self.assertNotIn("ЗАДАНИЕ №1 —",alphabetical)
60
+ entries=[line for line in alphabetical.splitlines() if line.startswith(" ") and not line.startswith(" ")]
61
+ self.assertEqual(entries,sorted(entries))
62
+ for n in range(1,28): self.assertIn(f'ЗАДАНИЕ №{n} —',text)
63
+ self.assertEqual(text.count('справка [man]'),1)
64
+ selected=self.output(17,по_заданиям=True)
65
+ self.assertIn('ЗАДАНИЕ №17 —',selected)
66
+ self.assertNotIn('ЗАДАНИЕ №25 —',selected)
67
+ self.assertIn('ЗАДАНИЕ №10 — IPv4',self.output(год=2027,по_заданиям=True))
68
+ self.assertIn('ЗАДАНИЕ №25 —',self.output(поиск='is_prime',по_заданиям=True))
69
+ self.assertIn('Найдено функций: 0',self.output(поиск='not_a_function_8482',по_заданиям=True))
70
+
46
71
  def test_cyrillic_star_import(self):
47
72
  ns={}
48
73
  exec('from егэ import *\nрезультат = делители(12)\nчисло = перевести_в_систему(125, 3)',ns)
@@ -50,7 +75,7 @@ class ManualTests(unittest.TestCase):
50
75
  self.assertEqual(ns['число'],'11122')
51
76
  self.assertIs(ns['man'],e.man)
52
77
  self.assertIs(ns['справка'],e.man)
53
- self.assertEqual(егэ.__version__,'1.2.0')
78
+ self.assertEqual(егэ.__version__,'1.2.2')
54
79
  for name in e.__all__: self.assertIs(getattr(егэ,name),getattr(e,name))
55
80
 
56
81
  if __name__=='__main__': unittest.main()
File without changes
File without changes
File without changes
File without changes