134
\$\begingroup\$

You are to write a program that will output source code that is

  1. Larger than the original program (character wise)
  2. Will print another program larger than itself when run (i.e. the new program is also a valid answer to this challenge) indefinitely

This is code-golf, so shortest answer wins.

DialFrost
5,1892 gold badges15 silver badges58 bronze badges
asked Feb 23, 2014 at 2:43
\$\endgroup\$
11
  • 5
    \$\begingroup\$ @Kevin, The definition is recursive. The output should be a program whose output is larger than itself, and an answer to this question. So the output's output should be larger than the output, and the output's output's output should be even larger, etc. \$\endgroup\$ Commented Feb 23, 2014 at 10:55
  • 8
    \$\begingroup\$ I think you should clarify your rules. On one hand, any additional code output by such a program is "obviously useless"; on the other hand, all additional code in the output is "useful" in that it furthers the goal of answering this challenge. \$\endgroup\$ Commented Feb 23, 2014 at 22:29
  • 6
    \$\begingroup\$ Sorry for destroying your challenge. :^) \$\endgroup\$ Commented Feb 24, 2014 at 5:03
  • 45
    \$\begingroup\$ Naturally, such a program should be known as a quinine. \$\endgroup\$ Commented Feb 25, 2014 at 5:05
  • 2
    \$\begingroup\$ @facepalm42 Quine challenge answers are forbidden from reading their own source code, which makes comments tricky to use here. \$\endgroup\$ Commented Nov 9, 2019 at 1:02

63 Answers 63

2
\$\begingroup\$

Julia 1.0, 33 bytes

a=[show,print]
".|>$([a;a])
".|>a

Try it online!

prints (79 bytes):

".|>Function[show, print, show, print]\n".|>Function[show, print, show, print]

then, the program is doubled each time:

".|>Function[show, print, show, print]\n".|>Function[show, print, show, print]
".|>Function[show, print, show, print]\n".|>Function[show, print, show, print]

based on this quine:

".|>[show,print]".|>[show,print]

Try it online!

answered May 4, 2022 at 8:53
\$\endgroup\$
1
\$\begingroup\$

PHP, 38

<?echo fgets(fopen(__FILE__,'r')).';';

It will add a semicolon at each run.

answered Feb 23, 2014 at 15:49
\$\endgroup\$
5
  • \$\begingroup\$ Are the semicolons useless code? \$\endgroup\$ Commented Feb 23, 2014 at 18:00
  • 3
    \$\begingroup\$ @Quincunx They are, you are right. However, what would you consider useful code? \$\endgroup\$ Commented Feb 23, 2014 at 18:03
  • \$\begingroup\$ Maybe you could put in in the ';'. Then you'd get longer outputs. \$\endgroup\$ Commented Feb 23, 2014 at 18:03
  • 1
    \$\begingroup\$ why not <?=fgets(fopen(__FILE__,'r')).';';? \$\endgroup\$ Commented Feb 24, 2014 at 23:54
  • 1
    \$\begingroup\$ ;<?echo fgets(fopen(__FILE__,'r')); \$\endgroup\$ Commented Oct 15, 2014 at 8:59
1
\$\begingroup\$

BATCH, 26

Place this code in any .bat file and it will continue to execute (in an infinite loop) and the file will grow as well.

echo echo %0 ^>^> %0 >> %0
answered Feb 23, 2014 at 23:44
\$\endgroup\$
3
  • \$\begingroup\$ This doesn't quite work, %0 is the command used to invoke the script, which may not have a .BAT extension. You can use %~nx0 to get the full filename of the batch file. \$\endgroup\$ Commented Feb 24, 2014 at 0:06
  • \$\begingroup\$ @JasonC AFAIK, it doesn't need the .bat to be executed. If the filename is execute.bat, you can enter either execute or execute.bat. Both will work. \$\endgroup\$ Commented Feb 24, 2014 at 1:59
  • \$\begingroup\$ The file itself needs to have a .bat extension to execute but you can leave the extension off when you execute it (when you type a command with no extension, Windows tries .com, .exe, then .bat in that order). If the filename is hello.bat, then >> %0 will write a file named hello, which isn't the original hello.bat (and can't be executed). \$\endgroup\$ Commented Feb 24, 2014 at 2:40
1
\$\begingroup\$

Batch

set d=time 
copy c:\>loop.bat /B loop%d%.bat 
call c:\>loop.bat
user12205
9,0483 gold badges33 silver badges65 bronze badges
answered Feb 24, 2014 at 16:49
\$\endgroup\$
1
\$\begingroup\$

Javascript - 46

(function $(){console.log('('+$+'());$()')}())
answered Feb 26, 2014 at 14:39
\$\endgroup\$
0
1
\$\begingroup\$

PYG (6)

P(Q,Q)

Prints it's own source code, separated by newlines. The second generation would be

P(Q,Q)
P(Q,Q)

and so forth.

answered Apr 22, 2014 at 17:19
\$\endgroup\$
1
\$\begingroup\$

OIL, 83 bytes

0
0
1
1
1
4
1
11
4
1
11
1
2
2
1
12
18
10
18
1
32
22
1
18
26
4
26
8
18
11
6
17
4
26

It first prints two lines with a zero in them, and then compares each line to line 1, if they're equal (which is the case when the file is exhausted), we print what's in cell 26. The resulting output will look the same, except with an added 33, which doesn't do anything. Next time, another line will be added, and so on.

answered Nov 15, 2016 at 8:47
\$\endgroup\$
1
\$\begingroup\$

Help, WarDoq!, 1 byte.

H

Prints Hello, World!.

Other characters than H are valid (and safe) source code (that print other variants of Hello World).

answered Dec 16, 2016 at 21:23
\$\endgroup\$
2
  • \$\begingroup\$ Also works in (variants of) HQ9+. \$\endgroup\$ Commented Jan 5, 2017 at 2:39
  • \$\begingroup\$ @CalculatorFeline in HQ9+ this wouldn't continue to grow. \$\endgroup\$ Commented Apr 13, 2017 at 9:18
1
\$\begingroup\$

Charcoal, non-competing, 32 bytes

A ́α ́ ́ ́A ́F ́α ́+ ́ ́ ́ ́ ́ι ́αaα ́AFα+ ́ ́ια

Try it online!

Explanation:

first, go check out this answer on the quine challenge and its explanation.

This program is that program, but with the letter a at the end of the string variable.

A α Assign to a
 ́α ́ ́ ́A ́F ́α ́+ ́ ́ ́ ́ ́ι ́αa "α ́AFα+ ́ ́ιαa", but with ́ escape character with each
 character, except a
 these are the variable being assigned to, and the
 rest of the program that is not the string.
 ́A Print A to the grid. current grid: "A"
 Fα+ ́ ́ι For each character in a, print ́ + character
 this results in the escaped version of the string
 which is the literal string that is assigned at the 
 start, plus a escaped. current grid state: "A ́α ́ ́ ́A ́F ́α ́+ ́ ́ ́ ́ ́ι ́α ́a"
 α Print a ("α ́AFα+ ́ ́ιαa"), which is the commands after
 the string assignment. final grid state vvv:
 "A ́α ́ ́ ́A ́F ́α ́+ ́ ́ ́ ́ ́ι ́α ́aα ́AFα+ ́ ́ιαa"
[implicitly print the grid: "A ́α ́ ́ ́A ́F ́α ́+ ́ ́ ́ ́ ́ι ́α ́aα ́AFα+ ́ ́ιαa", the new program]

This new program works in the same way, except for two things:

  • the "a" is escaped (which has no effect, as "a" escaped is "a")

  • there is an "a" at the end of the program. this "a" will write an extra "a" after the source is produced. thus the program grows slowly

answered May 20, 2017 at 0:33
\$\endgroup\$
1
\$\begingroup\$

C, (削除) 116 (削除ここまで) (削除) 149 (削除ここまで) (削除) 197 (削除ここまで) 189 bytes

i;main(a){printf(a="i;main(a){printf(a=%c%s%1$c,34,a,i+2);for(i=%d;i--;)",34,a,i+2);for(i=1;i--;)printf(a="printf(a=%c%s%1$c,34,a,34),",34,a);printf(a="0;printf(a=%c%s%1$c,34,a);}",34,a);}

How it works

  • main(a){ declares the main function with an untyped variable a.
  • The first printf prints the existing source code and a for loop. An integer is printf'd into the for loop. This is how the multi-quine works - each time the quine program is called, it increments d, making the for loop run more times.
  • The second printf is inside the for loop and prints itself, so each time the quine program is called, there are more printf's, therefore generating bigger versions of itself. Be warned that this growth is exponential, due to the for loop incrementation and the multiple printfs.
  • The third printf prints the remaining source code.

Requires POSIX.

answered May 25, 2017 at 1:48
\$\endgroup\$
0
1
\$\begingroup\$

Java 8, 92 bytes

v->{String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s);}//";return s.format(s,34,s);}

Try it online.

Outputs (4 bytes larger):

v->{String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s);}//"+1;return s.format(s,34,s);}//

Try first output program.

Which outputs (2 bytes larger):

v->{String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s);}//1"+1;return s.format(s,34,s);}//1

Try second output program.

Which outputs (2 bytes larger):

v->{String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s);}//11"+1;return s.format(s,34,s);}//11

Try third output program.

etc. (2 bytes larger every new program)

Explanation:

-part:

  • The String s contains the unformatted source code.
  • %s is used to input this String into itself with the s.format(...).
  • %c, %1$c and the 34 are used to format the double-quotes.
  • s.format(s,34,s) puts it all together

Challenge part:

  • Unformatted source code contains +1 and // to make the output program larger and compilable.
  • +1 adds a 1 to both the unformatted and formatted program.
answered Mar 20, 2018 at 16:28
\$\endgroup\$
1
\$\begingroup\$

Gol><>, 5 bytes

#H}"'

This, I believe, is the smallest growing quine possible in Gol><>. It duplicates the #H} over and over...

Try it online!

answered Feb 10, 2019 at 22:43
\$\endgroup\$
1
\$\begingroup\$

AsciiDots, 20 bytes

($'#a_93ドル#"$_@("_$-.

Try it online!


First run

Sends a dot leftward, printing the characters (@_$ with a literal and ' from the ASCII value 39. The dot then turns around and interprets the path as a string, printing the rest of the line.

(@_$'#a_93ドル#"$_@("_$-.


Subsequent runs

Prints (@_$' again, as well as a 0, thanks to the added @_ from the first run. The 0 ends up on the right side of the ' symbol, which means that all 0s printed in a previous run carry over. The dot safely ignores the additional 0s on its path.

(@_$'0#a_93ドル#"$_@("_$-.

(@_$'00#a_93ドル#"$_@("_$-.

(@_$'000#a_93ドル#"$_@("_$-.

answered Jul 14, 2019 at 20:26
\$\endgroup\$
1
\$\begingroup\$

Bash, 14 bytes

cat 0ドル&cat 0ドル&

Try it online!

answered Sep 6, 2019 at 6:00
\$\endgroup\$
1
\$\begingroup\$

Keg, (削除) 18 (削除ここまで) (削除) 15 (削除ここまで) (削除) 14 (削除ここまで) (削除) 13SBCS (削除ここまで) (削除) 11 (削除ここまで) (削除) 10SBCS (削除ここまで) (削除) 9SBCS (削除ここまで) 6SBCS bytes

`410`410

Try it online!

I've gone and done it now! No more ascii around here now folks. This will print:

`410`410410

Which will print:

`410`410`410`410410

Which prints:

`410`410`410`410`410`410410410

And so on.

Answer History

9 bytes

`::.,`(2)410

This uses the same approach as the 10 byte answer

Explained

`::.,`(2)410
`::.,` #Push the string `::.,`
 (2) #Double the string
 410 #Print raw then nice without popping

10 bytes

`::.,`(2):.,

This prints:

`::.,::.,`::.,::.,

Which prints:

`::.,::.,`::.,::.,`::.,::.,`::.,::.,

11 bytes

`::.,`6*:.,

This prints:

`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,

Which prints:

`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,`::.,::.,::.,::.,::.,::.,

And so on

Try it online!

13 bytes

`::.,`!9*:(.,

Try it online!

This prints:

`::.,::.,`::.,::.,

Which prints:

`::.,::.,`::.,::.,`::.,::.,`::.,::.,

And so on.

14 bytes

`::.,(:.,)`:.,

Try it online!

This will create pretty much the same chain as the previous 15-byter.

15 bytes

`::.,(::.,)`:.,

This prints:

`::.,(::.,)`::.,(::.,)

Which prints:

`::.,(::.,)`::.,(::.,)`::.,(::.,)`::.,(::.,)

And so on.

Try it online!

18 bytes

`:::.,(!2/|.,)`:.,

Try it online!

This will print

`:::.,(!2/|.,)`:::.,(!2/|.,)

Which in turn prints:

`:::.,(!2/|.,)`:::.,(!2/|.,)`:::.,(!2/|.,)`:::.,(!2/|.,)

Which then prints:

`:::.,(!2/|.,)`:::.,(!2/|.,)`:::.,(!2/|.,)`:::.,(!2/|.,)`:::.,(!2/|.,)`:::.,(!2/|.,)`:::.,(!2/|.,)`:::.,(!2/|.,)

And so on.

Try it online!

answered Nov 8, 2019 at 6:07
\$\endgroup\$
1
\$\begingroup\$

JavaScript (ES6/2015), 12 bytes

a=_=>'a=_'+a

Try it online!

with invokation, 23 bytes

(a=_=>'(a=_'+a+')()')()

Try it online!

Every iteration adds an underscore to the parameter name

answered Oct 6, 2021 at 12:46
\$\endgroup\$
1
\$\begingroup\$

Wolfram Language (Mathematica), 19 bytes

ToString[10#0][]&[]

Try it online!

Returns 10 (ToString[10 #0][] & )[], which, when run, returns 10*10 (ToString[2 #0][] & )[]. From there, the beginning number is multiplied by 10 at every step, which increases the length of the code by 1.

answered May 3, 2022 at 17:13
\$\endgroup\$
1
\$\begingroup\$

Batch, 1 byte

a

Add prompt at head every time, error is who cares

answered Dec 20, 2022 at 6:29
\$\endgroup\$
1
\$\begingroup\$

><> (Fish), 14 bytes

'rd3*9[r:r]>o<

Try it

First iteration duplicates the : in the middle: (it actually duplicates itself):

'rd3*9[r::r]>o<

Then since there are now 2 duplication signs it will duplicate itself twice:

'rd3*9[r::::r]>o<

etc. doubling each time.

><> (Fish), 9 bytes (Boring version)

':rd3*>o<

Try it

This simply duplicates the < at the end:

':rd3*>o<<
':rd3*>o<<<

etc. So the functionality of the program won't be effected at all. It's basically a comment.

answered Jan 4, 2023 at 9:30
\$\endgroup\$
0
\$\begingroup\$

Pushy, 7 bytes

95&34_"

Non-competing as the language postdates the challenge. This outputs:

95 95 34
__"

which in turn outputs:

95 95 34
95 95 34
__"

and so on. After ~5 runs it looks like this:

95 95 34 95 95 34 95 95 34 95 95 34
95 95 34 95 95 34 95 95 34 95 95 34
__"__"__"__"
95 95 34 95 95 34 95 95 34 95 95 34
95 95 34 95 95 34 95 95 34 95 95 34
__"__"__"__"
answered Dec 16, 2016 at 21:07
\$\endgroup\$
0
\$\begingroup\$

k

41 bytes

f:{{(2*#x)#x}"f:",x,";`0:f@$f;"};`0:f@$f;

This program prints a copy of itself, and then doubles it. Thus it grows.

33 bytes

`0:{,//$("`0:";o;"[";x;"1];")}[1]

This program prints itself, but with an ever-growing number as the argument. This works in the closed-source interpreter.

answered Apr 13, 2017 at 16:16
\$\endgroup\$
0
\$\begingroup\$

Alice, 14 bytes

" <@o&h:2d+2..

Try it online!

Subsequent versions will have an increasing number of spaces after the ".

Explanation

" <@o&h:2d+2.." Push the code points of the source code, except for the 
 quotation marks.
< Send the IP back west.
"..2+d2:h&o@< " Push the code points of the source code, except for the
 quotation marks, in reverse.
.. Make two copies of the space. One will be the additional
 space, one will be turned into the quotation mark.
2+ Add two, to turn 32 (space) into 34 (quote).
d Push the stack depth. This is about twice the number of characters
 we want to print, because there's still the first copy of the source
 on the stack. But it's two less than twice that number, because the
 additional space and the quote aren't duplicated.
2: Halve the value.
h Increment to account for the space and quote.
& Repeat the next command that many times.
o Print that many characters from the top of the stack.
@ Terminate the program.
answered Apr 13, 2017 at 18:51
\$\endgroup\$
0
\$\begingroup\$

shortC, 99 bytes

i;ARa="i;ARa=%c%s%c,34,a,34,i+2);Oi=%d;i--;)",34,a,34,i+2);Oi=2;i--;)Ra="Ra=%c%s%c,34,a,34",34,a,34
answered May 25, 2017 at 17:33
\$\endgroup\$
0
\$\begingroup\$

Befunge-98 (FBBI), 38 bytes

::3a*3+-8jrfjj2,g0_0g,"+2",,1+:3d*`#@_

Try it online!

answered Dec 28, 2018 at 12:14
\$\endgroup\$
0
\$\begingroup\$

Python 3, 54 chars

print((lambda s:s%s)('print((lambda s:s%%s)(%r)*2);'))

I simply modified this quine. You can try it simply doing python this.py | python | python ... | python many times.

Edit: found this problem on the homepage and discovered too late that it is old.

answered Jul 15, 2019 at 0:11
\$\endgroup\$
1
  • 1
    \$\begingroup\$ There's no issue solving old challenges. \$\endgroup\$ Commented Jul 16, 2019 at 0:39
0
\$\begingroup\$

C (gcc), 132 bytes

It's not often you get to recycle answers from other questions.

x;*s="x;*s=%c%s%c;main(i){for(i=__LINE__;i--;puts(&x));printf(s,34,s,34);}";main(i){for(i=__LINE__;i--;puts(&x));printf(s,34,s,34);}

Try it online!

answered Jul 16, 2019 at 6:54
\$\endgroup\$
0
\$\begingroup\$

Haskell, 155 bytes

g=putStrLn("n=1"++show n++('-'<$[1..n]));main=(\s->putStr s>>print s>>g)$"g=putStrLn(\"n=1\"++show n++('-'<$[1..n]));main=(\\s->putStr s>>print s>>g)$"
n=2

Try it online!

answered Aug 11, 2019 at 1:04
\$\endgroup\$
0
\$\begingroup\$

W, 15 bytes

A proper quine, except it grows very oddly.

pp34CS+"pp34CS+

Iterations (You can see that the output gets between and after the source code... ):

pp34CS+pp34CS+"pp34CS+
pp34CS+pp34CS+pp34CS+pp34CS+"pp34CS+pp34CS+
answered Nov 27, 2019 at 14:21
\$\endgroup\$
0
\$\begingroup\$

C (gcc), 71 bytes

#define a(b)*s=#b;b
a(main(){printf("#define a(b)*s=#b;b\na(%s;)",s);})

Every iteration adds a semicolon after the closing brace of the main function.

Try it online!

answered Oct 7, 2021 at 22:26
\$\endgroup\$
0
\$\begingroup\$

Lua, 58 bytes

f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))

Attempt This Online! Repeats the formatted string 9 times. This is the result of iteration 1:

f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))f="f=%qprint(f:format(f):rep(9))"print(f:format(f):rep(9))
answered Mar 23, 2022 at 21:19
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.