Данный проект был сделан для того, чтобы упростить прохождение курса Алгоритмы в Школе Анализа Данных Яндекс.
В данном проекте представлен скрипт для тестирования решений. Это позволяет удобно перетестировать решение. Вам не придётся запускать тесты вручную после какого-либо изменения программы. Есть поддержка кастомных тестировщиков для задач с нефиксированным ответом.
Тесты проходят под санитайерами и дополнительными проверками как и в Контесте (отключаются флагом -s).
g++ main.cpp \
-fsanitize=address,undefined \
-fno-sanitize-recover=all \
-std=c++20 \
-O2 \
-Wall -Werror -Wsign-compare -Wself-assign \
-o mainВ Jupyter ноутбуке представлен пример скрипта для генерации тестов. Подразумевается, что с C++ кодом и ноутбуком, будут работать в VS Code.
- algo_tests.py - скрипт тестирующей системы
- Task - директория с примером решения и генерации тестов
- main.cpp - пример с имплементацией BinPow
- test.ipynb - ноутбук для генериции тестов
Для примера тестирования в проекте есть директория Task с реализацией алгоритма BinPow.
Ваше решение должно иметь такую же структуру. Решение дожно быть в файле main.cpp. Тесты должны лежать рядом в папке tests, в директориях вида test_n. В каждой тестовой директории должны быть два файла: input.txt, output.txt.
Установить tqdm:
pip install tqdm
Если вы работаете на Ubuntu, то могут быть проблемы с санитайзером, выполните: sudo sysctl vm.mmap_rnd_bits=28
- Напишите решение в main.cpp
- Сгенерируйте нужное число тестов с помощью test.ipynb. После этого появится директория tests с тест-кейсами. Настоятельно рекомендую генерировать тесты начиная с 20-го номера. Первые зарезервировать под самописные тесты, крайние случаи и т. п.
- Запустите тестирование:
python3 algo_tests.py Task/ -v
Изучите доступные опции запуска тестирования:
python3 algo_tests.py --help
-vПечатать аутпут программы-sКомпилировать программу без необходимых проверок и санитайзеров-dПропустить проверку вывода. Тестирование не будет остановлено, если возникнет WA--time-limitЗадать TL на работу программы
Дополнительно может потребоваться написать кастомную функцию проверки (например, когда требуется ответ с некой точностью, или ответ не зафиксирован, но должен удовлетворять какому-то предикату).
Для этого реализуйте функцию checker в файле checker.py в той же директории, что и main.cpp. Эта функция должна сверять строки с ожидаемыми и выдавать True, всё ОК. Сигнатура функции представлена в примере:
from typing import List
def checker(out_lines: List[str], true_out_lines: List[str]):
# На вход приходят все непустые строки, с обрезанными пустыми символами по краям .strip()
if len(out_lines) != len(true_out_lines):
return False
out_val = float(out_lines[0])
true_val = float(true_out_lines[0])
return abs(out_val - true_val) < (2e-4)