Одне з найпоширеніших стандартних завдань (особливо при демонстрації езотеричних мов програмування) - реалізувати "котячу програму" : прочитайте всі STDIN та роздрукуйте її до STDOUT. Хоча ця назва іменована утилітою оболонки Unix, cat
вона, звичайно, набагато менш потужна, ніж реальна річ, яка зазвичай використовується для друку (і об'єднання) декількох файлів, прочитаних з диска.
Завдання
Вам слід написати повну програму, яка читає вміст стандартного вхідного потоку і записує їх дослівно до стандартного вихідного потоку. Якщо і тільки якщо ваша мова не підтримує стандартні потоки введення та / або виведення (як це розуміється на більшості мов), ви можете замість цього прийняти ці терміни для позначення їх найближчого еквівалента у вашій мові (наприклад, JavaScript prompt
та alert
). Це єдині допустимі форми вводу / виводу, оскільки будь-який інший інтерфейс значною мірою змінить характер завдання та зробить відповіді набагато менш порівняльними.
Вихід повинен містити саме вхід і більше нічого . Єдиним винятком із цього правила є постійний вихід перекладача вашої мови, який неможливо придушити, наприклад привітання, кольорові коди ANSI або відступ. Це стосується і останніх рядків. Якщо вхід не містить зворотного нового рядка, вихід також не повинен містити його! (Єдиним винятком є те, якщо ваша мова абсолютно завжди друкує останній рядок після виконання.)
Вихід у стандартний потік помилок ігнорується, доки стандартний вихідний потік містить очікуваний вихід. Зокрема, це означає, що ваша програма може закінчитися помилкою при натисканні на кінець потоку (EOF), за умови, що не забруднює стандартний вихідний потік. Якщо ви це зробите, я рекомендую вам додати відповідь без помилок у відповідь (для довідки).
Оскільки це розроблено як виклик у кожній мові, а не між мовами, існує кілька правил, що відповідають мові:
- Якщо у вашій мові взагалі можливо відрізнити нульові байти у стандартному потоці введення від EOF, ваша програма повинна підтримувати нульові байти, як і будь-які інші байти (тобто вони також повинні бути записані в стандартний вихідний потік).
- Якщо у вашій мові взагалі можливо підтримувати довільний нескінченний потік введення (тобто якщо ви можете розпочати друк байтів до виводу, перш ніж натиснути на EOF на вході), програма повинна в цьому випадку правильно працювати. Як приклад
yes | tr -d \\n | ./my_cat
слід надрукувати нескінченний потікy
s. Від вас залежить, як часто ви друкуєте та обмітаєте стандартний вихідний потік, але це повинно бути гарантовано, що це відбудеться через обмежений час, незалежно від потоку (зокрема, це означає, що ви не можете чекати конкретного символу, наприклад подача ліній перед друком).
Будь ласка, додайте примітку до вашої відповіді про точну поведінку щодо нульових байтів, нескінченних потоків та стороннього виводу.
Додаткові правила
Йдеться не про пошук мови з найкоротшим рішенням для цього (є деякі, де порожня програма виконує трюк) - це про пошук найкоротшого рішення на кожній мові. Тому жодна відповідь не буде позначена як прийнята.
Подання на більшості мов будуть оцінюватися в байтах у відповідному попередньому кодуванні, як правило (але не обов'язково) UTF-8.
Деякі мови, як-от папки , досить складно оцінити. Якщо ви сумніваєтесь, будь ласка, запитайте про Meta .
Не соромтеся використовувати мову (або мовну версію), навіть якщо вона новіша, ніж ця проблема. Мови, спеціально написані для подання 0-байтової відповіді на це завдання, є чесною грою, але не особливо цікавою.
Зауважте, що повинен бути перекладач, щоб подати заявку можна перевірити. Дозволяється (і навіть заохочується) писати цього перекладача самостійно для раніше не виконаної мови.
Також зверніть увагу , що мови дійсно повинні виконувати свої звичайні критерії для мов програмування .
Якщо ваша обрана мова є тривіальним варіантом іншої (потенційно більш популярної) мови, на яку вже є відповідь (подумайте, основні або діалекти SQL, оболонки Unix або тривіальні похідні Brainfuck, як Headsecks або Unary), подумайте про додавання примітки до існуючої відповіді, що те саме або дуже схоже рішення є найкоротшим в іншій мові.
Якщо вони не були відмінені раніше, застосовуються всі стандартні правила коду-гольфу , включаючи http://meta.codegolf.stackexchange.com/q/1061 .
В якості побічної записки, будь ласка, не зволікайте нудних (але дійсних) відповідей мовами, де для гольфу не так багато; вони все ще корисні для цього питання, оскільки він намагається скласти каталог максимально повно. Однак, перш за все, надсилайте відповіді мовами, де автору доводилося докладати зусиль, щоб розібратися в коді.
Каталог
Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.
Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:
## Language Name, N bytes
де N
розмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:
## Perl, 43 + 2 (-p flag) = 45 bytes
Ви також можете зробити ім'я мови посиланням, яке з’явиться у фрагменті:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
sh
відповідь, cat
яка також використовує коротше рішення з використанням dd
.)
cat