Google Code Jam 2018 - Number Guessing
Xem PDFNumber Guessing
Đây là một bài kinh điển, được đưa vào chủ yếu để bạn làm quen với hệ thống chấm tương tác. Bộ chấm nghĩ ra một số nguyên \(P\) trong khoảng \((A,B]\), tức \(A<P\le B\). Bạn có \(N\) lượt đoán; sau mỗi lần đoán sai, bộ chấm cho biết \(P\) lớn hơn hay nhỏ hơn số vừa đoán.
Nếu gặp sự cố kỹ thuật ảnh hưởng đến việc tham gia Practice Session, hãy gửi thư ngay tới [email protected]. Ban tổ chức chỉ hỗ trợ ở mức hạn chế trong phiên nhưng sẽ phản hồi sớm nhất có thể. Với mọi phản hồi khác, họ mời thí sinh gửi suy nghĩ và đề xuất qua biểu mẫu phản hồi sau Practice Session.
Dữ liệu vào
Khác bài chuẩn, input được bộ chấm tương tác gửi dần qua đầu vào chuẩn theo giao thức dưới đây, không phải một tệp cố định biết trước.
Dữ liệu ra
Mọi thông tin chương trình muốn gửi cho bộ chấm phải được viết ra đầu ra chuẩn theo giao thức dưới đây. Nội dung ghi ra lỗi chuẩn bị bỏ qua, nhưng vẫn có thể tốn bộ nhớ và bị tính vào giới hạn bộ nhớ.
Giao thức tương tác
Ban đầu, đọc một dòng chứa số nguyên \(T\). Sau đó xử lý lần lượt \(T\) test. Với mỗi test:
- Đọc một dòng chứa hai số nguyên \(A,B\), là cận dưới loại trừ và cận trên bao gồm.
- Đọc một dòng chứa số nguyên \(N\), số lượt đoán tối đa.
- Thực hiện nhiều nhất \(N\) lần trao đổi. Mỗi lần, in một dòng chứa duy nhất số nguyên \(Q\), là dự đoán, rồi flush đầu ra ngay trước khi chờ phản hồi.
- Đọc một từ do bộ chấm trả về:
CORRECTnếu \(Q=P\),TOO_SMALLnếu \(Q<P\), hoặcTOO_BIGnếu \(Q>P\). Nếu chưa đúng, có thể tiếp tục lượt trao đổi kế tiếp.
Nhiều ngôn ngữ mặc định đệm output, nên nếu không flush trước khi đọc phản hồi, cả hai tiến trình có thể cùng chờ nhau; FAQ về bài tương tác giải thích thêm về thao tác flush. Nếu output sai định dạng, dự đoán ngoài miền hoặc có lỗi tương tự, bộ chấm gửi WRONG_ANSWER rồi ngừng gửi mọi dữ liệu. Chương trình phải thoát ngay khi nhận phản hồi này; nếu tiếp tục chờ input, nó sẽ treo và cuối cùng nhận Time Limit Exceeded thay vì verdict lỗi thích hợp.
Nếu giải được test trong \(N\) lượt, bộ chấm gửi CORRECT, rồi gửi dòng \(A,B\) của test tiếp theo nếu còn. Nếu hết \(N\) lượt mà chưa giải được, bộ chấm gửi WRONG_ANSWER và dừng. Sau khi nhận CORRECT cho test cuối, không được in thêm gì; nếu vẫn tiếp tục ghi stdout, bài sẽ bị Wrong Answer.
Công cụ kiểm thử cục bộ
Tài liệu chính thức cung cấp một script Python để mô phỏng bộ chấm. Khi kiểm thử cục bộ, cần chạy công cụ song song với chương trình, chẳng hạn bằng interactive runner, và đọc các chỉ dẫn trong phần chú thích của script. Bạn được khuyến khích bổ sung test riêng. Công cụ chỉ mô phỏng chứ không phải bộ chấm thật và có thể hành xử khác; vượt qua công cụ không bảo đảm vượt qua bộ chấm chính thức, đặc biệt nếu không dùng cùng trình biên dịch.
Ràng buộc
- \(1\le T\le20\).
- \(A=0\).
- \(N=30\).
Phân nhóm
- Test Set 1 (hiển thị): \(B=30\).
- Test Set 2 (ẩn): \(B=10^9\).
Ví dụ
Ví dụ tương tác 1
Transcript
t = readline_int() // reads 3 into t
a, b = readline_two_int() // reads 0 into a and 30 into b; note that 0 30 is one line
n = readline_int() // reads 30 into n
printline 30 to stdout // guesses 30
flush stdout
string s = readline() // because 30 > 9, reads TOO_BIG into s
printline 5 to stdout // guesses 5
flush stdout
s = readline() // reads TOO_SMALL into s since 5 < 9
printline 10 to stdout // guesses 10
flush stdout
s = readline() // reads TOO_BIG into s since 10 > 9
printline 9 to stdout // guesses 9
flush stdout
s = readline() // reads CORRECT into s
Note
Với \(P=9\), các dự đoán 30, 5, 10, 9 lần lượt nhận TOO_BIG, TOO_SMALL, TOO_BIG, CORRECT.
Ví dụ tương tác 2
Transcript
a, b = readline_two_int() // reads 0 into a and 30 into b; note that 0 30 is one line
n = readline_int() // reads 30 into n
printline 31 to stdout // guesses 31
flush stdout
string s = readline() // reads WRONG_ANSWER
a, b = readline_two_int() // tries to read for the third test case but hangs since
// judge has stopped sending info to stdin
Note
Dự đoán 31 ngoài \((0,30]\) nhận WRONG_ANSWER; tiếp tục chờ input sẽ bị TLE vì judge đã ngừng gửi.
Ví dụ tương tác 3
Transcript
a, b = readline_two_int() // reads 0 into a and 30 into b; note that 0 30 is one line
n = readline_int() // reads 30 into n
printline 31 to stdout // guesses 31
flush stdout
string s = readline() // reads WRONG_ANSWER
exit // receives a Wrong Answer judgment
Note
Thoát ngay sau WRONG_ANSWER để nhận đúng verdict thay vì TLE.
Nguồn
Google Code Jam 2018, Vòng luyện tập, bài Number Guessing.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Kỳ thi:
- Google Code Jam 2018 - Practice Session (31 Tháng ba, 2018)
Bình luận