GithubHelp home page GithubHelp logo

algocont's Introduction

Проект для решения контестов по алгоритмам

Запуск проекта

Необходимо установить официальный пакет IDE VSCode от Microsoft. Также вам понадобится установленный Docker.

Установите плагин VSCode: ms-vscode-remote.remote-containers.

Нажать сочетание клавиш CLTR + SHIFT + P, в строке поиска ввести Dev Containers: Reopen in Container и нажать клавишу Enter.

Плагин Clangd предложит установить языковой сервер, соглашайтесь.

Запустить "отладку файла" можно, открыв его и нажав F5.

О тестирующей системе

Мы используем платформу Яндекс.Контест. При отправке файла с исходным кодом в несколько этапов происходит сборка исполняемого файла.

Форматирование

Сперва будет проверено соответствие вашего кода принятому форматированию с помощью утилиты clang-format. При выявлении проблемы, решение упадет со статусом CE.

Код должен соответствовать файлу конфигурации .clang-format.

Стиль кода

На данный момент у нас не получилось наладить запуск clang-tidy в Яндекс.Контесте, поэтому стиль кода не будет проверяться.

Однако, мы добавили конфигурационный файл .clang-tidy. Языковой сервер Clangd подхватит его и будет выдавать вам полезные замечания не только по стилю наименования переменных, но и по использованию некоторых лучших практик.

Если вы крайне не согласны с линтером, то можете подавить замечание при помощи комментария // NOLINT.

Мы будем рады, если вы будете придерживаться данного стиля и присылать нам код без замечаний, ведь так нам будет проще его проверять и оказывать техническую поддержку.

Параметры компиляции

Ваше решение будет собрано со флагами компиляции CXXFLAGS_RELEASE, определение которых вы найдете в файле ci/build.sh.

Так как будет включен максимальный уровень оптимизаций, вы можете не бояться использовать zero-cost абстракции языка. Благодаря -DNDEBUG вы свободно можете размещать код для отладочной печати или проверки инвариантов между директивами #ifdef and #ifndef, а также использовать макрос assert.

На малых тестах будет запускаться решение собранное под санитайзерами.

CXXFLAGS_ASAN="$CXXFLAGS_RELEASE -fsanitize=address,undefined,leak"

Так что мы надеемся поймать основные ошибки при работе с памятью, особенно утечки памяти. Санитайзер будет ронять программу, из-за чего вердиктом тестовой системы будет RE.

Рабочее окружение

Для решения задач мы рекомендуем использовать официальный пакет IDE VSCode cо следующими плагинами:

Собирать решение рекомендуется с заданными флагами при помощи компилятора clang.

Clangd предоставит вам возможности форматирования кода, предоставит подсказки, навигацию, рефакторинги и другое. Однако вам следует отключить C_Cpp.intelliSenseEngine от Microsoft, чтобы он не конфликтовал с clangd - скорее всего, VSCode предложит вам это сделать.

Для комфортной работы можете описать простую систему сборки с использованием утилиты Make или Shell скриптов. Можно автоматизировать не тольку сборку исполняемого файла, но и запуск тестов, что позволит вам сэкономить время и нервы.

И обязательно настройте компиляцию файла и запуск отладчика по кнопке в VSCode - оно того стоит.

Полезные советы

Если ваше решение не проходит по времени, попробуйте сгенерировать большой тест, запустить решение под профилировщиком и построить Flame Graph - он может помочь диагностировать проблему. Собирая решение со включенными оптимизациями, добавьте флаг -fno-omit-frame-pointer. Большой тест может быть удобно генерировать скриптом на Python.

Если ваше решение выдает неверный ответ или падает на одном из тестов, можете попробовать применить технику тестирования программы случайными данными. Для этого можете редактировать код функции main так, чтобы при поданом аргументе --testing запускать тестирование, а иначе код, читающий данные из стандартного ввода.

Удачи!

algocont's People

Contributors

vityaman avatar

algocont's Issues

Add testing framework

In YSDA setup I had some scripts that automated workflow for running sample tests. I had some folder where tests were in directory test/<contest>/<problem>/. Each tests case is a two files: an input file <N>.i and an output file <N>.o, where N is a test case number. Then I had a script runs an executable with IO redirected to/from these files for each test case and compares results.

It would be nice to have this here and also integrated into VSCode configurations just to press F5 and have tests executed, because manual copy-paste is not so convenient.

References

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.