Структурирование задач
Проблема
Основной целью нашего проекта является разбор множества задач и написание глав о некоторых классах задач.
Возникает сразу много проблемных вопросов :
- Как стоит писать разбор задач
- Как хранить разборы
Первый вопрос тесно связан со вторым. Самый очевидный ответ, как всегда на поверхности. Хранить задачи, как и всё остальное в нашем проекте, а именно текстовыми файлами в формате Markdown
. Разумеется храним все задачи в отдельной папке src/tasks
. А сам разбор писать в +- в одном стиле.
Ссылки на задачи будут оставляться в нужных местах, таких как статьи о самих алгоритмах и о классах задач.
Теперь представьте, что у вас несколько десятков или сотен задач. Вы решили добавить новую задачу. Написали её разбор и теперь самое интересное. Вы решили вставить задачу в оглавление. Понятно, что лучше всего в общем оглавление всех задач отсортировать по сложности
. А самое сложное, может оказаться так, что задача имеет несколько совершенно различных решений и можно будет под разными статьями об алгоритмах указать ссылку не неё, как пример задачи.
Самое главное. Нужно чтобы все разборы выглядели одинаково, даже если их писали разные люди. Структура должна быть такая : ссылка на задачу, условие краткое, решение, код или ссылка на решение. Со временем может оказаться, что лучше всё это загнать под некоторые спойлеры или как-то по другому оформить. Вы просто умрёте всё это загонять под один формат.
Обсуждение решения
Немного подумав, можно прийти к мысли, что любой разбор должен иметь :
- Ссылку на источник или в худшем варианте иметь примерное упоминание откуда эта задача. Например,
задачу видел на сборах, может я её сам придумал
- Краткое условие.
- Решение в том числе и код (возможно имеется несколько решений).
- Рейтинг задачи. Например, если задача взята с
codeforces
, то рейтинг легко получить с помощьюAPI
. В отдельных случаях рейтинг немного соответствует сложности, значит надо иметь возможно проставлять рейтинг ручками. - Теги задачи. Теперь упомянув, что задача на конкретную тему, автоматически ссылка на задачу появится в статье об этом алгоритме.
Тут мы сразу приходим к решению. Храним каждую задачу в отдельной папке. В ней храним три файла :
- Конфиг задачи. Пункты
1
,4
,5
. - Условие и разбор. Пункты
2
и3
.
Конечно всё это можно хранить хоть в json объекте, хотя в базе данных, но это уже чрезмерная абстракция данных.
Написать скрипт для подобного не сложно. При условие, что я недавно писал подобное. Тогда задача была сделать на день открытых дверей клубов от нашего клуба некоторый листочек с задачами. Я всё это техал в одном файле, но когда задач стало больше 10 и когда я понял, что надо раздать все задачи без разбора, а себе оставить разбор, я устал. И написал скрипт, который сортировал по рейтингу через API и собирал все задачи в одном формате в один файл .tex
и потом получал pdf
.