Skip to content

Latest commit

 

History

History
229 lines (137 loc) · 7.03 KB

guidelines.md

File metadata and controls

229 lines (137 loc) · 7.03 KB

Гайдлайны Алгоритмики

Протестировать, как всё будет отображаться: ./build.sh.

Рекомендуется использовать редактор MarkText.

Возможности markdown

Какие-нибудь новые термины нужно набирать так: *новые термины*.

Что-нибудь важное нужно набирать так: **важное**.

  • Unordered списки

  • мы набираем

  • через *.

  1. Нумерованные списки

  2. мы набираем

  3. просто через цифры с точками.

Через > рекомендуется набирать цитаты или условия задач.

Что-либо относящееся к коду лучше держать в обратных кавычках.

Заголовки

Используйте # только для названия статьи.

Всё, что по смыслу меньше ## или ###, лучше выделять так:

Топик. Какие-то предложения.

Но какие-то большие разделы при этом лучше явно разделять заголовком.

Теоремы с доказательствами рекомендуется оформлять так:

Лемма. Ко-ко-ко. А именно:

$$ ko + ko = ko $$

Доказательство. Очевидно.

Пунктуация

Используйте правильную пунктуацию, то есть —, «, » и так далее.

https://www.artlebedev.ru/kovodstvo/sections/97/ https://www.artlebedev.ru/kovodstvo/sections/104/

В линуксе есть удобный способ набирать спецсимволы — называется compose key. Под убунтой можно скачать Gnome tweak tools (скорее всего он уже есть) и поставить его на какой-нибудь бесполезный правый альт.

  • « = alt + < <

  • » = alt + > >

  • — = alt + - - -

  • ½ = alt + 1 2

Названия переменных

Рекомендуется использовать одну строчную букву для математических переменных.

Хорошо: $n$ вершин, $m$ рёбер.

Не очень хорошо: $N$ мальчиков, $M$ девочек.

В коде желательно переменные называть так же, как в самой статье. Если для какой-то переменной при объявлении не очевидно, для чего она будет использоваться, то лучше оставить комментарий про этой.

Языки

Мы используем современный C++. Официальным компилятором считаем GCC, но стараемся обходить стороной compiler-specific фичи, если это возможно.

Для каких-нибудь специальных случаев (например, скрипт и генерация тестов для стресс-тестирования) можно использовать Python 3.

Картинки

Картинки можно вставлять так: ![](http://example.com/path/img.png). Или так, предварительно загрузив картинку в директорию img: ![](../img/img.png).

Полуинтервалы

Предпочитайте полуинтервалы.

Переиспользование теорем

Ссылайтесь на какую-то известную теорему вместо её доказательства.

Парадокс дней рождений был доказан раза три — это нужно исправить.

Грамматика

  • стек

  • кэш

  • хэш


C++ codestyle

Некоторая часть кода на данный момент не соответствует кодстайлу.

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

Желательно дублировать и оставлять готовую версию без комментариев в репозитории algorithmica-org/implementations.

Отступы

Используйте 4 пробела вместо табов.

Для скобочек используем «K&R».

Хорошо:

struct Node {
    // ...
}

if (...) {
    // ...
}

if (...)
    // ...

if (...)
    // ...
else if (...)
    // ...
else {
    // ...
}

Плохо:

if (...) // ...

if (...)
{
    // ..
}

struct vs class

Старайтесь использовать структуры вместо массивов каких-то элементов, разве что если это сильно медленнее.

Также забудьте про private поля и прочий ООП.

Плохо:

vector<pair<int,pair<int,int>>> t;

Хорошо:

struct Something {
    int x, y, z;
}

vector<Something> t;

Шаблоны

Старайтесь без необходимости не использовать шаблоны или что-либо сложное, особенно в статьях для начинающих.

Современный C++

Если это какая-то понятная конструкция языка из новых стандартов (не move-семантика или constexpr-ы), и она сокращает код, то нужно её использовать.

Хорошо:

auto t = f(x);

for (int x : g[v]) {
    // ...
}

Плохо:

set<pair<int,int>>:iterator t = f(x);

for (size_t i = 0; i < g[v].size; i++) {
    // ...
}

Инкрементирование

Используем i++ вместо ++i , если это просто int-овый счётчик.

Компилятор всё равно это соптимизирует.

Лямбды

Мы любим лямбды и разное функциональное программирование там, где оно имеет смысл.

sort(a.begin(), a.end(), [](int x, int y) {
    return x < y;
});

auto hf = hash<string>();
h = hf(s);

Неймспейс

Предполагайте, что вы работаете в std и уже подключили все необходимые библиотеки. То есть что эти две строчки уже есть:

#include <bits/stdc++.h>
using namespace std;