Đầu vào trong codeforces python

Bạn có cảm thấy lo sợ trong những kỳ thi chấm nhé? . Bài viết này sẽ giới thiệu với các bạn những bước cơ bản nhất để viết trình chấm - một kỹ thuật mà bạn phải thành đạt trước khi thi HSG

Trình chấm là một bộ chương trình giúp bạn tự động sinh ra các đầu vào kiểm tra ngẫu nhiên và tự động chạy hai chương trình lời giải khác nhau với các đầu vào đó để so sánh đầu ra. Về cơ bản, trình chấm bao gồm 4 chương trình là. lời giải 1, lời giải 2, trình kiểm tra sinh và trình kiểm tra so. Thường thì lời giải 1 là cách thông thường bạn sẽ sử dụng, còn lời giải 2 là cách có hiệu quả thấp hơn nhưng vẫn chính xác

Viết trình chấm là một trong những cách kiểm tra bài của mình đáng tin cậy nhất. Với những kỳ thi chấm nhé, ví dụ như VOI, việc sai sót nhỏ rất khó tránh khỏi khi ta không thể biết kết quả khi thi. Vì vậy, nếu như bài của bạn không được chấm với bộ test của ban tổ chức, bạn hãy tự chấm nó với bộ test ngẫu nhiên mà mình sinh ra. Nếu bài của bạn đúng với các phép thử ngẫu nhiên, bạn có thể tạm yên tâm là bài sẽ được điểm cao và không bị những sai sót "chí mạng" dẫn đến bài bị 0 điểm

Trình chấm yêu cầu một "chuẩn" trình và một "trâu", và so sánh hai chương trình này với nhau. Nếu chương trình chấm của bạn phát hiện là một bài kiểm tra mà kết quả của hai chương trình không khớp với nhau, thì chương trình chuẩn hoặc chương trình con trâu của bạn sẽ sai và bạn hãy sử dụng bài kiểm tra đó để gỡ lỗi. Còn nếu tất cả các bài kiểm tra đều đúng, bạn có thể tạm thời yên tâm, bởi vì mặc dù có thể cả hai lời giải thích cùng sai, nhưng cùng sai giống nhau thì rất khó

Đối với những kỳ thi chấm trực tuyến, hoặc đơn giản là bạn làm bài trực tuyến trên mạng, trình chấm cũng rất hữu ích trong việc tìm kiếm bài kiểm tra sai. Không giới hạn khi bạn mã một bài cấu trúc dữ liệu khó, bản cập nhật bài bị 0 điểm, thay vì ngồi gỡ lỗi bằng mắt hãy thử mã một bộ chấm để giúp tìm lỗi kiểm tra. Với kiểm tra sai tìm được, bạn sẽ dễ dàng gỡ lỗi hơn rất nhiều

Nhiều người ngại viết chương trình chấm vì cho rằng làm như vậy mất thời gian. Tuy nhiên, khi đã thành công thì viết một bộ chấm cho một bài chỉ mất khoảng 10 phút, nếu như bài đó có thể làm trẩu và sinh trắc nghiệm một cách dễ dàng. Lợi thế về mặt tâm lí khi đã biết chắc bài làm của mình đúng sẽ giúp bạn làm bài hiệu quả hơn, thực tế sẽ tiết kiệm thời gian nên khi không kiểm tra bài. Tương tự, viết trình chấm để gỡ lỗi những mã bài khó đôi khi hiệu quả hơn nhiều so với việc gỡ lỗi bằng mắt, tiết kiệm điện được rất nhiều thời gian

Lời giới thiệu của tác giả là. Hãy viết trình chấm bất cứ lúc nào mà bài có thể làm trẩu và sinh trắc nghiệm ngẫu nhiên dễ dàng. Có một số bài mà cách trâu còn khó hơn cách chuẩn thì có thể tạm bỏ qua, tuy nhiên nếu có thời gian vẫn nên viết trình chấm sau đấy cho chắc ăn

Lưu ý. Bài viết này hướng dẫn Pascal/C++ trên hệ điều hành Windows. Với ngôn ngữ khác hoặc chạy trên hệ điều hành khác, một số lệnh sẽ thay đổi, tuy nhiên ý tưởng vẫn tương tự

Một bộ chấm bao gồm có 4 thành phần. Lời giải 1, lời giải 2, trình kiểm tra sinh, trình kiểm tra

Lời giải 1

Thường là mã chuẩn của bạn. Dù viết trình chấm hay không thì phần này bắt buộc phải có nên cũng không cần phải nói nhiều. Trong bài viết này, ta sẽ giả sử đầu vào của lời giải 1 là

1
6, đầu ra là
1
7

Lời giải 2

Thường là mã trâu, hoặc là một cách giải khác, miễn phí là trả lời đúng số. Hãy chọn mã dễ nhất, dễ đúng nhất có thể, vì thời gian chạy thực tế không quan trọng lắm khi bạn chỉ cần sinh kiểm tra nhỏ để kiểm tra. Trong bài viết này, ta sẽ sử dụng đầu vào của lời giải 2 là

1
6, đầu ra là
1
9

sinh thử nghiệm

Chương trình này có nhiệm vụ sinh nhập ngẫu nhiên vào tệp

1
6. To Random Random System was change when startup program, use the
1
1 in Pascal and
1
2 in C++

Lưu ý. Lệnh

1
2 trong C++ tính ngẫu nhiên theo giây, tức là sau 1 giây nó mới thay đổi hạt giống ngẫu nhiên. Vì vậy nhiều khả năng các bài kiểm tra ngẫu nhiên sinh ra liên tục sẽ giống nhau. Để giải quyết vấn đề này, ta có thể lồng trình kiểm tra sinh vào chương trình để kiểm tra chứ không phải tách ra để chạy riêng nữa. Với Pascal thì không phải lo về điều này, vì
1
1 thay đổi hạt giống ngẫu nhiên theo mili giây

Trình so test

Chương trình này có nhiệm vụ duyệt N lần, với N là số bài kiểm tra cần thiết, vì vậy, mỗi lần thì chạy chương trình kiểm tra sinh trước, xong đến lần lời giải 1 và lời giải 2. Sau khi chạy xong, ta có được file

1
7 và
1
9 tương ứng là kết quả của hai chương trình lời giải, và công việc còn lại là so sánh 2 file này với nhau. Nếu kết quả trùng nhau (hoặc câu hỏi điều kiện bài với những bài có nhiều câu trả lời), ta coi như bài kiểm tra đó đúng và chuyển đến bài kiểm tra sau. If other nhau, ta in ra sai và dừng chương trình lại luôn, và ta có 3 tệp
1
6,
1
7,
1
9 là dữ liệu của bài kiểm tra sai

To run file, ta used

0
0 in Pascal and
0
1 in C++

Đây là một bài cấu trúc dữ liệu rất khó, thuộc đề thi VNOI Marathon 2015. Bài viết xin lấy code của tanphatls987 được 90 điểm làm ví dụ

Lời giải 1

mã liên kết

Đây là code của tanphatls987, được thêm 2 dòng

0
2 vào để mở file. Code gốc không có 2 dòng này vì cập trên SPOJ sử dụng Standard Input/Output

Lời giải 2

mã liên kết

Đây là mã trâu với độ phức tạp O(N * M), làm y như những gì đề bài bảo đảm

Trình sinh test + Trình so test

mã liên kết

Vì đây là code C++ nên tác giả kết hợp sinh test với chương trình nên test để hàm chạy ngẫu nhiên không bị trùng. Mã sinh kiểm tra từ dòng 11 đến dòng 37. Tại đây, ta duyệt 100 lần ứng với 100 test, mỗi lần duyệt ta sinh ngẫu nhiên ra file input

0
3. Sau đó, ta lần lượt chạy hai chương trình ở trên.
0
4 và
0
5 (lời giải 2 đặt tên là
0
6). Sau đó ta sử dụng lệnh
0
7, có nhiệm vụ nên hai tệp văn bản
0
8 và
0
9 với nhau. Nếu hai tệp hoàn toàn khớp với nhau, lệnh
1
40 sẽ trả về mã thoát là 0, còn không sẽ trả về mã thoát là 1

Chạy thử chương trình này, ta có thể sinh ra một thử nghiệm sai như sau

1
5

Trong đó, lời giải 1 ra đầu ra là

1

Lời giải thích 2 ra đầu ra là

0

Giới hạn kiểm tra (dòng 3) được đặt nhỏ hơn, mục đích là để sinh ra kiểm tra sai nhỏ dễ gỡ lỗi hơn. Sau khi mã đã đúng, có thể tăng giới hạn lên để kiểm tra mạnh hơn

Qua ví dụ trên, bạn có thể cảm thấy khá ngại khi mã chương trình kiểm tra khá dài, mã có thể bị mất thời gian. Tuy nhiên, ta hoàn toàn có thể viết mã nên hãy thử nghiệm thành một mẫu để ứng dụng cho tất cả các bài viết. With a template so test available, việc còn lại của ta chỉ là code phần sinh test và trình trâu, nếu như đã làm quen với trình chấm thì chỉ mất khoảng 10 phút để viết

Tác giả xin được chia sẻ với các bạn các template trình chấm do chính mình sử dụng

Template dành cho C++

1
4

Template dành cho Pascal

1
9

Mẫu sử dụng tập lệnh Shell

Giả sử bạn có 2 mã khác nhau, đã dịch ra 2 tệp thực thi là

1
41 và
1
42. Bạn viết thêm 1 sinh test và dịch ra file
1
43,
1
43 nhận 1 đối số là randomized seed (VD với C++ bạn dùng
1
45)

1
5

Để viết trình chấm thành, hãy thử viết trình chấm với tất cả các bài mà bạn luyện tập, cho đến khi không còn sợ viết trình chấm nữa, lúc đó bạn sẽ thành công. Please set a target item as a sub AC with all the cards mình làm với sự hỗ trợ của trình chấm. Một khi đã thành thạo kỹ năng tuyệt vời này, bạn sẽ dễ dàng chinh phục những kỳ thi chấm ngoại tuyến và không bao giờ phải lo lắng làm sai nữa