# Default for Code Golf: Input/Output methods

It looks like we have a consensus that we want certain defaults for the format which answers are expected in for . On that poll, the question arose twice, which input/output formats should be allowed for programs and functions.

So here is another poll. This one works different though. All the input/output methods are independent of each other, so there will be one answer per method. Upvote all you think are reasonable for the default. Downvote those which you think shouldn't be allowed unless the OP explicitly permits them.

To keep this remotely manageable, I have not posted individual answers for all possible inputs for functions. So there are only four: functions can take input/output via their arguments and return values. Or functions can use any method full programs can. I don't think there is any point in (say) allowing programs to take input from STDIN (only) and to allow functions to take input from ARGV (only) or something like that. If you disagree, please leave a comment.

Note: Some votes have been reverted because they were detected as serial voting. If you vote on multiple answers, please leave some time between votes.

A method is allowed if it has 5 net votes and at least twice as many upvotes as downvotes.

### Update

The current results of the polls are now part of the tag wiki. Please notify me, if results change significantly and the wiki should be amended.

• Related (Can numeric input/output be in the form of byte values) Dec 13 '16 at 16:10
• "The current results of the polls are now part of the tag wiki" which tag wiki? meta wiki has nothing for code-golf tag. ppcg wiki has codegolf.stackexchange.com/tags/code-golf/info but it's missing a lot of answers here. Jul 18 '18 at 18:17

# Functions may get input from predefined variables in languages where this is standard

In some BASIC dialects, the standard way to implement functions is to use GOSUB (similar to CALL in assembly). You can't pass variables to GOSUB, so function arguments/returns are just global variables. If you need a function that takes a number as input, and outputs that number multiplied by 2, the normal way to do this would be something like:

@TIMES2
OUT=IN*2
RETURN


To call it, you would do

IN=7
GOSUB @TIMES2
'result is in variable OUT


The exact same process is allowed in assembly languages.

• I don't think it's necessary to allow things that are "Kind of like functions" just because a language doesn't have functions. As long as an answer can be written as a full program using existing allowed I/O I don't think we need a special exception to allow answers in "function-like behavior". Oct 27 '17 at 19:26
• Then why do we allow the same thing in "assembly" languages? Oct 27 '17 at 19:53
• Answers talking about "Assembly" refer to any language which does not have an output other than storing things in a special register. If a program can be written in the language which inputs and outputs in a more standard way then it doesn't need those allowances. Oct 27 '17 at 20:07
• Registers in assembly language are analogous to local vars and temporaries (like a return-value object) in languages like C. Languages that don't have locals or return-values don't have anything like registers. I didn't downvote, though; if the language has a gosub and real-world (non-golf) usage does write "functions" this way, there's certainly an argument to be made. The justification by analogy with asm is pretty weak, though. In asm you need registers just to evaluate expressions, and there are only a small fixed number of them. Oct 8 '19 at 18:17

# Languages that cannot obtain world-state-sensitive information can accept the information as an additional input

Some challenges may require the use of the current time, cryptographic random values, or other information present on the system used to run the program. Additionally, many languages (for various reasons) lack the ability to access this information, and thus compete at all.

To overcome this, answers may accept such information as additional input in a minimally processed format (eg: unix timestamp instead of a date string, a single random value instead of a random generator function).

• Well, cryptographic random values can still be generated in Turing tarpits. Dec 5 '17 at 18:29
• @StephenLeppik I was thinking more of completely deterministic languages where you would need the random seed for any subsequent random values. Dec 5 '17 at 18:49
• I don't like this idea (it's related to this meta. Accessing system information can require quite some bytes (maybe an import and/or system calls with long function names). Taking just another input variable instead is an unfair advantage. We always had challenges which cannot be solved with all languages (e.g. graphical output), but most can, so it's not a problem.
– nimi
Dec 6 '17 at 23:03
• @nimi This isn't for those languages that can access system information/resources only in an expensive manner. This proposal is for languages (like brainfuck) that have no way to access that information/those resources. Because BF has no source of randomness, this proposal would allow BF to take a seed value as an additional input to be fed into a PRNG.
– user45941
Dec 12 '17 at 6:19
• @Mego: yes, I know, maybe I wasn't clear enough. My point is: getting some system information via additional input is usually much cheaper (in bytes) than having to call some system library functions. Some languages would be allowed to use the former, others not, although both compete within the same challenge. That's unfair. ...
– nimi
Dec 12 '17 at 14:36
• @Mego: (cont.) Stupid example to illustrate the point: challenge: output the system time. Fictional stack based esolang #1: St (system call "time" + implicit print -> 2 bytes). Fictional stack based esolang #2: No systems calls available, therefore the time is expected as input on top of the stack + implicit print -> 0 bytes). #2 wins, because #1 has to use the system calls. Same example for non-esolangs: import Time;f=print(system_time()) vs. f(x)=print(x).
– nimi
Dec 12 '17 at 14:36
• @nimi That falls afoul of this loophole.
– user45941
Dec 12 '17 at 14:38
• @Mego: True for my mini example. However, the advantage for #2 remains even if the task is more complicated.
– nimi
Dec 12 '17 at 14:44

# Functions may return multiple values, even if the question only asks for one.

As long as one of them is the requested output, the function is considered valid.

• This would definitely cause problems for decision problem challenges if you could just return [True, False] no matter the input.
– xnor
May 13 at 11:00
• Suggest editing this to “as long as a specified one of them is the requested output”. Jun 9 at 2:56
• Anders Kaseorg's suggestion makes a lot of sense - it allows people to output extraneous information without cheating on questions.
– user
Jun 25 at 20:16

# Programs running under Unix may produce output by overwriting their command-line arguments, which changes what ps reports.

I'm posting this because it was brought up as a loophole in my answer to this question. I personally think it should not be allowed, because it's obscure, not available in all languages, and ephemeral (someone has to run ps while the program is still executing).

• this seems to be a special case of "functions may use out parameters" Dec 22 '16 at 10:55
• but ps doesn't report it after the program ends :( Dec 22 '16 at 11:01

# Dynamic creation of a "fake" STDIN, when one isn't present (creating also a separation between the code and the input).

For example, Javascript doesn't have STDIN(for obvious reasons).

One could make something like function(a){[code here]} and only count the content inside it + 1.

On php, one can read from STDIN using \$f=fread(STDIN,1024); and this would count only as 2 chars.

On other languages, this would vary a bit.

• Isn't the PHP example actually reading from STDIN? In which case, why shouldn't all of those bytes count? Nov 3 '14 at 0:09
• Depending on the way you handle it, if you read everything on STDIN at once, you can consider it a single input. I don't know if I'm making myself clear. But if your code is restricted to only 1 read to the STDIN, you can only consider the size in bytes of the name of the var. If multiple accesses are made (loops, conditions, partial reads...), everything is counted on the code. Nov 3 '14 at 0:14
• @MartinBüttner He's referring to the fact that different languages have different character counts for an STDIN read. Also, shouldn't this be CW? Nov 4 '14 at 23:42
• @TheDoctor Doesn't matter anyway - no rep gain/loss for meta.
– user10766
Nov 6 '14 at 21:44

# Output is saved in a certain variable at the time the program has finished execution

This eliminates the disadvantages languages like Java have when printing System.out.println("asdf")

For languages without variables this could be top of the stack etc...

• This essentially makes the submission a snippet instead of a full program, which the other meta question decided should not be a valid default. Sep 11 '15 at 18:25
• @MartinBüttner Unless the programming language is, of course, a turing machine. (I do vote for placing the tape head at the return value)
– yyny
Jan 31 '16 at 0:41
• In C#, a lambda is more a variable than a function. Lambdas are build on top of Delegates. Are they still valid? (By this, i think so) Jul 6 '16 at 20:32
• In what way is this fundamentally different from the same rule about functions? Why is it allowed for functions and not for full programs? May 5 at 15:04

# Programs may take input by assuming it is stored in predefined variables.

• -1 (Can't vote) Mar 17 '16 at 21:43
• This just skips the "reading" step of a program. I don't think programs should be allowed to assume the output of an arbitrary computation, e.g. the one asked for in the question, is stored in a predefined variable either. Jun 6 '16 at 18:11
• @djechlin we are intentionally separating input/output methods. Outputting on variables is listed here: meta.codegolf.stackexchange.com/a/6965/20198 Jun 6 '16 at 18:14
• Okay, I still don't think you can skip the "reading" step of a program any more than you can skip the "writing" step of a program. That's all I'm trying to say. Jun 6 '16 at 18:15
• I'm confused what you are talking about. Programs have input and output. We define valid input methods (such as reading from a file, or parameters to a function), and valid output methods (writing to a file, or return values). This post is directly targeted at input methods. There is another answer on this question targeted at output methods. We split them so people can vote separately. Jun 6 '16 at 18:18
• This is most relevant to the Sinclair ZX80 and ZX81 BASIC. Apr 4 '17 at 9:04