HƯỚNG DẪN: LOGICA === 🎊🎉🎊🎉🎊🎉 Chào mừng các thành viên của ==Team Logica==! Các bạn là ==đầu não== - những người đóng vai trò quan trọng nhất trong sự hình thành, và bây giờ là phát triển, của [The Algitect (ALGI Project)](https://www.facebook.com/algitect.project). ... Vậy nên, hãy cùng cố gắng nhé! Tất cả vì một nền Tin học của tỉnh Bà Rịa - Vũng Tàu ngày một phát triển! [toc] Khái quát công việc --- Nhiệm vụ của một thành viên ==Team Logica== bao gồm (nhưng không bị giới hạn bởi): - ==Giải bài== (bao gồm **viết code** và **giải thích thuật toán**). VD: [Lời giải đề HSG9 tỉnh Bà Rịa - Vũng Tàu (NH: 2015 - 2016)](https://hackmd.io/@algitect/hsg9brvt2016). - ==Soạn bài== (bao gồm **viết đề bài** và **sinh test chấm** và **giải bài**) VD: Thi thử HSG, Thi thử Tuyển sinh, ... - ==Hỗ trợ các thành viên trong diễn đàn== VD: Trả lời các thắc mắc, giải bài giúp, ... >[!Important] > Dự án sử dụng trình chấm bài ==Codeforces==, soạn bài bằng [Polygon](https://polygon.codeforces.com/). > > Lời giải và các tài liệu khác được viết và xuất bản bằng [HackMD](https://hackmd.io/). > > Khi viết các biểu thức toán học trên cả hai nền tảng đều cần sử dụng [MathJax](https://math.meta.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference). > Tham khảo thêm: [LINK](https://en.wikibooks.org/wiki/LaTeX/Mathematics). Hướng dẫn sử dụng Polygon để soạn bài trên Codeforces --- ### Đăng ký tài khoản [ĐĂNG KÝ TẠI ĐÂY](https://polygon.codeforces.com/) Sau đây là các bước để soạn bài bằng ==Polygon==. ### Bước 1: Tạo bài mới ![a](https://hackmd.io/_uploads/Hy615Tjdkg.png) ### Bước 2: Thiết lập #### General info (Thông tin cơ bản) ![a](https://hackmd.io/_uploads/H1S3V0ouJx.png) - Nhập xuất (`Input file` | `Output file`): - Nhập từ bàn phím và in ra màn hình: stdin | stdout. - Nhập từ file và in ra file: [TÊN FILE].INP | [TÊN FILE].OUT. - Giới hạn thời gian (`Time limit`): Mặc định là 1000ms = 1s. - Giới hạn bộ nhớ (`Memory limit`): Mặc định là 256MB. >[!Note] > Đối với các ==đề thi chính thức (HSG, Tuyển sinh, ...)== bắt buộc: > - Nhập xuất bằng ==file==. > - Giữ nguyên giới hạn ==thời gian== và ==bộ nhớ== của đề gốc. #### Statement (Đề bài) ![a](https://hackmd.io/_uploads/rJLKKCiuyx.png) - Chọn ngôn ngữ: `English`. ![a](https://hackmd.io/_uploads/ryqR2AjuJx.png) - Nếu bài có subtask: Đánh dấu mục `Show section 'Scoring'`. - Nếu đề bài có hình ảnh: Chọn `Add Files` và upload hình ảnh. ![a](https://hackmd.io/_uploads/SkuZqRidyg.png) - Chọn chế độ: `Edit with preview` (Vừa chỉnh sửa vừa xem trước). ![a](https://hackmd.io/_uploads/HkKHi0odJg.png) - `Name`: Tên bài. - `Legend`: Đề bài chính. - `Input`: Mô tả dữ liệu vào. - `Output`: Mô tả dữ liệu ra. - `Note`: Ghi chú (thường dùng để giải thích test ví dụ). >[!Important] Quy tắc cần tuân thủ khi viết statement > - Các quy tắc văn bản bình thường: > - Viết hoa chữ cái đầu câu. > - Cách một khoảng trắng sau mỗi dấu `.`, `,`, `;`, `:`, `?`. > - Luôn sử dụng ==Math Mode== để viết tên biến, tên mảng và số. > - Trong ==Math Mode== không được sử dụng ký tự trực tiếp từ bàn phím trừ tên riêng. > VD: `(` thay bằng `\left(`, `<` thay bằng `\le`, ... > - Tên biến viết chữ thường, tên mảng viết chữ hoa. >[!Tip] Tài liệu tham khảo > ==Statement== trên Polygon được viết bằng $\TeX$, trong đó tích hợp MathJax để biểu diễn các biểu thức toán học. > > - Hướng dẫn sử dụng [$\TeX$ và MathJax](https://polygon.codeforces.com/docs/statements-tex-manual?ccid=cf669c2b33013c836766e01e235ac188&session=a3fac5f8c2b0825acab46a391645bd88c0ffe710). > - Tham khảo thêm về [MathJax](https://math.meta.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference). #### Checker ![a](https://hackmd.io/_uploads/SkP3a0i_1e.png) ==Checker== là chương trình để kiểm tra đáp án của thí sinh có ==hợp lệ== hay không. - Trong hầu hết các bài, đáp án của thí sinh phải giống hệt đáp án của tác giả. $\rightarrow$ Sử dụng checker `wcmp`: So khớp đáp án. >[!Note] >Đối với bài toán có dạng `In ra đáp án với độ chính xác 'x' chữ số phần thập phân` cũng sử dụng checker `wcmp`. - Đối với những bài yêu cầu in ra `YES` hoặc `NO` mà các kí tự có thể in hoa hoặc không. $\rightarrow$ Sử dụng checker `yesno` hoặc `nyesno`. - Đối với những dạng khác, cần tự viết chương trình checker riêng. #### Test ![a](https://hackmd.io/_uploads/Hyd3yknOyx.png) - Nếu bài có tính điểm theo test: Đánh dấu mục `Enable points`. - Thêm test: `Add Test`. ![a](https://hackmd.io/_uploads/BJ4PJ7p_kg.png) - Điền ==input== của test vào ô `Data`, sau đó chọn `Create` để chuyển sang test tiếp theo. - Tuy nhiên, trong những bài có nhiều test, làm như trên sẽ rất tốn thời gian. Vậy nên, hãy ưu tiên ==sinh test trên máy tính cá nhân== sau đó mới ==upload file test lên Polygon== bằng cách chọn mục `from the files`. >[!Note] > Dữ liệu của một test chỉ bao gồm ==input== và không có ==output==, vì ==output== sẽ được lấy từ ==code giải== mà mình upload lên Polygon (sẽ được hướng dẫn sau). ![a](https://hackmd.io/_uploads/HkI1b7T_yg.png) - `Delete`: Xóa test. - `Copy`: Sao chép test. - `Edit`: Chỉnh sửa nội dung test. - `Move`: Thay đổi số thứ tự của test. - `Points`: Thay đổi điểm của test. - `Example`: Thay đổi việc có đặt test làm test ví dụ hay không. - `Preview`: Kiểm tra output tương ứng với test. >[!Note] > - Nếu chỉ muốn chỉnh sửa thông tin của ==chỉ một== test, chọn các nút tương ứng với test đó (tương tự các nút được **khoanh màu xanh**). > - Nếu muốn chỉnh sửa thông tin của ==nhiều== test, đánh dấu chọn vào ô của các test đó, sau đó chọn các nút được **khoanh màu đỏ**. #### Solution (Code giải) ![a](https://hackmd.io/_uploads/SyMCfQ6Oyx.png) Chọn mục `Add Files`, sau đó tải file code giải của bài lên. >[!Caution] Lưu ý > Nếu bài nhập xuất từ file, code giải cũng phải cài đặt nhập xuất từ file (freopen). #### Commit changes (Lưu thay đổi) ![a](https://hackmd.io/_uploads/BkO1476_kx.png) Kéo trang xuống dưới cùng, chọn `Commit changes`. ![a](https://hackmd.io/_uploads/rJXVNmTOJl.png) - Nếu cần ghi chú lại những thay đổi đã thực hiện, ghi vào mục `Commit message`. - Nếu không muốn nhận email thông báo, đánh dấu mục `Minor changes`. Sau đó chọn `Commit` để lưu thay đổi. >[!Important] > Trong trường hợp soạn bài chung với team, cần ==commit changes== thì những người còn lại mới có thể nhìn thấy sự thay đổi trong bài. #### Packages (Đóng gói) ![a](https://hackmd.io/_uploads/r19VBQpdyl.png) Để bài có thể hoạt động trên ==Codeforces==, cần "**đóng gói**" bài lại. Ở trang `Packages` chọn `Standard`. >[!Caution] > - Chỉ tạo ==package== khi và chỉ khi đã hoàn thành xong tất cả các bước ở trên (đặc biệt là ==commit changes==). > - Sau khi chỉnh sửa bất kỳ thứ gì trên bài (test, đề bài, code giải, ...), cần tạo một ==package== mới thì bài trên ==Codeforces== mới được cập nhật. ### Bước 3: Thêm bài vào contest trên Polygon Cần thêm bài vào contest để phục vụ hai việc: - Chỉnh sửa bài ==cùng nhau== giữa các thành viên trong team (Trong trường hợp này, cần phải thực hiện ==Bước 3== ngay sau ==Bước 1==). - ==Team Leader== có thể tải bài lên Codeforces đồng loạt và tạo thành contest. >[!Note] > Contest trên ==Codeforces== **khác với** contest trên ==Polygon==. ![a](https://hackmd.io/_uploads/Sk-CU7pukx.png) Ở trang chủ của ==Polygon==, chọn `View Contests`. ![a](https://hackmd.io/_uploads/BJKWPXpdke.png) Tại đây, sẽ hiện thông tin của các contest mà bạn ==có quyển chỉnh sửa== (nghĩa là đã được ==Team Leader== cấp quyền). Chọn nút `Enter` tương ứng với contest mà bạn muốn thêm bài vào. ![a](https://hackmd.io/_uploads/S1Otd7au1x.png) Tại trang vừa hiện lên, chọn `Add problems?`. ![a](https://hackmd.io/_uploads/rJ6T_mpdkx.png) Đánh dấu những bài cần thêm ở cột `Add?`, sau đó chọn `Save`. ![a](https://hackmd.io/_uploads/HJJQF7Tdkl.png) - Cấp quyền cho `codeforces` là `READ`. - Cấp quyền cho mọi tài khoản còn lại là `WRITE`. Hướng dẫn sử dụng HackMD để soạn lời giải --- ### Đăng ký tài khoản [ĐĂNG KÝ TẠI ĐÂY](https://hackmd.io/) Sau đây là các bước để soạn lời giải bằng ==HackMD==. ### Bước 1: Tạo lời giải mới ![a](https://hackmd.io/_uploads/HyOReVaOyl.png) Chọn tài khoản ==The Algitect== để cùng chỉnh sửa lời giải với các thành viên khác trong team. Chọn `Create team note` để tạo lời giải mới. ### Bước 2: Viết lời giải Trong quá trình viết ==lời giải== trên **HackMD** cần sử dụng ==Markdown==. > *Vào `My Workspace`, chọn `Learning Markdown` để xem hướng dẫn.* ![a](https://hackmd.io/_uploads/H1duz46u1x.png) - Bên tay phải là màn hình ==chỉnh sửa==, viết bằng ==Markdown==. - Bên tay phải là màn hình ==hiển thị==, cho phép xem trước chính xác lời giải sẽ hiển thị như thế nào trên máy tính khác. >[!Important] Quy tắc cần tuân thủ khi viết lời giải > - Tất cả các [quy tắc khi viết statement](https://hackmd.io/@algitect/logica_tutorial?stext=2797%3A449%3A0%3A1738519969%3AaEFJPT). > - Đối với ==code mẫu==, cần tuân thủ các quy tắc sau: > - Tuyệt đối không dùng lệnh `define`. > - Cần viết ==cách ra==. > - Luôn luôn ==mở ngoặc và xuống dòng== đối với các lệnh `if`, `for`, `while`, ... > - Đặt ==tên hàm== đầy đủ, đúng mục đích của hàm. > - Không viết ==freopen==, ==ios_base==. > - Cố gắng ==comment== rõ ràng ở những vị trí code khó hiểu. > - Code mẫu phải tuân theo ==lời giải==. >[!Tip] Lời giải mẫu: > [**LỜI GIẢI TẠI ĐÂY**](https://hackmd.io/@algitect/hsg9brvt2016)