아직 완전하지 않은 가이드라인이며, 앞으로 점차 보완될 예정입니다.
질문이 있으시면, 사소한 것이라도 저에게 연락하십시오.
#시작하는 방법
#수정 사항이 작을 경우
사이트의 어느 페이지에서든 오른쪽 위에 있는 연필 모양 버튼을 누를 수 있습니다. 그러면 prose.io 인터페이스가 열리며, 여기서 GitHub로 로그인해야 합니다. 로그인한 뒤에는 페이지의 markdown 원본을 편집할 수 있습니다. 처음 저장할 때 여러분의 이름으로 브랜치와 pull request가 자동으로 생성되며, 이후 저장할 때마다 그 pull request가 갱신됩니다. 편집을 마쳤다면 그대로 두십시오. 누군가가 확인하고 승인할 것입니다.
그곳에서는 전체 미리 보기를 제공하지 않으므로, 정확한지 확신이 서지 않는다면 복잡한 수식을 수정할 때 주의하십시오.
때때로 편집기가 글 앞부분에 있는 메타 정보 블록(아래에서 설명합니다)의 형식을 약간 바꾸기도 합니다. 이는 정상입니다. 다만 published / draft / date 값이 원하는 대로 되어 있는지만 확인하십시오.
#큰 수정 사항이 있는 경우
진지한 작업을 하려면 저장소를 체크아웃하여 사이트를 로컬에서 띄우는 것을 권장합니다. 다음과 같이 하면 됩니다(터미널 사용에 익숙하다고 가정합니다):
- Hugo를 설치합니다: 시스템에 따라
sudo apt-get install hugo,sudo pacman -Syu hugo,brew install hugo,choco install hugo -confirm중 하나일 가능성이 높습니다. - 저장소를 포크하고
git clone https://github.com/$USERNAME/algorithmica.git을 실행하십시오. - 저장소 루트에서
hugo serve를 실행하고 영어 버전은localhost:1313, 러시아어 버전은localhost:1314에 접속하십시오(포트는 다를 수 있습니다). - 필요한 글을 찾거나 새로 만들고, 수정 사항을 반영한 다음(어떤 텍스트 편집기를 써도 되며, 변경 내용은 브라우저에 자동으로 렌더링됩니다), 변경 사항을 push하고 master에 pull request를 생성하십시오.
draft(미게시)로 표시된 글을 편집하려면 -D 플래그를 추가해야 합니다. PR을 만들기 전에 맞춤법 검사기(예: hunspell)로 검사하는 것을 권장합니다.
이 항목들 중 어느 것이든 도움이 필요하신 분은 마찬가지로 연락해 주십시오.
#새 글을 쓰고 싶은 경우
다음 조건을 갖춘 글은 일단 완성된 것으로 간주합니다:
- 알고리즘이 설명되고 증명되어 있고,
- 구현이 있습니다,
- 구현에 버그가 없고,
- 문제 예시가 적어도 하나 있습니다.
쓸모없는 작업을 최소화하려면 먼저 (telegram이나 GitHub의 issue에서) 이 주제에 관한 글이 이미 어딘가에 있는지, 누군가 이미 그 글을 쓰기 시작했는지, 그 글이 애초에 필요한지, 그리고 필요하다면 어느 섹션에 넣어야 하는지 물어보시기를 권장합니다.
많은 문서가 draft로 표시되어 있습니다. 이는 해당 문서가 계획되어 있지만 아직 준비 중이라는 뜻입니다. 작성자가 지정되어 있지 않거나, 지정되어 있더라도 마지막 수정이 아주 오래전이라면 주저하지 말고 맡으십시오.
#기술적 기능
#Markdown
기본 문법 외에도 표, 코드 블록, 취소선, LaTeX 수식($ 한 개 또는 두 개로 감쌈), TikZ 다이어그램(@ 두 개로 감쌈)도 지원합니다.
#프런트 매터
각 글의 시작 부분에는 ---로 구분되는 메타정보 블록이 있으며, 그중 중요한 항목은 다음과 같습니다.
title: 글 제목authors: 저자 목록입니다(markdown을 지원합니다. 예를 들어 링크를 넣을 수 있습니다)editors: 같은 형식의 편집자 목록date: 마지막 수정 시각(2021-08-19형식으로 기록)created: 글이 처음 게시된 시점입니다(형식은 자유입니다)prerequisites: 선수 지식 문서에 대한 링크 목록(상대 링크가 더 좋습니다)입니다. 너무 많이 지정하지 않고 순환을 피하는 것이 좋습니다(이는 기술적 제약이 아니라 상식입니다).
작성된 메타 정보의 예시입니다.
#러시아어 규칙
리뷰어가 어차피 고쳐 주겠지만, 다음 사항을 꼭 유념해 주십시오:
- 따옴표: «와 »를 사용합니다.
- 하이픈, 마이너스, 대시: -, $a-b$(LaTeX 사용), —입니다.
- 수식이 포함된 문장은 일반 문장처럼 읽혀야 합니다(display-style 수식이 나오는 경우, 그 앞의 문단은 대개 문장 부호로 끝나지 않으며, 그 뒤의 문단은 별도의 문장이 아니라면 소문자로 시작합니다).
- 열거가 포함된 목록도 각각 별개의 문장으로 읽히거나 하나의 문장의 일부로 읽혀야 합니다.
- 해시(хеш), 스택(стек), 덱(дек)은 모두 «е»로 씁니다.
따옴표와 그 밖의 특수 문자를 복사하지 않고 직접 입력하는 법을 익혀 두면 편리합니다. Linux에서는 Compose Key를 사용하여 입력합니다.
또한 저희는 저자가 두 명 이상인 알고리즘 이름에서 하이픈 대신 대시를 쓰는 규칙을 무시하며(«Ахо — Корасик» 대신 «Ахо-Корасик»), 문장 부호 규칙도 그다지 엄격하게 따르지 않습니다.
#자주 하는 실수와 관례
몇 가지 사소한 기술적 세부 사항과 가이드라인입니다:
- 2단계(
##)와 3단계(###) 제목만 사용하십시오. 아주 작은 섹션이라면 bold 단어로 시작하는 문단으로만 구분하는 것이 좋습니다. - 상대 링크를 사용하거나 사이트 루트에서 시작하는 절대 링크를 사용하십시오:
/cs/tree-structures/treap/. - 그림은
로 삽입하며, 로컬 디렉터리img에 업로드합니다. 가능하면.png대신.svg를,.jpg대신.png를 사용하십시오. - 특별한 예외적인 경우가 아니라면 html을 사용하지 마십시오.
- 코드 블록에는 해당 코드를 작성한 언어의 태그(
cpp/python)를 표시하십시오. 그렇지 않으면 구문 강조가 작동하지 않습니다. - 주석은 사용해도 되며, 적극적으로 사용해야 합니다. 일반적인 “todo” 성격의 주석은 front matter에
#으로 적을 수 있고, 맥락에 따른 주석이나 초안 섹션은 html 주석<!-- ... -->으로 만들 수 있습니다.
#코드 스타일
Makefile이나 Go가 아니라면 모든 곳에서 공백 문자를 사용합니다.
Python. PEP를 철저히 따릅니다.
C++:
- 메타프로그래밍 대신 구체적인 타입을 사용하는 것이 좋습니다.
#define forn은 절대로 사용하지 마십시오.- 글에 한 글자짜리 변수가 있었다면, 구현에서도 그 변수를 그대로 사용할 수 있으며 또 그렇게 해야 합니다. 그렇지 않은 경우에는 변수에 이름만 보고도 뜻을 알 수 있는 이름을 붙여야 합니다.
- 특정 문제의 풀이는 함수 또는 메서드여야 합니다. 전처리는 별도의 함수로 작성하거나,
main자체는 빼고main안에 있는 것처럼 작성할 수 있습니다. 입출력은 아무도 관심을 두지 않습니다. - 주석은 러시아어로 작성하되, 변수와 함수 이름은 영어로 지으십시오.
코드 스타일은 예시로 설명하는 편이 더 쉽습니다:
template <typename T>
void f(T a, T *b, T &c) {
// ...
}
// однострочные форы предпочтительнее
for (/* ... */)
// ...
for (/* ... */)
for (/* ... */)
for (/* ... */)
// однострочные ифы тоже предпочтительнее
if (cond)
// ...
// но не так:
if (cond) // ...
// при этом однострочные функции ок
int sum(Node *v) { return v ? v->sum : 0; }
if (cond) {
// ...
} else if {
// ...
} else {
// ...
}
// иногда:
if (cond)
// ...
else {
// ...
}
// бесконечный цикл делается так
while (true) {
// ...
}
sort(a.begin(), a.end(), [](int x, int y){
return x < y;
});
int a[5] = {1, 2, 3, 4, 5};
int a[n] = {0}; // заполнить нулями
별도로 명시하지 않는 한, 모든 구현에서는 컴파일러가 GCC이고 표준이 C++17 이하이며 코드 블록 앞에 다음과 같은 import가 있다고 암묵적으로 가정합니다:
#include <bits/stdc++.h>
using namespace std;
평소에 사용하는 코드 스타일이 다르다면 clang-format이나 다른 포매터를 사용하는 것을 권장합니다.