84
\$\begingroup\$

One of the most common standard tasks (especially when showcasing esoteric programming languages) is to implement a "cat program": read all of STDIN and print it to STDOUT. While this is named after the Unix shell utility cat it is of course much less powerful than the real thing, which is normally used to print (and concatenate) several files read from disc.

Task

You should write a full program which reads the contents of the standard input stream and writes them verbatim to the standard output stream. If and only if your language does not support standard input and/or output streams (as understood in most languages), you may instead take these terms to mean their closest equivalent in your language (e.g. JavaScript's prompt and alert). These are the only admissible forms of I/O, as any other interface would largely change the nature of the task and make answers much less comparable.

The output should contain exactly the input and nothing else. The only exception to this rule is constant output of your language's interpreter that cannot be suppressed, such as a greeting, ANSI color codes or indentation. This also applies to trailing newlines. If the input does not contain a trailing newline, the output shouldn't include one either! (The only exception being if your language absolutely always prints a trailing newline after execution.)

Output to the standard error stream is ignored, so long as the standard output stream contains the expected output. In particular, this means your program can terminate with an error upon hitting the end of the stream (EOF), provided that doesn't pollute the standard output stream. If you do this, I encourage you to add an error-free version to your answer as well (for reference).

As this is intended as a challenge within each language and not between languages, there are a few language specific rules:

  • If it is at all possible in your language to distinguish null bytes in the standard input stream from the EOF, your program must support null bytes like any other bytes (that is, they have to be written to the standard output stream as well).
  • If it is at all possible in your language to support an arbitrary infinite input stream (i.e. if you can start printing bytes to the output before you hit EOF in the input), your program has to work correctly in this case. As an example yes | tr -d \\n | ./my_cat should print an infinite stream of ys. It is up to you how often you print and flush the standard output stream, but it must be guaranteed to happen after a finite amount of time, regardless of the stream (this means, in particular, that you cannot wait for a specific character like a linefeed before printing).

Please add a note to your answer about the exact behaviour regarding null-bytes, infinite streams, and extraneous output.

Additional rules

  • This is not about finding the language with the shortest solution for this (there are some where the empty program does the trick) - this is about finding the shortest solution in every language. Therefore, no answer will be marked as accepted.

  • Submissions in most languages will be scored in bytes in an appropriate preexisting encoding, usually (but not necessarily) UTF-8.

    Some languages, like Folders, are a bit tricky to score. If in doubt, please ask on Meta.

  • Feel free to use a language (or language version) even if it's newer than this challenge. Languages specifically written to submit a 0-byte answer to this challenge are fair game but not particularly interesting.

    Note that there must be an interpreter so the submission can be tested. It is allowed (and even encouraged) to write this interpreter yourself for a previously unimplemented language.

    Also note that languages do have to fulfil our usual criteria for programming languages.

  • If your language of choice is a trivial variant of another (potentially more popular) language which already has an answer (think BASIC or SQL dialects, Unix shells or trivial Brainfuck derivatives like Headsecks or Unary), consider adding a note to the existing answer that the same or a very similar solution is also the shortest in the other language.

  • Unless they have been overruled earlier, all standard rules apply, including the http://meta.codegolf.stackexchange.com/q/1061.

As a side note, please don't downvote boring (but valid) answers in languages where there is not much to golf; these are still useful to this question as it tries to compile a catalogue as complete as possible. However, do primarily upvote answers in languages where the author actually had to put effort into golfing the code.

Catalogue

The Stack Snippet at the bottom of this post generates the catalogue from the answers a) as a list of shortest solution per language and b) as an overall leaderboard.

To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:

## Language Name, N bytes

where N is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:

## Ruby, <s>104</s> <s>101</s> 96 bytes

If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:

## Perl, 43 + 2 (-p flag) = 45 bytes

You can also make the language name a link which will then show up in the snippet:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 62230; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 8478; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "//api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "//api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(42), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>

\$\endgroup\$
  • 52
    \$\begingroup\$ Bash, 3 bytes: cat \$\endgroup\$ – TheDoctor Oct 31 '15 at 19:02
  • 3
    \$\begingroup\$ @TheDoctor I guess this would fall into the "don't use a builtin which does exactly what is needed" rule. \$\endgroup\$ – Paŭlo Ebermann Oct 31 '15 at 19:46
  • 5
    \$\begingroup\$ @PaŭloEbermann There is no such rule, and the corresponding standard loophole is no longer accepted. (In fact, there is already a sh answer using cat which also contains a shorter solution using dd.) \$\endgroup\$ – Martin Ender Oct 31 '15 at 20:25
  • 1
    \$\begingroup\$ If only it used standard methods of input and output: ///, 0 bytes. \$\endgroup\$ – Comrade SparklePony Mar 31 '17 at 19:33
  • 1
    \$\begingroup\$ @SparklePony Except, you'd have to escape slashes and backslashes. \$\endgroup\$ – Martin Ender Mar 31 '17 at 20:35

264 Answers 264

2
\$\begingroup\$

Perl, 13 or 14 bytes, depending on whether -e counts

perl -pe'BEGIN{$/=\1}'

Although perl's -p switch normally reads a line at a time, and thus would require the input data either be finite, or have newlines in it, we can change the input record separator $/.

If $/ is reference to a number, it causes perl to read fixed length records.

This has to happen inside a BEGIN block, or else at least one newline would be required in the input.

\$\endgroup\$
2
\$\begingroup\$

Javascript, 25 23 22 bytes

for(;;)alert(prompt())

Edit: Thanks to stefnotch for saving 2 3 bytes

\$\endgroup\$
  • \$\begingroup\$ You could golf it like this: for(;;alert(prompt())); Here is a link that might help: codegolf.stackexchange.com/questions/2682/… \$\endgroup\$ – Stefnotch Oct 30 '15 at 19:17
  • \$\begingroup\$ Just realized that you could have the function outside the loop, saving yet another byte for(;;)alert(prompt()) \$\endgroup\$ – Stefnotch Feb 12 '17 at 18:08
2
\$\begingroup\$

Lean Mean Bean Machine, 7 bytes

O
i
!
~

Marble spawns at O, i reads single character from STDIN to the marble's value, ! print's the marble's value as a Unicode character, ~ teleports the marble back up to the top.

\$\endgroup\$
2
\$\begingroup\$

Evil, 4 bytes

mrwb

This language can only handle 1 character of input at a time.

m: Serves as a marking character for b.
r: Reads a single character from stdin and stores it in the accumulator.
w: Writes the value of the accumulator to stdout.
b: Searches backwards for m and continues execution from there.

(My) interpreter in C++ here: https://github.com/xprogram/esolot/tree/master/lang/evil

Original interpreter in Java here: http://web.archive.org/web/20070906133127/http://www1.pacific.edu/~twrensch/evil/evil.java

\$\endgroup\$
2
\$\begingroup\$

O, 7 bytes

1{io1}w

O is a new stack-based golfing language that aims to have as many 1-byte commands as possible. You can find O on GitHub.

1: pushes 1 for a truthy value.

{: begin code block (like ruby)

i: pushes input to stack

o: outputs top of stack

1: as above

}: ends code block

w: repeatedly does code block immediately before it while top of stack is truthy (pops top of stack)

\$\endgroup\$
  • \$\begingroup\$ "aims to have as many 1-byte commands as possible"... so, it's Pyth or APL or CJam? \$\endgroup\$ – Sparr Nov 14 '15 at 8:35
  • \$\begingroup\$ @Sparr More like GS2 or Seriously. \$\endgroup\$ – Martin Ender Nov 14 '15 at 8:42
2
\$\begingroup\$

Samau, 0 bytes

An empty program in Samau is a cat program. It simply pushes the input onto the stack as a string, and prints the top of the stack.

Since Samau is written in Haskell, it can handle infinite streams.

\$\endgroup\$
2
\$\begingroup\$

Bash, 2 bytes

A less known(?) alternative to dd and cat itself:

m4

Try it online!

\$\endgroup\$
2
\$\begingroup\$

Malbolge, 9,502 bytes

Full code here.

Only included here for the sake of completeness, not my code. Here is the author's page.

\$\endgroup\$
2
\$\begingroup\$

Wumpus, 6 bytes

i=)
o%

Try it online!

Explanation

First, to understand the control flow, we'll need to look at the actual program grid. Wumpus uses a triangular grid, so characters are alternatingly placed in upward and downward triangles. Furthermore, as opposed to many other Fungeoids, Wumpus does not use a wrapping grid. Instead, the instruction pointer (IP) is reflected off the boundary of the grid. That leads to the following flow through the grid:

enter image description here

Hence, Wumpus simply loops through the entire code (going right to left on the second line), i.e.

i=)%o

A single loop iteration is simple enough:

i   Read one byte N from STDIN and push it to the stack. EOF gives -1.
=   Duplicate.
)   Increment. Gives 0 at EOF.
%   Compute N % (N+1). At EOF this ends the program due to the division by zero.
    Otherwise, this just results in N itself.
o   Print the byte to STDOUT.
\$\endgroup\$
  • \$\begingroup\$ How do you make these nice visualisations? \$\endgroup\$ – Jo King Feb 12 '18 at 4:59
  • 1
    \$\begingroup\$ @JoKing I'm just scripting them up by hand in Mathematica. \$\endgroup\$ – Martin Ender Feb 12 '18 at 9:10
2
\$\begingroup\$

Shakespeare Programming Language, 96 bytes

,.Ajax,.Page,.Act I:.Scene I:.[Exeunt][Enter Page and Ajax]Ajax:Open mind!Speak thy!Let usAct I!

Try it online!

Some nice and weird grammer. Terminates in an error.

Shakespeare Programming Language, 125 bytes

,.Ajax,.Page,.Act I:.Scene I:.[Exeunt][Enter Page and Ajax]Ajax:Open mind!Be you nicer a pig?If sospeak thy!If solet usAct I!

Try it online!

Non-erroring version. I especially liked constructing the sentence If solet usact I!

\$\endgroup\$
2
\$\begingroup\$

Grocery List, 14 bytes

*but it doesn't look like a grocery list

h

i
l
p
i
e
t

Explanation:

Title

i nput
l oop
p op and print
i nput
e nd loop if nonzero
t erminate
\$\endgroup\$
2
\$\begingroup\$

Cascade, 7 6 bytes

?.
;,^

Basically works by going in a loop outputting an input character until EOF is reached

I didn't realise the starting point wasn't required, -1 byte

Try it online!

\$\endgroup\$
  • \$\begingroup\$ This is actually the same as the example cat program I made. Nice work! \$\endgroup\$ – Jo King Sep 25 at 6:50
2
\$\begingroup\$

Gol><>, 2 bytes

credit to Jo King

io

Try it online!

Errors out on EOF. The error message goes to stderr.

How it works

io

i   Push an input char
 o  Pop and print; error if last input hit EOF
    Repeat indefinitely

Gol><>, 4 bytes

iE;o

Try it online!

No-error version.

How it works

iE;o

i     Push an input char
 E;   Halt on EOF
   o  Pop and print
      Repeat indefinitely
\$\endgroup\$
2
\$\begingroup\$

C, 17, 16 bytes

main(){tee(0,1);}

This only works on certain compilers (such as tutorialspoint which uses GCC), but it's really short.

main(){tee(1j);}

Edit: Now down to 16 bytes! j is a GNU suffix which acts as a complex
number. Basically tee(1j) == tee(0,1). This trick also only works in rare cases.

\$\endgroup\$
1
\$\begingroup\$

osascript, 14 bytes

on run a
a
end

Grabs all input from STDIN and returns it. This will not work for infinite input.

\$\endgroup\$
  • \$\begingroup\$ This prints a trailing newline - I'm not sure how to get rid of it, but I'll try a few things. \$\endgroup\$ – Addison Crump Oct 30 '15 at 16:45
1
\$\begingroup\$

AppleScript, 50 Bytes

(display dialog""default answer"")'s text returned

Opens a display dialog (equivalent to STDIN) and returns all the text input into the dialog pane out to the result pane. Will not support infinite input.

\$\endgroup\$
1
\$\begingroup\$

Ruby, 22 bytes

putc$_ while$_=$<.getc

Should handle null bytes and infinite streams.

\$\endgroup\$
1
\$\begingroup\$

Curry, 16 bytes

main=interact id

Curry is a Haskell look-alike, so it shouldn't be surprising that a cat program looks... well, exactly the same in it :) It's lazy just like Haskell, so it handles infinite streams fine.

\$\endgroup\$
1
\$\begingroup\$

Burlesque, 1 byte

Q

STDIN is pushed on the stack as a string. Q pretty-prints this string, which amounts to Burlesque not printing it "raw", i.e. surrounded by quotes. It's implicitly printed at the end of the program.

(I can't test it right now, but this might handle infinite streams? It's implemented in Haskell, so...)

\$\endgroup\$
  • \$\begingroup\$ It handles infinite streams as well, yes. You can work on infinite streams i.e. try cat /dev/urandom | base64 | blsq --stdin "2coQ" and it will work just fine. However, not all built-ins are lazy. For example trying to do 2couN wont work because \[ is not lazy. Mapping however will work i.e. 2co)<-Q works fine. Also doing 2cop^ nor 2co^p will work. \$\endgroup\$ – mroman Nov 13 '15 at 17:25
  • \$\begingroup\$ Additionally you need to know that some built-ins don't work natively on strings but Explode them and then Concat them back. That's why f[ won't work on infinite strings because f[ will do an auto-concat afterwards. So if you want to filter an infinite string you need to convert it to a block. For example XX:><2co)\[)rib2 works on infinite strings but if you don't do the XX it won't :). \$\endgroup\$ – mroman Nov 13 '15 at 17:30
  • \$\begingroup\$ I think the reason is that \[ falls back to r[ and r[ produces a single value out of a block and thus can't possibly work on infinite lists. \$\endgroup\$ – mroman Nov 13 '15 at 17:32
1
\$\begingroup\$

Frege, 16 bytes

main=interact id

Another Haskell-like, another totally equivalent cat program.

\$\endgroup\$
1
\$\begingroup\$

Pascal, 64 bytes

var c:Char;begin while not eof do begin read(c);write(c)end end.

Needless to say, Pascal is not the ideal golfing language.

\$\endgroup\$
1
\$\begingroup\$

Oberon, 109 bytes

MODULE m;IMPORT Files,Out,In;VAR c:CHAR;BEGIN WHILE~Files.Eof(Files.stdin)DO In.Char(c);Out.Char(c)END END m.

Ouch...

\$\endgroup\$
1
\$\begingroup\$

Java, 118 bytes

class A{public static void main(String[]a)throws Exception{org.apache.commons.io.IOUtils.copy(System.in,System.out);}}

(Uses apache commons IO; I'm not actually sure what the behavior is with null bytes and with infinite text).

\$\endgroup\$
1
\$\begingroup\$

Kipple, 5 Bytes

Calling the program:

java -jar Kipple.jar -i [input] cat.k

Stored in a file called cat.k - replace this with the filename.

Code:

(i>o)

As this is on the wiki page, I will be posting this as a community wiki.

\$\endgroup\$
1
\$\begingroup\$

Simplex v.0.7, 2 bytes

g is perhaps my favorite command. It is short for {sL}, {sp}, and Ts.

bg 
b  ~~ take input and write input to strip
 g ~~ output contents of strip
\$\endgroup\$
1
\$\begingroup\$

Lua, 31 characters

::a::io.write(io.read(1))goto a

Will crash on EOF, as io.read(1) returns nil, which is an invalid argument to io.write. This needs Lua's goto statement, which is new since version 5.2.

\$\endgroup\$
  • \$\begingroup\$ The default for io.read() is the file descriptor 1, you could save 1 Byte by writing ::a::io.write(io.read())goto a. \$\endgroup\$ – Katenkyo Mar 2 '16 at 15:29
1
\$\begingroup\$

C#, 83 bytes

using c=System.Console;class A{static void Main(){for(;;)c.Write((char)c.Read());}}

Seems to be shorter than using static, which another (faulty) answer here was using.

\$\endgroup\$
  • 1
    \$\begingroup\$ It should terminate on end of stream, right? \$\endgroup\$ – Zereges Oct 31 '15 at 22:58
1
\$\begingroup\$

F#, 74 bytes

type C=System.Console
[<EntryPoint>]let rec(!)x=C.Write(char(C.Read()));!x

Conceptually, this is similar to my C# and VB.NET answers. F# is strict about the type of main: it has to be precisely string[] -> int. The neat part is its name doesn't matter: whatever you mark as <EntryPoint> will be the program's main function. I saved a byte by calling it (!), a prefix operator, allowing me to write !x instead of m x or something.

\$\endgroup\$
1
\$\begingroup\$

Rust, 68 bytes

use std::io;fn main(){io::copy(&mut io::stdin(),&mut io::stdout());}

io::copy copies the entire contents of a reader into a writer. This function (I think) needs to borrow and mutate both stdin and stdout to do this, which is what &mut is about.

\$\endgroup\$
1
\$\begingroup\$

Julia, 35 bytes

while 0<1write(read(STDIN,Char))end

Similar to Alex's answer, but crashes at EOF. I think that's valid.

\$\endgroup\$
  • \$\begingroup\$ Nevermind then. \$\endgroup\$ – Dennis Oct 31 '15 at 3:56
  • 1
    \$\begingroup\$ Considering how similar it is to the other Julia answer, I probably would have left this as a comment instead. \$\endgroup\$ – Alex A. Oct 31 '15 at 5:57
  • \$\begingroup\$ I came up with almost this very answer (I had Int8 instead of Char, I'm not sure if mine would have worked for high bytes) before looking at yours -- but they were very similar when I compared them indeed! I think it's worth having both around though (a crashy one and a non-crashy one). \$\endgroup\$ – Lynn Oct 31 '15 at 10:51

Not the answer you're looking for? Browse other questions tagged or ask your own question.