Я действительно бьюсь головой об стену, так как у меня очень мало опыта работы с алгоритмами.
Рассмотрим приложение, которое поддерживает набор телешоу и эпизодов для этих шоу. Пользователю разрешено ранжировать шоу (рейтинг, а не рейтинг, поэтому от 0 до n-1, где 0 — наивысший рейтинг).
Приложение предназначено для представления списка эпизодов на основе рейтинга шоу. В любой момент времени есть 0, 1 или 2 эпизода, которые приложение будет отображать в списке для каждого шоу (т. е. если пользователь посмотрел все эпизоды TheFooShow, в списке не будет ни одного эпизода; если у него есть 10 непросмотренных эпизодов TheBarShow, в списке появятся два). Эти эпизоды будут считаться primary
и secondary
.
Порядок эпизодов в списке должен максимально соответствовать некоторым правилам:
- Основной выпуск шоу в списке должен стоять перед любыми выпусками шоу с более низким рейтингом.
- Второстепенный эпизод шоу никогда не должен появляться перед основным эпизодом того же шоу.
- По возможности никакие два эпизода шоу не должны находиться в пределах 4 позиций друг от друга.
- Второстепенный эпизод шоу может появиться до того, как основной эпизод шоу будет оценен на семь или более позиций хуже.
- и т.д
Дело в том, что эпизоды из шоу с высоким рейтингом будут перечислены перед шоу с более низким рейтингом, но только в той степени, в которой, когда это возможно, будет введено определенное количество разнообразия.
Примерный набор может быть (не строго следуя приведенным выше правилам): [0, 1, 3, 0', 3', 4, 5, 10, 4', 11, 11', 23]
Я могу приблизиться к достижению желаемых результатов, составляя список с нуля, добавляя все основные эпизоды, а затем вставляя второстепенные эпизоды по мере необходимости. К сожалению, учитывая то, как работает остальная часть приложения, мне нужно иметь возможность вставлять эпизоды в уже созданный список.
Учитывая, как изменяются базовые данные эпизода, всякий раз, когда необходимо вставить эпизод, все эпизоды этого шоу, уже находящиеся в списке, будут удалены, будет обнаружен текущий набор эпизодов этого шоу, и они (или они) будут вставлены. спина к спине.
Мне бы по существу хотелось такую функцию, как:
- (int, int)indexesForEpisodesFromShow:(TVShow)aShow currentList:(List)aList
Который может принимать список в любом состоянии и, учитывая шоу, брать соответствующие эпизоды и определять, где в списке их следует вставить.
Мое текущее решение довольно примитивно и, как я уже сказал, работает только в определенных ситуациях. Я пробовал другие более сложные решения (читай: больше операторов if), но они, как правило, становятся очень хрупкими, и когда я добавляю дополнительную сложность для обработки крайних случаев, тесты начинают противоречить другим тестам.
Я чувствую, что учитывая типы правил, которые я пытаюсь реализовать, и как мало их, это должно быть решаемо, но после многих попыток я все еще застрял. Любая помощь будет принята с благодарностью.