Programing Competition Models
===
###### tags: `thesis` `proposal`
[toc]
## Các mô hình thi lập trình truyền thống
### Competitive programing
<details>
#### Luật thi
Mỗi thí sinh sẽ nhận một máy tính có môi trường (tương đối) giống nhau, được giao cho một hoặc nhiều bài toán và giải quyết trong khoảng thời gian giới hạn.
Mỗi bài toán thường là một vấn đề nhỏ riêng biệt và có thể được giải trong khoảng 30p - 60p.
#### Nộp bài
Các thí sinh sau khi làm bài sẽ nộp lại (những) file source code của mình. Mỗi bài toán sẽ tương ứng với 1 file.
Trước đây việc nộp bài được làm thủ công bằng cách copy vào thiết bị lưu trữ, in source code ra giấy, ký tên, vv...
Sau này các hệ thống chấm bài được phát triển và tích hợp nộp bài qua website.
#### Chấm bài
Mỗi bài toán sẽ có nhiều `testcase`, mỗi `testcase` là một bộ input/output được người ra đề định nghĩa hoặc sinh ngẫu nhiên.
Một số bài toán có kết quả được định nghĩa trước, một số bài toán lại có nhiều kết quả, thí sinhc hỉ cần trả lời đúng 1 trong các kết quả đúng là được chấp nhận. Một số bài toán lại yêu cầu chương trình của thí sinh tương tác với hệ thống bằng cách xuất ra các dòng text có cú pháp và đọc kết quả trả về để tính toán tiếp.
</details>
### Hackathon
<details>
#### Luật thi
Các thí sinh sẽ tham gia làm một sản phẩm trong 1-3 ngày liên tục. Từ khâu lên ý tưởng cho đến hiện thực, và cuối cùng là trình bày lại ý tưởng + sản phẩm của mình cho ban giám khảo đánh giá.
Các thí sinh thường làm bài theo đội 2-5 thành viên.
Đề tài thường mang tính chất phổ thông và trừu tượng, thí sinh có thể phát triển và khai thác vấn đề theo nhiều hướng khác nhau.
#### Nộp bài
Các đội thi có 5-15 phút trình bày sản phẩm của mình cho ban giám khảo và các đội thi khác, khán giả, ... cùng xem
#### Chấm bài
Ban giám khảo sẽ đánh giá và nhận xét theo quan điểm cá nhân và thảo luận chọn ra đội chiến thắng.
</details>
### Kaggle
<details>
#### Luật thi
...
#### Nộp bài
#### Chấm bài
</details>
## Coding games và Coding Game Competition
### Codeing games
#### Luật chơi
Người chơi sẽ sử dụng code để điều khiển nhân vật của mình thực hiện các hành động để chiến thắng trò chơi. Nó giống như việc bạn chơi game bình thường, nhưng thay vì điều khiển bằng chuột, bàn phím, pad, ... bạn sẽ điều khiến cũng bằng chuột và bàn phím,... để code.
##### Phương pháp làm bài
Phương pháp thông thường là sử dụng API được cung cấp sẵn của trò chơi. Ví dụ:
* Gọi lệnh: `Character.moveLeft()` để đi sang trái
* Gọi lệnh: `Evironment.getInfo(x,y)` để lấy thông tin của ô `(x,y)`
* ...
Người chơi sẽ viết chương trình theo template thường được cung cấp bởi ban tổ chức. Hoặc "import" các thư viện cần thiết và làm theo một bản hướng dẫn ngắn gọn cũng được cung cấp bởi ban tổ chức.
Với phương pháp này, người chơi sẽ giới hạn ở một số ngôn ngữ được ban tổ chức hỗ trợ. Tuy nhiên sẽ nhẹ vồ khối lượng công việc lập trình hơn nhờ được hỗ trợ sẵn các hàm cơ bản.
Một phương pháp khác đó là sử dụng nhập xuất file có cấu trúc. Ví dụ:
* Xuất lệnh di chuyển ra file: `move-<turn>.txt`, trong đó `<turn>` là số hiệu của lượt chơi hiện tại.
* Đọc kết quả lượt chơi tại file: `result-<turn>.txt`, ...
* ...
Với phương pháp này, người chơi chỉ cần sử dụng nhập xuất file cơ bản, sử dụng bất cứ ngôn ngữ lập trình nào cũng có thể giải quyết bài toán. Thí sinh cũng phải tự quản lý và xây dựng logic game cho mình. BTC cũng có thể cung cấp API hỗ trợ cho một số ngôn ngữ, tuy nhiên điều này không bắt buộc.
##### Thời gian thi đấu
Thông thường các cuộc thi sẽ công bố đề trước khi thi một khoảng thời gian để các đội thi chuẩn bị, làm quen môi trường và xây dựng chương trình của mình trong vài tuần.
Một số trường hợp, nếu muốn tăng tính bất ngờ và không quá nặng về code thì BTC có thể giữ kín mọi thông tin đến khi phát đề và cho các đội cùng làm trực tiếp 3-5h tại địa điểm thi hoặc 1-3 ngày như Hackathon.
#### Nộp bài
Các thí sinh sẽ nộp lại source code của mình theo định dạng được quy định bởi BTC.
#### Chấm bài
Các chương trình sẽ được thực thi song song hoặc tuần tự (tùy luật chơi) và kết quả được thu lại và hiển thị cho các đội chơi trực tiếp theo dõi.
Thông thường, kết quả được export dưới dạng raw data và được một trình visualization riêng biệt mô phỏng thành phiên bản hấp dẫn hơn.