Одна из наиболее распространенных стандартных задач (особенно при демонстрации эзотерических языков программирования) - реализовать «программу cat» : прочитать весь STDIN и распечатать его в STDOUT. Хотя он назван в честь утилиты оболочки Unix, cat
он, конечно, намного менее мощный, чем реальная вещь, которая обычно используется для печати (и объединения) нескольких файлов, считанных с диска.
задача
Вы должны написать полную программу, которая считывает содержимое стандартного входного потока и записывает их дословно в стандартный выходной поток. Если и только если ваш язык не поддерживает стандартные потоки ввода и / или вывода (как это понимается в большинстве языков), вы можете вместо этого использовать эти термины для обозначения их ближайшего эквивалента на вашем языке (например, JavaScript prompt
и alert
). Это единственные допустимые формы ввода / вывода, поскольку любой другой интерфейс в значительной степени изменит характер задачи и сделает ответы гораздо менее сопоставимыми.
Вывод должен содержать именно вход и ничего больше . Единственным исключением из этого правила является постоянный вывод интерпретатора вашего языка, который не может быть подавлен, например приветствие, цветовые коды ANSI или отступы. Это также относится к трейлингу новых строк. Если входные данные не содержат завершающий символ новой строки, выходные данные также не должны включать его! (Единственное исключение - если ваш язык абсолютно всегда печатает завершающий символ новой строки после выполнения.)
Вывод в стандартный поток ошибок игнорируется, если стандартный поток вывода содержит ожидаемый вывод. В частности, это означает, что ваша программа может завершиться с ошибкой при достижении конца потока (EOF), при условии, что это не загрязняет стандартный поток вывода. Если вы сделаете это, я призываю вас добавить безошибочную версию в ваш ответ (для справки).
Поскольку это задание является вызовом для каждого языка, а не между языками, существует несколько правил для каждого языка:
- Если на вашем языке вообще возможно отличить нулевые байты в стандартном входном потоке от EOF, ваша программа должна поддерживать нулевые байты, как и любые другие байты (то есть они также должны быть записаны в стандартный выходной поток).
- Если на вашем языке вообще возможно поддерживать произвольный бесконечный поток ввода (т. Е. Если вы можете начать печатать байты на выходе до того, как нажмете EOF на входе), ваша программа должна работать правильно в этом случае. В качестве примера
yes | tr -d \\n | ./my_cat
следует вывести бесконечный потокy
s. Вам решать, как часто вы печатаете и очищаете стандартный поток вывода, но это должно гарантированно произойти через определенное время, независимо от потока (это означает, в частности, что вы не можете ждать определенного символа, такого как перевод строки перед печатью).
Пожалуйста, добавьте примечание к своему ответу о точном поведении относительно нулевых байтов, бесконечных потоков и посторонних выводов.
Дополнительные правила
Речь идет не о поиске языка с кратчайшим решением для этого (есть такие, где пустая программа делает свое дело) - речь идет о поиске кратчайшего решения в каждом языке. Поэтому ни один ответ не будет помечен как принятый.
Материалы на большинстве языков будут оцениваться в байтах в соответствующей существующей кодировке, обычно (но не обязательно) UTF-8.
Некоторые языки, такие как папки , немного сложнее оценить. Если вы сомневаетесь, пожалуйста, спросите на Meta .
Не стесняйтесь использовать язык (или языковую версию), даже если он более новый, чем этот вызов. Языки, специально написанные для предоставления 0-байтового ответа на этот вызов, являются честной игрой, но не особенно интересными.
Обратите внимание, что должен быть переводчик, чтобы представление можно было проверить. Разрешается (и даже поощряется) самостоятельно писать этот переводчик для ранее не реализованного языка.
Также обратите внимание , что языки действительно должны выполнять свои обычные критерии для языков программирования .
Если выбранный вами язык является тривиальным вариантом другого (потенциально более популярного) языка, у которого уже есть ответ (например, диалекты BASIC или SQL, оболочки Unix или тривиальные производные Brainfuck, такие как Headsecks или Unary), рассмотрите возможность добавления примечания к существующему ответу, который такое же или очень похожее решение также является самым коротким на другом языке.
Если они не были отменены ранее, применяются все стандартные правила игры в гольф , включая http://meta.codegolf.stackexchange.com/q/1061 .
В качестве примечания, пожалуйста, не понижайте скучные (но действительные) ответы на языках, где не так много в гольфе; они все еще полезны для этого вопроса, так как он пытается собрать каталог настолько полно, насколько это возможно. Тем не менее, делайте в первую очередь upvote ответы на языках, где автор фактически должен был приложить усилия для игры в гольф.
Каталог
Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## 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