# yes is 91 lines long

yes, from coreutils, is 91 lines long. Many of them are comments, but that is still WAY too long.

Edit from September 2019: the source file grew over the past five years and is now 126 lines long.

Write a program that imitates yes:

• outputting to stdout an infinite stream of "y\n"'s
• there must be an option to stop it other than killing the process with SIGKILL: but SIGINT and SIGPIPE are fine
• you are not allowed to use "y" or "\n" or their ASCII values (121, 0x79, 0171, 10, 0xA or 012)

Bonus:

• subtract 10 from your code length, if you can receive a phrase in stdin and print it out instead of "y" (but still including the line-break). The program doesn't have to print y on an empty input.
• "you are not allowed to use "y" or "\n"" -- should I read this as "You may not use y or \n inside of a string literal"? Dec 17 '14 at 14:28
• On a related note, GNU true.c is 80 lines long. Dec 17 '14 at 22:32
• @DennisWilliamson On a similarly related note, false.c is 2 lines long.... ;_; Dec 18 '14 at 2:30
• the coreutils yes takes an optional argument on the command line, not stdin. Dec 18 '14 at 20:05
• @MrLore: to pipe into other programs that might constantly ask for confirmation of the various things they are doing, so you dont have to sit there typing the ys yourself. Dec 20 '14 at 16:57

## Ws, 1-10 = -9 bytes

I


## Explanation

Flag: s % We have to read from STDIN :(
P      % Newline-print
a       % the STDIN input
I     % Forever


# W, 7 bytes

i12 1CE


## Explanation

i     E % Foreach from 1 to positive infinity:
% (Implicit print a newline on each iteration)
12 1    % Space does nothing. Basically just pushes 121.
C  % Convert to a character, rendering 'y'

• Never thought I'd see a negative score. Mar 30 '20 at 7:39
• @PkmnQ I'm going to make this score -9.
– user92069
Apr 1 '20 at 9:51
• Ties your other answer in Husk. Apr 2 '20 at 2:54
• @a'_' You're not allowed to use 12 1: "Not in a literal, not as a constant, not as a variable name. Nothing." Apr 4 '20 at 2:31

## Zsh + POSIX utilities, 22 bytes

f()(tr 01 x-z<<<1;f);f


Thanks to pxeger for the shorter way to print y.

Try it online!

## Pure zsh, 24 bytes

f()(<<<$SPROMPT[29];f);f  Try it online! ### Bonus: mandatory phrase from stdin — 21 - 10 bytes read a;f()(<<<$a;f);f


Try it online!

• Shorter way to print y: tr 01 x-z<<<1 Nov 18 '21 at 8:12

Apparently this isn't totally portable. My sys.version is 2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2], so if yours is different this might not work I guess.

# Python 2 - (76-10)=66

import sys
s=sys.stdin;a=help[1]if s.isatty()else s.read()
while 1:print a


Pretty long, but I wanted to go for the bonus (even though it cost more than 10 bytes). Checking if stdin is empty or not without prompting for input is long, apparently.

At first, I misread the bonus as taking an argument instead of stdin. I'm proud of my solution for that, so I'm posting it anyway ;)

# Python 2 - (52-10+∞)=∞ (invalid!)

import sys
while 1:print(sys.argv+[0])[1]orhelp[1]


sys.argv is a list where the zeroth element is the filename and every element afterwords is an argument given to the program. I add a falsey value to the end of the list; if there are no arguments, the first element is that falsey value, otherwise it's the first argument. a or b in Python returns the first value that confirms what the outcome will be: If a is truthy, we already know that the whole thing will be true, so it just gets returned. If it's false, b is returned (since False or b == b).

• @fry I could, but it would prompt the user. I wanted it to start spitting out y\n immediately if stdin was empty. Dec 17 '14 at 14:53
• @fry That's weird, it works for me. It might be dependant on cPython? I don't have any other ideas. Dec 17 '14 at 15:10
• good idea, on it Dec 17 '14 at 15:17
• r=raw_input();p=r if r elsehelp[1]\nwhile 1:print p 52 characters Dec 18 '14 at 6:07
• Hmm, already the first line seems to have an y in it, the second one too. Dec 18 '14 at 12:51

# Windows Batch: 24 bytes

A yes.bat file with this content will work on most Windows XP and later systems with default settings:

@echo %COMSPEC:~12,1%&%0


Else this slightly larger yes.bat file (34 bytes) will work in all cases:

@set "T=%~n0"
@echo %T:~0,1%
@%0


Can be made down to 13 bytes if the file is called y.bat instead of yes.bat, but I feel that's cheating:

@echo %~n0&%0


# C89, 31 37 chars

main(){for(;;)printf("%c\n",'z'-1);}


Built on the idea of @LordAro, without filename requirements.

## Fortran, 28

do1;1 print'(A1)',11**2;end


Compile with gfortran -ffree-form.

# linux (Ba)sh, 13 to 26 (23 to 36 chars) (repeats 'y' or the input, like yes)

create an executable (+x) file, named as you like (ex: my_yes), containing one of those possible contents:

echo ${*:-y};exec$0 $* #23 chars, score 13, but loses spaces, and will choke on many inputs  or echo "${@:-y}";exec $0 "$@"  #27 chars, score 17, but will choke on some inputs


or

printf "%s\n" "${@:-y}";exec$0 "$@" #36 chars, score 26, a tiny more robust, but "longer"  and then execute it with the arguments you want, it will repeat them ad-lib. (With no arguments, it repeats "y", as the yes command does too) $ chmod +x my_yes
$./my_yes y y y [ctrl-C]$ ./my_yes '  It looks ok!'
It looks ok!
It looks ok!
It looks ok!
It looks ok!
[ctrl-C]

• some inputs that can make it choke on the first 2 : first argument starting with a "-", for example. (and many others) Dec 18 '14 at 13:18
• I use "exec" to ensure I don't bring the computer down very quickly with recursive bash (which 'yes' doesn't do, usually ^^) Dec 18 '14 at 13:20

# CFML, 247 bytes

This is more a "just for the heck of it" answer, as it's obviously hideously long (CFML earns no points for terseness); and I just realized it can't actually be killed without restarting the service, although it will indeed stop printing to the browser on an ESC character.

<html><body><cfflush><cfif isDefined("URL.i")><cfscript>a=URL.i;if(a is ""){a=chr(asc("x")+1);}while(1){writeOutput("#a#<br>");getPageContext().getOut().flush();}</cfscript><cfelse><form action="a.cfm"><input name="i"/></form></cfif></body></html>


# C, 35 bytes

main(a,b){b='x'+1;for(;;)puts(&b);}


I don't know if this will compile correctly with all compilers on all platforms or not; if it doesn't work for you, let me know. I used several things here that I have never thought of using before. :)

# Node.js, 53 chars (63 if you count node -e "")

update:

• Reduced another 5 chars.
• Silly extra char removed.
• Reduced 2 chars, from 61 to 59.

The real yes does not uses stdin, but an argument, like:

yes n


Well, this answer works like that, it will print y\n over and over:

node -e "for(;;)console.log(process.argv[1]||34 .toString(36))"


And if you append an n after the line, it will print n\n instead:

node -e "for(;;)console.log(process.argv[1]||34 .toString(36))" n


No bonus, since I'm not using stdin.

# SmileBASIC, 19 bytes - 10 = 9

INPUT C$@L?C$GOTO@L


# QC 26 (26 - 10 = 16) bytes

(00600F014"0178)0101A01$14 The program requires an input on stdin because QC doesn't have a way to get arguments. Empty input just prints y. ### Explanation (00 read string into memory at address 00, address 00 is length, next bytes are the string itself 600F014 jump if values at 00 and F0, if not equal jump to address 14 "0178 Write 78(lowercase x) to address 01 )0101 increment value at address 01 by 01 which gives y A01 print string and newline from address 01 until 00 is reached$14 jump to address 14(print the next line)

• Wait, It's decremented by 10, so it becomes 16 bytes, making this the ultimate answer! Feb 12 '17 at 6:58

# Vitsy, 15 - 10 = 5 bytes

Because Vitsy waits for STDIN to be entered, I have made the bonus input come in as command line arguments.

zl)[bD*][:ZaOu]


Explanation:

z               Grab the entirety of the input stack and patch it on the current.
l)[   ]        If the stack has no members...
bD*         Push 11^2 to the stack (this is the ASCII value for 'y').
[     ] Loop infinitely.
:      Duplicate the current stack.
Z     Push the entire contents of the stack to output, top first.
aO   Push out a newline to the out.
u  Flatten the top two stacks.


# C(GCC) - 161 bytes

main(int argc,char**argv){if(argc>1){while(1){for(int i=0;i<argc-1;i++){printf("%s ",argv[i+1]);}puts("");}}else{char*c=malloc(1);c[0]='x'+1;while(1){puts(c);}}}


Uses malloc to allocate 1 byte and set its value 'x' + 1 If any input is provided as an argument(mulitple words work too) it will print it instead of y.

Ungolfed version:

main (int argc, char**argv) {
if (argc > 1) {
while (1) {
for (int i=0; i < argc - 1; i++) {
printf("%s ",argv[i+1]);
}
puts("");
}
} else {
char* c = malloc(1);
c[0] = 'x' + 1;
while(1) {
puts(c);
}
}
}


# Ohm, 17 - 10 = 7 bytes

IDö?.x1+;Ω
D,∞


Explanation:

IDö?.x1+;Ω  ■Main link
I           ■Input
Dö?    ;   ■If(!input){
.x1+    ■  Push 'x' and increment
■}

∞         ■while (true){
D,          ■  duplicate and print
■}


# ><>, 6 bytes

b:*oao


By not including a ; at the end, the ><> will keep on swimming until he's released by a SIGINT.

### Explanation

b:*oao
b         Push 11
:        Duplicate
*       Multiply top elements to get 121
o      Print as character
a     Push 10
o    Print as character (yielding '\n')
No program terminator, so our ><> will
keep on swimming this path forever.
^----'


# ><>, 17 - 10 = 7 bytes

The previous is quite a boring solution, so here's one that takes input from stdin. This abuses the fact that the default way of supplying input to a ><> program is echo 'input' | fish.py yes.fish, where echo provides the \n character.

 i:0)?!v
0r}o:r~<


### Explanation

 i:0)?!v     Load STDIN into the stack (reversed)

NOP           <----------,
i           Push a byte from STDIN   |
:          Duplicate top element    |
0         Push 0                   |
)?       If (i > 0):              |
!        Wrap around  ----------'
Else:
v       Move to the second part

0r}o:r~<     Print STDIN until halted

<     Go right         <---------------,
~      Remove top element (duplicated   |
-1 from EOF)                  |
r       Reverse stack                    |
:        Duplicate top element            |
o         Output as character              |
}          Rotate stack to right (go to     |
next character)               |
r           Reverse the stack                |
0            Push 0                           |
Wrap around       ---------------'


The 0r at the end allow sfor the loop to happen by wrapping around, where we still assume the stack to be reversed with a -1 on top.

# Perl 5 - (10-10) = 0 bytes

print;redo


Requires the -ne flags. Takes in a character(s) from STDIN, repeats the character(s) infinitely.

### Example execution

perl -ne 'print;redo'


### Explanation

This takes advantage of the -n flag in Perl, where it explicitly wraps while (<>) { ... } around the source code. The use of redo without an explicit label is also used. According to the documentation: If the LABEL is omitted, the command refers to the innermost enclosing loop.

# Husk, 1 - 10 = -9 bytes

The wonderful thing about Husk's laziness is that computations involving infinite lists can be managed and used to produce useful output, like in this case :)

∞


Try it online!

## Explanation

   Implicit argument
∞  Build an infinite list repeating forever
Implicit join by newlines


# Raku (raku -n) 9-10 = -1 bytes

.say;redo


Idea for redo from @booshlinux (I would have done: loop{.say})

# 05AB1E, -8 bytes

[,


Try it online!

[,  # full program
[   # forever...
,  # output...
# implicit input


# BRASCA, -3 bytes (7-10)

l,[:mo]


Try it online!

## Explanation

<implicit input>
l           - Push 10 (\n)
,          - Reverse stack
[   ]     - While non-zero:
:mo      - Duplicate, move the duplicate to bottom, output top of stack


# brainfuck, 60-10=50 bytes

+>>,[[>,]>+<]++++++++++>-[<[<+<++++++++++++>>-]]<[[<]>[.>]<]


Try it online!

Explanation:

+>> add one (120 to be adden on later yeilding 'y')
,[[>,]>+<]  if there is input, read it and set a flag to skip the next loop
++++++++++>-  '\n'
[
<[<+<++++++++++++>>-] add 10*120 to first cell, shift \n back one cell
]
<[[<]>[.>]<] print the input or 'y\n'

• Welcome to the site, and nice first answer! Mar 9 '21 at 17:48

# JavaScript (Node.js), 86 80 bytes

with strict adherence to the you are not allowed to use "y" or "\n" or their ASCII values (121, 0x79, 0171, 10, 0xA or 012) rule

for(;;)console.log(eval('T\\u'+(+[])+(+[])+(38+38+3)+'peError').toString()[6+4])


Try it online!

-6 bytes thanks to me

# JavaScript, 32 31 bytes

for(;;)console.log((""+1/0)[7])


## Edits

• -1 byte: while(1) => for(;;)

## Explanation

• for(;;) is an infinite loop)
• 1/0: A division by zero returns Infinity in javascript
• ""+ converts Infinity into a string
• [7] access the 8th character of "Infinity" (y)

To terminate the process do Ctrl+C (SIGINT)

# Plan 9 rc: 20-10=10 (but not quite there)

f={cat};while()echo \$f


The problem with this almost-solution is that it must have something on stdin. I haven't yet been able to find a way to get it to print y if stdin isn't there.

# Java, 157 154 bytes

Despite the common misconception that you have to use System.out to print anything to the console in Java, this program outputs to the console using a FileOutputStream to the file described by FileDescriptor.out. Accoding to the specification for FileDescriptor.out, it is "A handle to the standard output stream. Usually, this file descriptor is not used directly, but rather via the output stream known as System.out".

class A{public static void main(String[]a)throws Exception{for(;;)new java.io.FileOutputStream(java.io.FileDescriptor.out).write(new byte[]{120+1,9+1});}}


# Pascal: 40 characters

begin while 1=1do Writeln(Succ('x'))end.


Outputs “y”, stops on SIGINT.

# JAGL V1.0 20 - 10 = 10 With Bonus, 14 Without

Tdn{78h[}Sf{p9[pDd}u


Coulda probably done better, but here is the explaination:

Td                               Get a line of text input, and duplicate on stack
n                              Negate its truth value (for the if)
{78h[}                        Push a block which will push the y character, if called
Sf                      Swap top two values on stack and if no input, push y
{p9[pDd}              Push block which prints the input (or y) and a newline
u             Do until loop. Output always evaluates to true


Can be killed by SIGINT

Without bonus:

'x  '{1+}/{pd}u


explaination:

'x  '                            Pushes the string '\tx'
{1+}                       Adds 1 to each character in the string, making it 'y\n'
{pd}u                  Infinitely prints and duplicates


# Lazy K, 167 bytes

kssiskssksiikskssiksskskisskskssksksskskissksksskskiskkskssikssksksskskissksksskskik


It is probably too long...

ssiskssksiik                                              fixed-point combinator
ssksksskskissksksskski                          \n
sskskisskskssksksskskissksksskski    y


## C 42

main(){while(1){putchar(11*11);puts("");}}