Протестировать, как всё будет отображаться: ./build.sh
.
Рекомендуется использовать редактор MarkText.
Какие-нибудь новые термины нужно набирать так: *новые термины*
.
Что-нибудь важное нужно набирать так: **важное**
.
-
Unordered списки
-
мы набираем
-
через
*
.
-
Нумерованные списки
-
мы набираем
-
просто через цифры с точками.
Через
>
рекомендуется набирать цитаты или условия задач.
Что-либо относящееся к коду лучше держать в обратных кавычках
.
Используйте #
только для названия статьи.
Всё, что по смыслу меньше ##
или ###
, лучше выделять так:
Топик. Какие-то предложения.
Но какие-то большие разделы при этом лучше явно разделять заголовком.
Теоремы с доказательствами рекомендуется оформлять так:
Лемма. Ко-ко-ко. А именно:
Доказательство. Очевидно.
Используйте правильную пунктуацию, то есть —, «, » и так далее.
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
Рекомендуется использовать одну строчную букву для математических переменных.
Хорошо:
Не очень хорошо:
В коде желательно переменные называть так же, как в самой статье. Если для какой-то переменной при объявлении не очевидно, для чего она будет использоваться, то лучше оставить комментарий про этой.
Мы используем современный C++. Официальным компилятором считаем GCC, но стараемся обходить стороной compiler-specific фичи, если это возможно.
Для каких-нибудь специальных случаев (например, скрипт и генерация тестов для стресс-тестирования) можно использовать Python 3.
Картинки можно вставлять так: ![](http://example.com/path/img.png)
. Или так, предварительно загрузив картинку в директорию img
: ![](../img/img.png)
.
Предпочитайте полуинтервалы.
Ссылайтесь на какую-то известную теорему вместо её доказательства.
Парадокс дней рождений был доказан раза три — это нужно исправить.
-
стек
-
кэш
-
хэш
Некоторая часть кода на данный момент не соответствует кодстайлу.
В приоритете понятность реализациии, а не скорость её работы: программа, в которой в два раза меньше строк кода, лучше программы, которая работает в два раза быстрее. Можно сразу после неё привести другую реализацию, которая быстрее, но уродливее.
Желательно дублировать и оставлять готовую версию без комментариев в репозитории algorithmica-org/implementations
.
Используйте 4 пробела вместо табов.
Для скобочек используем «K&R».
Хорошо:
struct Node {
// ...
}
if (...) {
// ...
}
if (...)
// ...
if (...)
// ...
else if (...)
// ...
else {
// ...
}
Плохо:
if (...) // ...
if (...)
{
// ..
}
Старайтесь использовать структуры вместо массивов каких-то элементов, разве что если это сильно медленнее.
Также забудьте про private
поля и прочий ООП.
Плохо:
vector<pair<int,pair<int,int>>> t;
Хорошо:
struct Something {
int x, y, z;
}
vector<Something> t;
Старайтесь без необходимости не использовать шаблоны или что-либо сложное, особенно в статьях для начинающих.
Если это какая-то понятная конструкция языка из новых стандартов (не 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;