4. Statement

Polygon 2015. 7. 28. 09:47

Statement는 문제의 내용를 기술해놓는 곳입니다. 문제의 기술은 이미 General Info에서 하지 않았느냐고 말할 수 있겠지만, Statement에서는 TeX을 통해서 기술해야 한다는 점이 가장 큰 차이점입니다.


일단 TeX에 관한 설명은 뒤로 미루고 본문으로 들어가겠습니다. Statement 탭에 들어가면, 아직 하나도 만든 것이 없기에 다음과 같은 화면이 나타납니다.



언어를 하나 선택해야 하는데요, 기본적으로는 English와 Russian이 권장됩니다(언어 선택 탭을 누를 시 그 둘이 맨 위에 있는데는 이유가 있습니다. 기본적으로 Codeforces Round에서 그 두 언어만 공식적으로 지원하기 때문입니다). 개인적으로는 유니코드 충돌 문제 같은 것을 방지하기 위해 English를 우선시하며, 개발자분께서 아시아 언어는 자동으로 TeX으로 바꾸는 것이 어렵다는 을 올리신 바 있기 때문에 Korean은 접어두시길 바랍니다.


그럼 English를 선택하고 들어가겠습니다. 그러면 다음과 같은 화면이 나타납니다.




우선 위의 파란 탭부터 설명하겠습니다.


  • English: English statement로 이동하겠다는 하이퍼링크입니다. 다른 언어의 statement를 추가하면 그것도 역시 추가됩니다.

  • Review: 문제를 Codeforces 형식에 맞추어 html로 표시함과 동시에, 나중에 만들 Validator 코드 본문을 표시합니다.

  • Delete Current: 현재 statement를 삭제합니다.

  • Create New: 새로운 statement를 만듭니다. 참고로 statement는 언어별로 중복이 불가합니다.


그 밑의 3개의 하이퍼링크는 다음과 같습니다.


  • In LaTeX: 정해진 양식에 따라서 적어놓은 Statement와 General Info에서 적어놓은 입출력 방식, Time/Memory Limit이 포함된 LaTeX 파일 그 자체을 평문으로 보여줍니다.

  • In HTML: 역시 정해진 양식에 따라서 변환하나, 차이점은 html로 보여준다는 것입니다. 때문에 LaTeX에서 보이던 것과는 달리 보일 수 있습니다(특히 줄바꿈).

  • In PDF: 사실상 이 기능이 제일 중요합니다. 위에 있는 LaTeX 파일을 기본으로 하여 pdf 파일을 만들어냅니다. Statement는 결국 이 pdf 파일을 만드는 것이 목표입니다.


본문으로 들어가서 각 항목을 설명하자면 다음과 같습니다.


  • Encoding: 문제의 인코딩 설정입니다. 기본으로 설정되어 있는 UTF-8을 사용하시길 권장합니다.

  • Name: 문제의 제목입니다. Polygon에 저장되어 있는 문제 이름과는 달리 풀 네임으로 적으시면 되겠습니다.

  • Legend: 보통 전설이라는 뜻을 가지고 있지만, 여기서는 전문이라는 뜻을 가지고 있습니다. 문제의 기본적인 이야기를 적는 칸입니다. 다만 중요한 점은 이해가 잘 되게 써야 한다는 것이겠죠. 안 그러면 욕을 먹으니......

  • Input format: 입력 양식을 입력하는 곳입니다(ex. 첫째 줄에 정수 n이 입력됩니다. 그 이후 n개의 줄에 걸쳐 어쩌구 저쩌구)

  • Output format: 출력 양식을 입력하는 곳입니다.

  • Note: 추가 사항, 예를 들면 입출력 예제(이는 나중에 Tests에서 자동으로 추가됩니다)의 작동 방식을 설명한다든지를 적어놓으면 됩니다. 얼마나 구체적으로 적을지는 본인의 재량입니다.

  • Tutorial: Codeforces의 Editorial입니다. 문제의 풀이를 적으시면 되겠습니다. 풀이의 양 역시 본인의 재량입니다. 풀이를 자세히 설명할 것인지, 아이디어만 설명하며 끝낼 것인지......본인의 선택입니다. 고로 Tutorial 칸에 무엇이든, 입력하고 저장하면 3개의 하이퍼링크가 있던 곳 옆에 추가적으로 2개의 하이퍼링크(Tutorial in HTML, Tutorial in PDF)가 생깁니다. 역할은 말 그대로입니다.


여기까지 입력한 것들은 창 맨 밑에 있는 Save 버튼을 통해서 저장이 가능합니다. 


밑에 있는 Statement Resource Files는 옆의 Add File을 통해, 혹시 Statement에 그림 등이 들어가야 할 때 추가적인 파일을 올리는 장소입니다. 다만 여기에 올리는 파일은 다음과 같은 문자만 허용됩니다.

  • 알파벳 소문자 및 대문자

  • 숫자

  • .(Period, 0x2E)

  • _(Underscore, 0x5F)

  • -(Hyphen, 0x2D)


이 이외의 문자는 Illegal filename specified 라고 표기되며, 업로드가 거부됩니다. 이는 다른 파일을 업로드할 때도 마찬가지로 적용됩니다.


이제 TeX로 약간의 편집을 할 차례입니다. TeX은 일종의 조판 프로그램으로, 여려 명령어들을 이용해서 구조적인 글을 써 나가는 프로그램입니다. 주로 논문 등의 형식을 요구하는 것에 쓰입니다. TeX과 관련된 기초적인 지식은 구글링을 하시기 바랍니다. 사실 TeX은 그 명령어가 너무 많아, 궁금한 게 있으면 일단 구글링해야 합니다. 아무튼 본 블로그는 TeX에 관한 포스팅을 하는 곳이 아니므로, 간략한 팁 및 사용방법만 몇 가지 이야기하겠습니다.

  • 우선 TeX에서는 줄바꿈이 Enter를 친다 해서 바로 적용되지 않습니다. 줄바꿈 문자는 \\입니다. 그 이외에도 빈 줄 하나를 놓으면 줄바꿈이 이루어지지만, 빈 줄을 여러개 놓아도 줄바꿈은 한 번밖에 이루어지지 않습니다.

  • TeX에서는 일반적인 편집 모드(textmode)와 수식 편집 모드(mathmode)가 따로 있습니다. 일반적인 모드는 plain text를 입력할 때 사용하며, 수식 편집 모드는 흔히 이탤릭체로 표시되는 수식을 표현할 때 사용합니다.

  • 일부 특수 기호는 \를 앞에 붙여야 사용가능한 경우가 있습니다. 다만 일부 특수 기호는 수식 편집 모드에서만 사용 가능한 경우가 있습니다.
    (ex. _를 출력하려면 \_를 입력해야 합니다)

  • 그러한 특수 기호들은 이 사이트에서 직접 그려보면서 확인할 수 있습니다.

  • 수식 편집 모드에 접근하는 방법은 간단히 2가지가 있습니다. 첫번째는 $ 수식 내용 $의 형태입니다. 이 경우 $ 안에 있는 내용이 수식 편집 모드가 적용됩니다. 또다른 방법으로는 $$ 수식 내용 $$의 형태가 있습니다. 이 경우 $$ 안에 있는 내용이 가운데 정렬이 되며, 자동으로 줄바꿈을 해줍니다.

  • 수식 편집 모드에서 사용할 수 있는 주요 구문 중의 하나가 첨자입니다. 윗 첨자는 ^, 아랫첨자는 _로 연결합니다.

  • 그림 첨부는 다음과 같은 구문을 넣으면 해결할 수 있습니다. 그림이 'picture.jpg'라는 이름을 가지고 있을 때(jpg, bmp, png 등의 확장자들이 적용됩니다)


  • \begin{figure}[h]

    \begin{center}

    \includegraphics[scale=0.5,bb=0 0 501 75]{statement_create.jpg}

    \end{center}

    \end{figure}

    이를 설명하자면 다음과 같습니다.

    • \begin{figure}: 이것이 float한 figure라는 것을 의미합니다. float을 간단히 설명하자면 '페이지에 걸쳐서 나타나지 않는 것'입니다.

    • \begin{center}: \end{center}가 있는 곳까지 가운데 정렬을 하라는 의미입니다. \includegraphics: 여러 옵션을 사용하여 그림 등을 나타내는 함수입니다. [] 안에는 많은 것들이 들어갈 수 있지만, 여기서는 2개만 사용하도록 하겠습니다.

      • scale: 그림의 배율입니다. 0.5라는 것은 가로와 세로를 0.5배로 하라는 것입니다.

      • bb: BoundingBox라는 개념인데, 이 옵션은 Polygon 특유의 문제로 반드시 포함해야 합니다. 안 그러면 에러가 납니다. 일반적으로는 bb=0 0 'scale이 적용된 그림의 가로 크기' 'scale이 적용된 그림의 세로 크기'를 적습니다.

    • {}: 안에는 당연히 그림의 이름을 그대로 적어넣으면 됩니다. 기본적으로 ASCII 코드 인식 가능하지만 일단 Polygon에 파일을 올리려면 그렇게 해야 하기에 별 문제는 되지 않습니다.

  • TeX을 알고 계시는 분이라면, 각 항목을 편집할 때 \usepackage 같은 정의 헤더는 사용할 필요가 없으며, 사용해서도 안 된다는 것을 알려드립니다. 그리고 은근 많은 구문들이 사용 불가능하다는 것 역시 숙지하시길 바랍니다(ex. \begin{enumerate}, \textbf}.

그 외에 다양한 것들은 직접 구글링하시길 바랍니다. TeX도 은근 복잡하기 때문에......예시를 들자면 다음과 같습니다.

The first line contains a single integer $q\ (1 \leq q \leq 80,000)$, the number of the binomial coefficients Kevin wants to calculate with the mentioned function, C(int n, int r).\\
The following $q$ lines contain two integers $n\ (0 \leq n \leq 80,000)$ and $r\ (0 \leq r \leq n)$, separated with a single blank. The values $n$ and $r$ are the input values of the function, C(int n, int r).


이를 Statement의 Input format에 넣으면 다음과 같이 나타납니다.



\leq 등이 부등호로 대체된 것을 알 수 있습니다. 아무튼 이런 식으로 Statement를 기술하면 됩니다.





'Polygon' 카테고리의 다른 글

6. testlib.h  (0) 2015.07.29
5. Files  (0) 2015.07.28
3. General Info  (0) 2015.07.22
2. Make a problem & Commit Changes  (0) 2015.07.22
1. Register  (0) 2015.07.22
Posted by Evenharder
,

3. General Info

Polygon 2015. 7. 22. 11:43

Polygon 첫걸음은 General Info 적는 것에서 시작한다고 해고 과언이 아닙니다. 실제로 General Info(일반적인 정보) 의미하는 것처럼, 문제의 기본 골격을 설정해놓는 것이 General Info 역할입니다. 이는 다음 포스팅 설명한 Statement 겹치는 감이 없잖아 있지만, 분명한 차이점이 존재합니다.



  • General Info 모습입니다. 여기에는 문제의 프로그래밍적인 부분보단, 문제 자체를 설정하는 부분이라 보시면 편할 같습니다. 하나하나씩 뜯어보도록 하겠습니다.
  • Input file: 입력 방식을 결정합니다. 입력 데이터는 물론 파일로 존재합니다만, 이를 파일을 통해서 입력할지, 아니는 표준 입출력 방식을 사용할 결정합니다. 물론 이외의 선택지(ex. Output-only) 있겠지만 Polygon에서 지원하는지는 모르겠습니다.

    하지만
    왠만하면 stdin(표준 입력 방식) 사용하기를 권장하겠습니다. 파일 입출력도 물론 여러 대회에서 많이 사용하지만, Polygon 시스템 표준 입출력이 훨씬 안정된 상태이기 때문에 시리즈에서는 표준 입출력만을 사용하겠습니다.
  • Output file: 출력 방식을 결정합니다. 마찬가지로, stdout 사용을 추천드립니다.
  • Time limit: 시간 제한을 설정합니다. 250ms (0.25) 에서 15000ms (15)까지 가능합니다. 보통 1000ms 내지는 2000ms지만 문제에 따라 다양한 Time Limit 가능합니다.
  • Memory limit: 메모리 제한을 설정합니다. 4MB부터 1024MB까지 가능합니다. Codeforces Round 보통 256MB 사용하나, 특수한 풀이를 요구하는 문제의 경우는 Memory limit 상당히 낮게 잡는 경우도 많습니다.
  • Interactive: 문제가 Interactive 문제인지 설정할 있습니다. Interactive 문제란 특정한 함수를 이용 구현하여 주어진 과제를 수행하는 문제입니다. 대부분의 경우어떠한 함수를 구현하라 주어지고 일반적으로 main 함수를 제출하는 것이 아닌, 함수만 제출하게 됩니다. 말로 설명하기 힘드네요. 대충 이런 문제들이라 보면 되겠습니다. 아무튼 Codeforces Round에서는 제공하지 않습니다. 그래도 Polygon 시스템 상으로 만들 수는 있습니다. 다만 이를 만드는 과정을  시리즈에서 언급할 지는 모르겠습니다. 나중에 기회가 되면 리뷰하는 걸로…... 그래도 Codeforces 다음과 같은 정보 나와 있습니다. 그래도 이해가 안 되시면 한 번 topcoder에서 문제를 풀어보세요.
  • Well-formed: test(테스트 케이스) 특정 규격을 맞추었는지 나타냅니다. 항목을 체크된 상태로 test 생성시 규격에 맞게 일부 whitespace character control character 등이 추가 제거됩니다. 경우 test 저장할 ‘Added test has been reformatted because of the problem well-formed policy’ 라는 구문이 추가적으로 나타납니다. 규격을 해석하자면 다음과 같습니다.


    • 줄이 EOLN(End of Line)으로 끝나야 합니다. , 줄에 마지막에는 ‘\n’ (enter)문자가 와야 합니다. 예를 들면, 어떤 문제의 input 줄에 정수 하나로 끝일 , test 만들 정수 하나 집어넣고 반드시 ‘\n’ 와야 합니다. ‘\n’ 기준으로 작동하는 입력 함수들이 많기 때문입니다(ex. C scanf) ‘\n’ 기본적으로 Windows/Mac에서는 CR LF 두개의 char, *nix 환경에서는 LF 해석되는 문자이지만, Polygon 이를 알아서 내부적으로 변환해줍니다.
      만일 줄의 끝에 EOLN 없을 경우, 자동으로 ‘\n’ 추가됩니다.

    • character code 값이 32보다 작은 문자가 입력되지 않아야 합니다. ASCII 코드를 보면, 32 미만의 값을 가진 문자들은 대체로 control key이기 때문에, 일반적으로 입력받을 일이 전혀 없는 문자입니다. 여기에서 ‘\n’(CR : 0x0D / LF : 0x0A) 제외됩니다.
      만일 그러한 문자들이 있을 경우, 전부 SPACE(0x20)으로 교체됩니다.

    • 줄이 SPACE 시작하거나 끝나면 안됩니다. 이러한 경우가 있을 경우 해당하는 SPACE 문자는 제거됩니다.

    • 2 이상의 연속된 SPACE 없어야 합니다. 있을 경우, 단일 SPACE 문자로 대체됩니다.

    • 줄이 없어야 합니다. ‘\n’ 있는 줄이 없어야 합니다. ‘\n’ 있는 줄이 있는 경우, 해당 줄은 삭제됩니다.

    • 파일이 비어 있으면 됩니다.



Well-formed 여부는 옆에 있는 ‘Well-formed: true/false’ 통해 있습니다여기까지를 저장하고자 하시면 화면에서 바로 보이는 Save 누르면 됩니다.


이러면 Advanced 용도가 궁금해지죠. 복잡할 같지만, 정작 Advanced 들어가면 매우 직관적인 메뉴가 보입니다.



각각을 설명하면 다음과 같습니다.


  • Problem Name: 문제 이름입니다. Rename 통해서 문제 이름을 재설정할 있습니다. Rename Commit Changes 무관하게, 누르는 순간 적용되며, View Problems에서 Discard 한다고 해서 원래 이름으로 돌아가지도 않습니다.
  • Clone problem to: 문제를 해당 이름을 가진 상태로 복제하는 기능입니다. 주의할 점은 Clone 가장 최신의 revision 복제하는 것이기 때문에, 상태에서 Commit Changes 통해 저장되지 않은 변경사항은 복제되지 않습니다.
  • Delete Problem: 문제를 삭제하는 것입니다. 다만 문제를 삭제해도 내부의 데이터는 삭제되지 않고 서버에 남아 있게 됩니다. 애초에, 삭제된 문제도 View Problem에서 스크롤을 밑으로 내리면 보이는 Show Deleted에서 접근 가능하고, 심지어 Commit Changes까지 가능합니다. 다만 경우 문제의 이름이 해시값 마냥 이상하게 바뀌며, 괴상한 이름은 수정이 불가능합니다. 문제를 복원하지 않는 말이죠. 삭제된 문제는 문제를 선택할 보이는 Restore, 문제에 들어가서 General Info-Restore 통해서 복원될 있습니다.


이제 Advanced 나오면, 밑에 조그맣게 Tags Add tag 보입니다. Tag 보통 다음과 같은 2가지 이유로 사용합니다.


  1. 정해의 접근법을 나타내기 위해서 (ex. math, data structure, greedy, sqrt-decomposition)
  2. 문제 자체를 분류하기 위해서. 가지 양상이 있습니다. 첫번째로는 문제가 어떤 형태의 문제인지 나타내기 위해서 쓰거나(ex. strings), 아니면 문제가 어떤 대회의 문제인지 나타낼 쓰기도 합니다(ex. ioi2011, looksery-cup)

Tags 진가는 View Problems에서 필터링해서 나타납니다(라고 개발자님께서 말씀하십니다). 의미 있는 tag 문제에, 못해도 하나라도, 예를 들면 implementation이라도 추가하시길 바랍니다.


tags에서 밑을 보면 Statement description Problem tutorial 있습니다. 여기에는 각각 문제 설명과 문제 해설을 text 적으시면 됩니다. 문제 설명은 봐도 문제가 무얼 요구하는지 있게 적어놓아야 하고, 문제 해설은 Codeforces Editorial처럼 간략간략한 핵심 아이디어를 말하면서 풀이를 전개해나가시면 됩니다. 저장은 Problem tutorial 밑의 Save 누르시면 됩니다. 참고로 Draft는 일종의 임시 저장 기능이라고 생각하시면 됩니다.



어째 간단히 설명하는 감이 있지만, 부분은 다음에 설명할 Statements 겹치기 때문입니다.


여기까지가 General Info였습니다. 다음은 Statement입니다.


 

'Polygon' 카테고리의 다른 글

5. Files  (0) 2015.07.28
4. Statement  (0) 2015.07.28
2. Make a problem & Commit Changes  (0) 2015.07.22
1. Register  (0) 2015.07.22
0. Introduction  (0) 2015.07.22
Posted by Evenharder
,

Polygon 계정을 만들고 Login하면 View Problem 창에 있을 겁니다. 물론 방금 전에 계정을 만드셨으니 등록된 문제는 없겠지요. 그때는 간단히 New Problem 버튼을 누르면 됩니다.


이 때 문제의 이름을 설정하게 됩니다. 문제의 이름은 간단한 명칭으로 통용될 정도여야 합니다. 일반적인 문제 제목이 아니라 간단하게 'brackets' 'bang' 'flip' 이런 식으로 말입니다. 문제 제목에는 알파벳 소문자와 대시(-)만을 사용할 수 있습니다.


참고로, 문제 이름 가지고 깊은 고민하지 않으셔도 됩니다. 왜냐하면 문제 제목은 언제든지 바꿀 수 있기 때문입니다. 아무튼 문제 자체를 만드는데 성공하셨다면 Edit session에 왠지 누르고 싶어지는 Start가 나타나며, 이를 누를 경우 문제 제작이 시작됩니다.



그리고 드러서는 순간......뭔가 할 것이 많아보이는 창이 하나 뜹니다. 바로 문제의 Gerenal Info 창입니다. 


이 창의 역할에 대해서는 다음 포스팅에서 진행하도록 하겠습니다. 지금 주목할 것은 스크롤을 조금만 내리면 나오는 ‘Commit Changes’라는 버튼입니다.



Commit Changes는 지금까지의 변화를 Polygon 서버에 저장하는 기능입니다. 물론 이를 누르지 않고 그냥 창에서 나가도 기존의 변화 상태는 저장됩니다. 그러나 Commit Changes는 이 상태를 하나의 revision으로 저장하여 보존해놓는데 의미가 있습니다. Commit Changes를 누르면 다음과 같은 창이 나타납니다.



각 항목의 의미를 설명하자면 다음과 같습니다.


  • Problem: 문제 이름입니다.

  • Changes: 변화한 파일 및 디렉토리의 개수입니다. 문제를 만들기만 하고 적은 게 없는데 왜 Changes가 21이나 되냐고요? 문제를 만드는게 근간이 되는 파일이나 디렉토리 등이 기본적으로 생성되었기 때문입니다.

  • Commit message: 무엇이 변했는지 적는 창입니다. 버그 수정, 개선점 등의 업데이트 내용을 적으면 되겠습니다.

  • Warnings: 말 그대로 경고입니다. 아직 문제가 ‘제대로’ 만들어지지 않았다는 것을 의미합니다. 지금은 뭐 한게 없으니 경고가 우후죽순으로 생겨나지만, 하나하나 사라지게 될 겁니다.

  • Minor changes: 기본적으로 Commit을 할 경우, 이 문제에 작업하는 모든 사람에게 Commit Changes를 통해 이메일이 발송됩니다. 다만 굳이 이메일을 보낼 필요까지 없는, 약간의 사소한 업데이트 및 개선이라면 ‘Don’t send email notification(이메일 공지를 보내지 않습니다)’ 버튼을 눌러 이메일을 발송하지 않도록 할 수 있습니다.


위 사항을 숙지하고 Commit(확인) 버튼을 누르면……



별로 달라진 것이 없어 보이지만, 자세히 보면 Problem revision이 0에서 1로 된 것을 알 수 있습니다. 즉, 하나의 저장본이 생긴 셈입니다.


이제 View Changes에 들어가면 revision의 내용, 즉 어느 파일이 추가(A), 변경(M), 삭제(D)되었는지, 또 각 revision의 Commit Message가 나타납니다(‘Created a prob’). 특정 revision에서의 특정 파일을 다운로드받을수 있는 등, 자주 해서 나쁠 것이 없는 기능입니다.


이제 잠깐 다시 나와볼까요. 상태에서 상단 메뉴바에 있는 View Problems를 눌러보면……



약간의 변화가 생겼습니다. Modif.(수정 날짜)에 시간도 들어가 있고(시간은 다만 모스크바 시인 MST로 표기됩니다), Info에는 만들어가야 할 것들 : statements, tests, solutions, checker, validator 등이 보입니다. 문제를 계속 이어서 만드려면 Continue를, Commit Changes하지 않는 내용을 없애고 최신의 revision으로 되돌리려면 Discard를 누르면 됩니다(Discard는 문제를 삭제하는 것이 아닙니다).


다음 포스팅에는 General Info 항목부터 손을 보도록 하겠습니다.


추신. View Changes에서 각 revision을 보다보면 ‘switch’라는 링크가 있습니다. 그 revision으로 덮어쓰는 기능입니다만, 가급적 사용하지 마시길 바랍니다. 하위 revision으로 바꾼 후 Commit Changes를 하려고 하면 conflict, 즉 revision 간 충돌이 일어나, 문제를 열지 못하게 되기 때문입니다. 이때는 Discard를 함으로써 덮어쓰기 전으로 돌아갈 수는 있지만, 괜히 상황을 복잡하게 만들고 싶으신 게 아니면 누르지 마시길 바랍니다. 이미 언급했듯이, 하위 revision의 파일을 열람 및 다운로드가 가능하니까요.

'Polygon' 카테고리의 다른 글

5. Files  (0) 2015.07.28
4. Statement  (0) 2015.07.28
3. General Info  (0) 2015.07.22
1. Register  (0) 2015.07.22
0. Introduction  (0) 2015.07.22
Posted by Evenharder
,