Một trong những nhiệm vụ tiêu chuẩn phổ biến nhất (đặc biệt là khi hiển thị các ngôn ngữ lập trình bí truyền) là thực hiện một "chương trình mèo" : đọc tất cả STDIN và in nó sang STDOUT. Mặc dù cái này được đặt theo tên của tiện ích shell Unix, cat
nhưng dĩ nhiên nó không mạnh hơn nhiều so với thực tế, thường được sử dụng để in (và ghép) một số tệp được đọc từ đĩa.
Bài tập, nhiệm vụ
Bạn nên viết một chương trình đầy đủ để đọc nội dung của luồng đầu vào tiêu chuẩn và ghi nguyên văn chúng vào luồng đầu ra tiêu chuẩn. Nếu và chỉ khi ngôn ngữ của bạn không hỗ trợ các luồng đầu vào và / hoặc đầu ra tiêu chuẩn (như được hiểu trong hầu hết các ngôn ngữ), thay vào đó, bạn có thể sử dụng các thuật ngữ này để có nghĩa tương đương gần nhất với ngôn ngữ của bạn (ví dụ: JavaScript prompt
và alert
). Đây là các hình thức I / O được chấp nhận duy nhất , vì bất kỳ giao diện nào khác sẽ thay đổi phần lớn bản chất của nhiệm vụ và làm cho câu trả lời ít so sánh hơn.
Đầu ra phải chứa chính xác đầu vào và không có gì khác . Ngoại lệ duy nhất cho quy tắc này là đầu ra liên tục của trình thông dịch ngôn ngữ của bạn không thể bị loại bỏ, chẳng hạn như lời chào, mã màu ANSI hoặc thụt lề. Điều này cũng áp dụng cho dòng mới. Nếu đầu vào không chứa một dòng mới, đầu ra không nên bao gồm một đầu vào! (Ngoại lệ duy nhất là nếu ngôn ngữ của bạn hoàn toàn luôn in một dòng mới sau khi thực hiện.)
Đầu ra cho luồng lỗi tiêu chuẩn bị bỏ qua, miễn là luồng đầu ra tiêu chuẩn chứa đầu ra dự kiến. Cụ thể, điều này có nghĩa là chương trình của bạn có thể chấm dứt với một lỗi khi nhấn vào cuối luồng (EOF), với điều kiện là không gây ô nhiễm luồng đầu ra tiêu chuẩn. Nếu bạn làm điều này, tôi khuyến khích bạn thêm một phiên bản không có lỗi vào câu trả lời của bạn (để tham khảo).
Vì đây là một thách thức trong mỗi ngôn ngữ chứ không phải giữa các ngôn ngữ, nên có một vài quy tắc cụ thể về ngôn ngữ:
- Nếu ngôn ngữ của bạn hoàn toàn có thể phân biệt byte rỗng trong luồng đầu vào tiêu chuẩn với EOF, thì chương trình của bạn phải hỗ trợ byte rỗng giống như bất kỳ byte nào khác (nghĩa là chúng cũng phải được ghi vào luồng đầu ra tiêu chuẩn).
- Nếu ngôn ngữ của bạn hoàn toàn có thể hỗ trợ luồng đầu vào vô hạn tùy ý (nghĩa là nếu bạn có thể bắt đầu in byte cho đầu ra trước khi bạn nhấn EOF trong đầu vào), chương trình của bạn phải hoạt động chính xác trong trường hợp này. Như một ví dụ
yes | tr -d \\n | ./my_cat
nên in một dòng vô hạn củay
s. Tùy thuộc vào tần suất bạn in và tuôn ra luồng đầu ra tiêu chuẩn, nhưng nó phải được đảm bảo xảy ra sau một khoảng thời gian hữu hạn, bất kể luồng đó là gì, đặc biệt là, bạn không thể đợi một ký tự cụ thể như một linefeed trước khi in).
Vui lòng thêm một ghi chú vào câu trả lời của bạn về hành vi chính xác liên quan đến null-byte, luồng vô hạn và đầu ra không liên quan.
Quy tắc bổ sung
Đây không phải là tìm ngôn ngữ với giải pháp ngắn nhất cho việc này (có một số nơi mà chương trình trống thực hiện thủ thuật) - đây là về việc tìm giải pháp ngắn nhất trong mọi ngôn ngữ. Do đó, không có câu trả lời sẽ được đánh dấu là chấp nhận.
Đệ trình trong hầu hết các ngôn ngữ sẽ được ghi bằng byte theo mã hóa có sẵn từ trước, thường (nhưng không nhất thiết) UTF-8.
Một số ngôn ngữ, như Thư mục , có một chút khó khăn để ghi điểm. Nếu nghi ngờ, xin vui lòng hỏi về Meta .
Hãy sử dụng một ngôn ngữ (hoặc phiên bản ngôn ngữ) ngay cả khi nó mới hơn thử thách này. Các ngôn ngữ được viết cụ thể để gửi câu trả lời 0 byte cho thử thách này là trò chơi công bằng nhưng không đặc biệt thú vị.
Lưu ý rằng phải có một thông dịch viên để trình có thể được kiểm tra. Được phép (và thậm chí được khuyến khích) tự viết trình thông dịch này cho một ngôn ngữ chưa được thực hiện trước đó.
Cũng lưu ý rằng ngôn ngữ làm phải thực hiện đầy đủ các tiêu chí thông thường của chúng tôi cho các ngôn ngữ lập trình .
Nếu ngôn ngữ bạn chọn là một biến thể tầm thường của ngôn ngữ khác (có khả năng phổ biến hơn) đã có câu trả lời (nghĩ phương ngữ BASIC hoặc SQL, shell Unix hoặc dẫn xuất Brainfuck tầm thường như Headsecks hoặc Unary), hãy xem xét thêm ghi chú vào câu trả lời hiện có cùng một hoặc một giải pháp rất giống nhau cũng là ngắn nhất trong ngôn ngữ khác.
Trừ khi chúng được ghi đè trước đó, tất cả các quy tắc golf-mã tiêu chuẩn sẽ được áp dụng, bao gồm http://meta.codegolf.stackexchange.com/q/1061 .
Là một lưu ý phụ, xin vui lòng không downvote câu trả lời nhàm chán (nhưng hợp lệ) trong các ngôn ngữ không có nhiều để chơi golf; những câu hỏi này vẫn hữu ích cho câu hỏi này vì nó cố gắng biên dịch một danh mục đầy đủ nhất có thể. Tuy nhiên, chủ yếu thực hiện các câu trả lời trong các ngôn ngữ mà tác giả thực sự phải nỗ lực để đánh gôn.
Mục lục
Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.
Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:
## Language Name, N bytes
nơi N
là kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:
## Perl, 43 + 2 (-p flag) = 45 bytes
Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
sh
câu trả lời sử dụng cat
cũng chứa một giải pháp ngắn hơn bằng cách sử dụng dd
.)
cat