Viết chương trình hoặc chức năng với chức năng sau:
- Trước tiên, chương trình / hàm cố gắng ghi chuỗi
Hello, world!
vào luồng đầu ra tiêu chuẩn. (Không có hình thức đầu ra nào khác được chấp nhận cho thử thách này, vì trọng tâm tập trung rất nhiều vào I / O thay vì hành vi tầm thường của chính chương trình.) Tùy thuộc vào việc nó có thành công hay không:- Nếu nó thành công trong việc xuất ra
Hello, world!
, chương trình / hàm sẽ thoát mà không có bất kỳ hành vi nào nữa. - Nếu không thể tạo ra đầu ra chính xác do lỗi, chương trình / hàm cố gắng ghi chuỗi
Error writing "Hello, world!"
vào luồng lỗi tiêu chuẩn. (Đối với mục đích của thử thách này, bạn không cần xử lý lỗi cho chính việc xử lý lỗi.)
- Nếu nó thành công trong việc xuất ra
Làm rõ
Chương trình / chức năng của bạn sẽ được chạy mà không có đầu vào (trừ khi nó được viết bằng ngôn ngữ hoàn toàn yêu cầu đầu vào hoạt động, trong trường hợp đó, nó sẽ được chạy với đầu vào đơn giản nhất có thể).
Khi sản xuất đầu ra, bạn cũng có thể tạo một dòng mới duy nhất nếu bạn muốn, nhưng làm như vậy là không bắt buộc.
Định nghĩa "ghi lỗi vào đầu ra tiêu chuẩn" mà chương trình của bạn thực hiện phải coi ít nhất các trường hợp sau là lỗi:
- Đầu ra tiêu chuẩn không tồn tại (nghĩa
stdout
là một tệp đóng, không có mô tả tệp 1 tồn tại hoặc các trường hợp đó dịch sang ngôn ngữ và HĐH bạn đang sử dụng); - Đầu ra tiêu chuẩn đề cập đến một tệp trên đĩa không còn chỗ trống;
- Đầu ra tiêu chuẩn kết nối với một chương trình khác, đã kết thúc kết nối.
và phải coi ít nhất các trường hợp sau là thành công (nghĩa là không có lỗi):
- Đầu ra tiêu chuẩn kết nối với một thiết bị đầu cuối và
Hello, world!
được hiển thị trên màn hình. - Đầu ra tiêu chuẩn kết nối với một tệp và
Hello, world!
được ghi vào tệp.
Bạn có thể chọn chi tiết về lỗi được tính là lỗi đầu ra, miễn là nó phù hợp với các quy tắc trên.
- Đầu ra tiêu chuẩn không tồn tại (nghĩa
Chương trình / chức năng của bạn không bị sập khi gặp bất kỳ tình huống lỗi nào được liệt kê ở trên. Tùy thuộc vào bạn thoát mã nào bạn sử dụng.
Chương trình / chức năng của bạn không được mô tả bản chất của lỗi gặp phải trên luồng lỗi tiêu chuẩn; nó chỉ nên in chuỗi được chỉ định ở trên. Đầu ra không liên quan đến lỗi tiêu chuẩn (ví dụ cảnh báo trình biên dịch) chỉ hợp pháp nếu nó được tạo ra vô điều kiện, bất kể có gặp phải lỗi hay không.
Chương trình của bạn chỉ cần hoạt động trên một hệ điều hành (mặc dù nó phải là một lỗi mà các lỗi được liệt kê ở trên có ý nghĩa; Tôi đã cố gắng giữ chúng đủ chung để hoạt động trên hầu hết các hệ điều hành đa nhiệm của người tiêu dùng, nhưng các hệ điều hành kỳ lạ có thể loại trừ khỏi thử thách này). Nếu chương trình của bạn không thể truy cập được, hãy liệt kê các giả định mà nó cần để chạy trong tiêu đề của bài đăng của bạn.
Nhiệm vụ này có thể không thực hiện được ở mọi ngôn ngữ (không phải mọi ngôn ngữ đều cho phép chương trình xử lý các lỗi đầu ra theo cách tùy chỉnh). Bạn sẽ phải chọn một ngôn ngữ có thể.
Hãy chắc chắn rằng chương trình / chức năng của bạn hoạt động! Đừng chỉ tin vào tài liệu của các chức năng thư viện để làm những gì họ nói. Việc xử lý lỗi của các hàm đầu ra đơn giản thường bị hỏng trong thực tế, ngay cả khi các hàm yêu cầu xử lý lỗi trong lý thuyết.
Các trường hợp thử nghiệm
Đây là một cách để mô phỏng từng điều kiện lỗi ở trên bằng cách sử dụng bash
trên Linux (bạn không phải sử dụng Linux, nhưng đây có thể là hệ thống dễ nhất để kiểm tra điều này):
your_program_here >&- # nonexistent stdout
your_program_here > /dev/full # out of disk space
mkfifo test # note: change "test" to a filename that isn't in use
true < test &
your_program_here > test # connecting to a program that doesn't want input
rm test # clean up the FIFO we used earlier
Hai testcase đầu tiên là xác định. Cái cuối cùng không (nó phụ thuộc vào điều kiện cuộc đua); cho mục đích thử nghiệm, tôi khuyên bạn nên thêm độ trễ giữa lúc bắt đầu chương trình và đầu ra thực tế vào đầu ra tiêu chuẩn, để đảm bảo rằng điều kiện cuộc đua được giải quyết theo cách phơi bày lỗi.
Điều kiện chiến thắng
Đây là một thử thách mã golf , vì vậy ngắn hơn là tốt hơn. Như (gần như) luôn luôn, chúng tôi đang đo chiều dài của chương trình theo byte.
sleep 1 < test; (sleep 2; your_program_here) > test
?