В данной статье я планирую провести разбор тестового задания для Python-разработчика, с которым мне пришлось столкнуться при поиске работы. Разбирая шаги и решения этого теста, я надеюсь поделиться полезными наработками и советами для тех, кто также стремится успешно пройти подобные испытания. Тип зпдач весьма классический, про билетики: У нас имеются автобусные билеты с номерами от 000000 до 999999. Билет считается 'счастливым', если сумма первых двух цифр равна сумме следующих двух цифр, и эта сумма равна сумме последних двух цифр. При этом не должно возникнуть ситуации, когда конкатенация пары цифр первого блока равна конкатенации пары цифр второго блока и третьего. Для примера, рассмотрим билет с номером 123456: Сумма первых двух цифр: 1 + 2 = 3 Сумма следующих двух цифр: 3 + 4 = 7 Сумма последних двух цифр: 5 + 6 = 11 Обозначим символом || операцию конкатинации: конкатинация первых двух цифр: 1 || 2 = 12 конкатинация следующих двух цифр: 3 || 4 = 34 конкатинация следующих двух цифр: 5 || 6 = 56 Условия не выполняются, и билет считается  не "счастливым". Теперь мы хотим определить, сколько "счастливых" билетов находится в каждом рулоне троллейбуса. Каждый рулон включает в себя 100 000 билетов (номера от 000000 до 099999, от 100000 до 199999 и так далее) Под 'решением в лоб' я понимаю метод, основанный на переборе всех возможных значений. Следовательно, для такого подхода к решению задачи, первым этапом является генерация всех возможных значений: Код использует цикл от 0 до 999999 и форматирует каждое число как строку, добавляя ведущие нули при необходимости с использованием f-строки и форматирования числа с шестью знаками. Таким образом, формируется последовательность номеров от 000000 до 999999. Далее код выделяет три нужные подстроки (пары чисел) [partn]. отфильтрем номера, которые не сооветствую условию об конкатинации, для этого достататочно их сравнить "=" Для удобства реализации введена вспомогательная функция для подсчета суммы цифр в двойке. Пары, удовлетворяющие условиям, фильтруются по равенству чисел. и отфильтруем пары по равенству чисел Остается только записать результат в карту (map) и вывести его. Результат:  Важно отметить, что основной недостаток такого решения заключается в переборе всех возможных значений, что существенно замедляет процесс. Замерим время выполнения (самым преметивным способом):  Время выполнения составило 1.136587381362915 некотрых едениц времени. Однако вместо того, чтобы перебирать все 100000 значений, достаточно ограничиться перебором всех возможных пар от 00 до 99. Это осуществимо, зная, сколько каждой паре соответствует других пар с той же суммой цифр. Сначала мы рассчитаем и запишем эту информацию в мапу (где ключ это сумма двух цифр, а значение количество таких сумм). Затем, как было упомянуто ранее, мы снова переберем все пары двоек, посчитаем, сколько счастливых билетов соответствует каждой из них, и запишем результат. После этого мы возводим результат в квадрат, так как помимо перебираемой двойки есть еще две пары. Затем вычитаем 1, так как это представляет собой случай, который не соответствует требованию конкатенации. Запишем это еще проще: Итого имеем: Результат: После внесения вышеупомянутых оптимизаций время выполнения снизилось в 3100 раз, что является впечатляющим результатом. Замер времени выполнения с использованием примитивного метода составил 0.0003666877746582031 тех же единиц времени, что говорит о существенном ускорении процесса. Это существенное ускорение достигается за счет уменьшения числа итераций в циклах с 100 000 до всего 200. Стоит также отметить, что количество итераций можно уменьшить вдвое, учитывая симметрию результата (делать я этого конечно же не буду). Важной составляющей процесса решения задачи является выбор оптимального способа, и, как показано выше, различные подходы могут существенно влиять на эффективность решения. В первом, более примитивном варианте, был использован перебор всех возможных значений, что, несомненно, далеко не самый эффективный метод в данной задаче. Этот подход требует значительного количества итераций и, следовательно, времени выполнения. Однако, во втором варианте, который был продемонстрирован, мы применили оптимизированный метод, ограничившись перебором лишь нужных пар. Это привело к значительному снижению числа итераций и, как следствие, к ускорению времени выполнения в 3100 раз. P.S. код можно глянуть на GitHub