Каждую сгенерированную сетку с самого начала и до конца решает тот же логический движок, который выдаёт внутриигровые подсказки. Он проходит всю головоломку шаг за шагом, всегда выбирая простейший доступный ход — в точности как аккуратный человек, — и записывает, какие техники рассуждений ему пришлось применить. Всего техник пять, и уровень сложности получает имя самой жёсткой из них.
Basic даёт уровень Easy: одна подсказка сама определяет свои клетки — либо она уже удовлетворена и все оставшиеся квадраты пусты, либо число неизвестных в точности совпадает с количеством ещё нужных цветов. Subset рождает Medium: сравниваются две подсказки, у которых все неизвестные одной видны также и другой; вычитание одной из другой однозначно определяет квадраты, которые видит только большая подсказка. Overlap означает Hard: две подсказки делят часть квадратов, и минимальные или максимальные границы того, сколько цветов может содержаться в общей области, устанавливают значения квадратов, видимых только одной из подсказок (в таких сетках всегда есть и Subset-ходы). What-if поднимает планку до Extreme — это близкий родственник forcing chains из Sudoku: гипотетически ставим цветок или крестик в квадрате, следуем простым правилам и смотрим, как ломается подсказка — слишком много цветов или некуда добрать число. Противоречие доказывает, что в квадрате должно быть противоположное. Цепочки ограничены MAX_WHAT_IF_FIRINGS, так что каждый what-if можно отследить в уме без карандашных пометок, а подсказки прямо говорят, какой квадрат тестировать и какая подсказка нарушится.
Всё, что выходит за этот лимит, попадает в Insane. Здесь цепочки what-if длиннее (вплоть до INSANE_CHAIN_FIRINGS шагов подсчёта), а решатель ещё и берёт на вооружение технику either-way — аналог раскраски из Sudoku. Пробуем развилку через опорный квадрат в обе стороны; ни одно предположение не ломается, но обе цепочки принуждают одно и то же значение в какой-то другой клетке, так что она доказана безо всякого противоречия. Это единственный уровень, где заметки реально помогают. Подсказки объясняют оба типа: какой квадрат тестировать и, для either-way, какие клетки совпали в обеих ветках.
Оценка 0–100 размещает сетку внутри полосы её уровня: Easy 4–19, Medium 20–39, Hard 40–59, Extreme 60–79, Insane 80–100. Положение внутри полосы задают субметрики. Для Easy смотрят, насколько широко и прощающе решается сетка, для Medium и Hard — количество вынужденных Subset- или Overlap-ходов, для Extreme — суммарная глубина what-if-цепочек, а не их число, потому что короткий одношаговый what-if похож на overlap, а каскад в четыре шага — совсем другое дело. В Insane учитывается комбинированная работа обеих веток каждого either-way-развилки. Полосы не перекрываются, так что 62 всегда реально сложнее, чем 40.
Примерное время складывается из простых слагаемых: около секунды на клетку рутинной разметки, ~2 с на каждое базовое умозаключение, ~14 с на Subset, ~26 с на Overlap, ~15 с плюс ~10 с за шаг на каждый What-if, и ~35 с плюс стоимость шагов на каждое двухцепочечное either-way. Все веса живут в EST_TIME в исходном коде.
Нулевые клетки подчиняются ZERO_CLUE_RULES: Easy и Medium несут одну-две клетки с 0, Hard — ровно одну, Extreme и Insane — ни одной. Генератор оберегает нужные нули при обрезке, первым делом убирает лишние, вставляет ноль, если сетка вышла с недобором, и отбрасывает всё, что всё равно нарушает правила.
Слайдеры сверху ужесточают требования к сетке перед приёмкой. Каждый клик перебирает до 90 кандидатов; если ни один не вписывается в настройки, выдаётся ближайшее совпадение, а под доской загорается флаг — сигнал чуть ослабить слайдер или перейти на доску побольше, где жёсткие сетки встречаются чаще.