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)

This is code-golf, so shortest answer wins.

  • 3
    @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. – ugoren Feb 23 '14 at 10:55
  • 7
    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. – Jason C Feb 23 '14 at 22:29
  • 4
    Sorry for destroying your challenge. :^) – Justin Feb 24 '14 at 5:03
  • 1
    I think this challenge would be much better as a popularity contest than a code golf. It would allow for a lot more creativity! – corsiKa Feb 24 '14 at 23:44
  • 23
    Naturally, such a program should be known as a quinine. – Jonathan Van Matre Feb 25 '14 at 5:05

37 Answers 37

up vote 77 down vote accepted
+500

GS2 (8636bd8e), 0 bytes



This prints a single newline, which prints two newlines, which prints three newlines, et cetera.

Try it online!

  • 2
    Isn't this technically non-competing since gs2 is newer than the challenge? – DJMcMayhem Oct 17 '16 at 22:22
  • 21
    This commit predates the challenge by a month and a half. I just tested it, and it works as intended. – Dennis Oct 17 '16 at 22:24
  • 1
    How is this not a loophole??? – Mama Fun Roll Nov 12 '16 at 17:18
  • 11
    @MamaFunRoll Why would it be? This isn't different from an empty Retina program printing 1, an empty Jelly program printing 0, or an empty Stuck program printing Hello, World!. – Dennis Nov 12 '16 at 17:21
  • 1
    @Cyoce It just happens that a newline outputs another newline in GS2. – Esolanging Fruit May 31 '17 at 18:51

H9+ : 1 char

9

That's right. One character. Outputs the lyrics to 99 bottles of beer, which is a valid program. All the extraneous data does not count, but there are plenty of 9s in there.

The output of the outputted program is the lyrics to 99 bottles of beer 59 times.

This function gives the number of times the lyrics are outputted if you run the program n times (if my calculation is correct):

f(n) = 59n-1
  • 28
    A 0 char program in a given language, given that it's valid, will likely output 0 characters. And since 0*x=0 for any finite value x, I can claim that my outputted program is actually 9999999999999999 times bigger than the source code. – nitro2k01 Feb 23 '14 at 18:33
  • 33
    @JohannesH. For all(solvable) problems there exists a programming language that solves the problem in 0 chars. – Cruncher Feb 24 '14 at 18:48
  • 13
    I still move that we name that "Cruncher's Theorem", unless it's already been discovered. – Erty Seidohl Feb 25 '14 at 18:31
  • 17
    One interesting feature is that it will also contain 2*59^n-2 instances of "Hello, world!", due to the "h" in "the". – AJMansfield Mar 11 '15 at 18:37
  • 7
    Looks like you've been beat. – PyRulez Oct 17 '16 at 22:03

GolfScript, 9 chars

{.'.~'}.~

This code outputs:

{.'.~'}{.'.~'}.~

which outputs:

{.'.~'}{.'.~'}{.'.~'}.~

which outputs:

{.'.~'}{.'.~'}{.'.~'}{.'.~'}.~

and so on.

I believe this is the shortest answer in a "real" Turing-complete programming language so far.

Explanation:

Basically, the original code above is a "quine-layer": it outputs a normal quine followed by itself.

In GolfScript, any code block literal (e.g. {foo}), if left undisturbed on the stack, is a quine. Thus, on its own, {.'.~'} simply outputs itself, just like any other code block would.

The .~ at the end of the code takes the last code block on the stack, duplicates it, and executes the copy. When executed, the code .'.~' inside the code block duplicates the topmost item on the stack (i.e. the copy of itself) and appends the string .~.

At the end of the program, the GolfScript interpreter stringifies and outputs everything on the stack, which, in this case, consists of one more {.'.~'} block than in the input, plus the string .~.

Bonus:

Adding a ] before the first . (to collect all the code blocks on the stack into an array before they're duplicated) makes it grow exponentially:

{].'.~'}.~

outputs:

{].'.~'}{].'.~'}.~

which outputs:

{].'.~'}{].'.~'}{].'.~'}{].'.~'}.~

which outputs:

{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}.~

and so on.

  • 185
    {].'.~'}.~︵ ┻━┻ – nitro2k01 Feb 23 '14 at 18:34
  • 2
    bit.ly/1cQXJyA – Jason C Feb 26 '14 at 20:33
  • 2
    @nitro2k01 my first thoughts exactly :D – Songo Feb 27 '14 at 12:50
  • 1
    Is "real" in quotes because HQ9+ is not real or because GolfScript is not real, or both? – Roger Pate Sep 13 '16 at 8:37
  • 1
    @thepiercingarrow the source code resemble this – Rod Nov 16 '16 at 14:47

Java 7: 0 chars



Save as file Blank.java. If you save it as any other file, replace any instance of Blank with the appropriate file name.

Then, run in command line via first compiling, then running. If compiling fails, stop.

I list this as Java 7 because it might output differently for different versions of Java.

First few outputs (outputted to stderr):

Error: Could not find or load main class Blank
Blank.java:1: error: class, interface, or enum expected
Error: Could not find or load main class Blank
^
Blank.java:1: error: reached end of file while parsing
Error: Could not find or load main class Blank
                                              ^
2 errors
Blank.java:1: error: class, interface, or enum expected
Blank.java:1: error: class, interface, or enum expected
^
Blank.java:1: error:  expected
Blank.java:1: error: class, interface, or enum expected
                          ^
Blank.java:1: error:  expected
Blank.java:1: error: class, interface, or enum expected
                                     ^
Blank.java:1: error: as of release 5, 'enum' is a keyword, and may not be used as an identifier
Blank.java:1: error: class, interface, or enum expected
                                          ^
  (use -source 1.4 or lower to use 'enum' as an identifier)
Blank.java:1: error: = expected
Blank.java:1: error: class, interface, or enum expected
                                               ^
Blank.java:2: error:  expected
Error: Could not find or load main class Blank
     ^
Blank.java:2: error: ';' expected
Error: Could not find or load main class Blank
      ^
Blank.java:2: error: = expected
Error: Could not find or load main class Blank
                      ^
Blank.java:2: error: = expected
Error: Could not find or load main class Blank
                                   ^
Blank.java:2: error:  expected
Error: Could not find or load main class Blank
                                              ^
Blank.java:3: error: = expected
^
^
Blank.java:3: error: ';' expected
^
 ^
Blank.java:4: error: illegal start of type
Blank.java:1: error: reached end of file while parsing
     ^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
          ^
Blank.java:4: error: illegal start of type
Blank.java:1: error: reached end of file while parsing
           ^
Blank.java:4: error:  expected
Blank.java:1: error: reached end of file while parsing
            ^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
          ^
Blank.java:4: error: illegal start of type
Blank.java:1: error: reached end of file while parsing
           ^
Blank.java:4: error:  expected
Blank.java:1: error: reached end of file while parsing
            ^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
              ^
Blank.java:4: error: ';' expected
Blank.java:1: error: reached end of file while parsing
                   ^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
                                 ^
Blank.java:4: error:  expected
Blank.java:1: error: reached end of file while parsing
                                        ^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
                                         ^
Blank.java:4: error: ';' expected
Blank.java:1: error: reached end of file while parsing
                                              ^
Blank.java:5: error:  expected
Error: Could not find or load main class Blank
     ^
Blank.java:5: error: ';' expected
Error: Could not find or load main class Blank
      ^
Blank.java:5: error: = expected
Error: Could not find or load main class Blank
                      ^
Blank.java:5: error: = expected
Error: Could not find or load main class Blank
                                   ^
Blank.java:5: error:  expected
Error: Could not find or load main class Blank
                                              ^
Blank.java:6: error: = expected
                                              ^
                                              ^
Blank.java:6: error: ';' expected
                                              ^
                                               ^
Blank.java:7: error: reached end of file while parsing
2 errors
        ^
30 errors
  • 21
    "You are to write a program that will output source code that is" The output is arguably not source code. And furthermore, depending on the definition of output (whether output must come specifically from stdout) nothing is actually output. – nitro2k01 Feb 23 '14 at 18:48
  • 38
    @nitro2k01 I quote the same: "You are to write a program that will output source code". Anything is source code. But only some things are valid source code. Additionally, it was not specified what is considered output, so I am allowed freedom there. – Justin Feb 23 '14 at 18:50
  • 12
    @PyRulez That's right. I exploited your rules. You don't need to accept this answer. When I posted this, I knew that a controversy would follow, complete with many up and down votes. I decided that it would be worth it, though. – Justin Feb 23 '14 at 21:40
  • 28
    Are you sure that the program itself printed the output? Wasn't that only the compiler? The program gets never compiled and itself is not interpreted nor executed, thus it wasn't able to produce any output. – V-X Feb 24 '14 at 8:25
  • 11
    @blabla999 I disagree - people don't try these challenges because someone else does something crazy. We just challenge ourselves to do it some other way. As Mark Rosewater says, "Restrictions breed creativity" – corsiKa Feb 24 '14 at 23:40

HQ9+, HQ9++ and similars, 2 characters

QQ

This is the output:

QQQQ
  • 32
    I saw this and thought "Oh no, nothing can beat this." I started trying to come up with something, then it hit me. So I posted an answer. – Justin Feb 23 '14 at 6:09
  • 1
    @Quincunx Bravo, upvoted your answer. – Victor Stafusa Feb 23 '14 at 6:10
  • 3
    @Quincunx No, I think it's 2^2^n, where the initial program is generation 0. The length recurses m -> m^2. – Vortico Feb 23 '14 at 20:11
  • 3
    @Vortico Good point. Even though I said it wrong, I meant: At code-length n, the output becomes n^n. However, that is false; when the code-length is n, the output's length is n^2 – Justin Feb 23 '14 at 21:00
  • 2
    It is funny though because even the first two iterations are possible contenders for this question. – PyRulez Feb 23 '14 at 21:47

Ruby 27

A very slightly modified version of this (via):

puts <<3*3,3
puts <<3*3,3
3

The number of times that puts-line is printed grows exponentially.

$ ruby quine.rb | ruby | ruby
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
3

$ ruby quine.rb | ruby | ruby | ruby | ruby | ruby | ruby | ruby | wc -l
    3283
  • 15
    Answer inspired by the Kaiser Chiefs – Ben Jackson Feb 23 '14 at 20:06

Lambda Calculus - 29

A simple lambda term

(λu.(u u)(u u))(λu.(u u)(u u))

Reducing this term by one beta reduction yields

((λu.(u u)(u u))(λu.(u u)(u u)))((λu.(u u)(u u))(λu.(u u)(u u)))

And so on and so on. It's a simple variant on the classic (λu.u u)(λu.u u) which is a quine in lambda calculus, double self application here means we get twice the output.

  • 7
    I'd argue that in lambda calculus, "running" a lambda term means computing its normal form, not performing a single beta reduction. Also, a term can contain multiple redexes, therefore "reducing a single redex" is an ambiguous operation. – Petr Pudlák Feb 24 '14 at 19:17
  • 2
    You're right, but since this term has no normal form it makes sense to talk about this in terms of small step reduction. Since lambda calculus lacks any inherent set evaluation, I can just define "running" it to be reducing a single redex top level redex with call-by-name semantics no? – jozefg Feb 24 '14 at 19:54
  • 3
    Well, terms with no normal form correspond to non-terminating programs. And the problem with top level redex is that a term can have two redexes, neither one being a sub-term of another. You could pick some criterion which one to reduce, but I'd say that then you're getting very far from the standard lambda calculus semantics. (Anyway I appreciate your novel idea.) – Petr Pudlák Feb 24 '14 at 19:56
  • 2
    (λx.x x x)(λx.x x x) :20 – Fabio F. Feb 24 '14 at 22:10
  • 2
    (λx. x x)(λx. x x x) reduces to that in a single step – Ben Millwood Feb 26 '14 at 21:56

SH script, 9

cat $0 $0

Grows at exponential rate.

Either run as sh whatever.sh or set it as executable.

Windows version is here.

  • 1
    At the time of me writing this comment, the Quine Wiki page says that reading from the filesystem is cheating. – Lord Ratte Dec 7 '16 at 14:32
  • 3
    @LordRatte On the other hand, the challenge wasn't to write a quine. – Jason C Dec 7 '16 at 23:53

dc 11

Quite simple:

6579792
dfP

The first line is repeated once every generation:

$ dc growing_quine.dc
6579792
6579792
dfP

$ dc growing_quine.dc | dc | dc 
6579792
6579792
6579792
6579792
dfP

The last line consists of the following instructions: d duplicates the last value put on the stack (6579792) (so that we get one more copy each time we run it), f prints the whole stack (which is a bunch of that same number) and P prints the number (6579792) out as a byte stream, which displays as dfP.

Python 3 - 55

print(open(__file__).read())
f=lambda:print('f()')
f()

This could be made shorter by replacing __ file__ with a single character filename and saving the file as that, but I felt this answer was more in the spirit of the question. After one iteration it outputs:

print(open(__file__).read())
f=lambda:print('f()')
f()
f()
  • 3
    This isn't a quine. See the definition. – Petr Pudlák Feb 24 '14 at 19:13
  • 12
    @PetrPudlák Nor are any programs in this question. This is a quine-variant problem, not strict quining. – AJMansfield Feb 25 '14 at 2:22

redcode (recursive solution)

This is the code of the easiest warrior writable in redcode, the famous Imp:

MOV 0, 1

When executed, the code writes a copy of its single instruction at the next address in memory; then executes it, etc.

SH script, 12 8 7

Store a file with

sed p *

in its own, empty directory and run from this directory using sh [file] or set executable.


Old alternative with 8 characters, but doesn't need its own directory. Store a file with

sed p $0

and run using sh [file] or set executable.

Old alternative with 12 characters:

sed -i- p $0

This will actually output to the program file itself, but where to output was not specified. Replicates itself at an exponential rate.

  • 1
    You might still have chance using ed, didn't want to look through its man page... – Jens Erat Feb 24 '14 at 10:49

Smalltalk, 125 61 57

The golf version looks almost unreadable so I'll explain first (and use real identifiers).

This is a variant of the "weirdest-way-to-produce-a-stack-overflow" self modifying method.

The method prints out a hello message, and its current source (for the demonstration only). Then, the code is modified to output a longer string and installed. Finally, the new code is called recursively.

In order to protect myself from an immediate runaway, it lets the user confirm in each cycle.

compile in Object:

eatMe_alice
   |msg mySource|

   mySource := thisContext method source.

   '**** Hello Alice' printCR.
   '  ---- my current code is:' printCR.
   mySource printCR.
   '  ---------------' printCR.

   (UserConfirmation confirm:'Again? ') ifTrue:[
       Object compile:
            (mySource
                copyReplaceString:'Hello ','Alice'
                withString:'Hello ','Alice !').
       self eatMe_alice
   ]

start the show by sending "eatMe_alice" to any Object; nil will do:

nil eatMe_alice

A nice variant is to not call the new code recursively, but instead iteratively, by unwindig the call stack and reentering into the new method. This has the advantage of not leading to a recursion exception. To do this, replace the recursive call ("self eatMe_alice") by:

thisContext resend

Golfing:

Obviously, printing and self calling was not asked for, so the shortest (for golf) is to simply append a comment to my own source and return it. As a side effect, it also gets installed for the next call...

x|s|Object compile:(s:=thisContext method source,'""').^s

JavaScript, 41, 40 chars

function f(){console.log(f+"f(f())")}f()

The first time you run it it outputs itself with another ;f() at the end. Subsequent runs of the output results in each "input" source printed twice.

alert would be shorter than console.log but I don't consider multiple alert dialogs to be "the" output while it seems reasonable to call multiple lines in the console as an output.

  • You can save one byte with "f(f())" instead of "f();f()" – Hedi Nov 12 '16 at 15:40
  • This doesn't seem to work for me... – Destructible Lemon Nov 12 '16 at 22:27

Windows .BAT, 25

@COPY %~nx0+%~nx0 CON>NUL

Grows at exponential rate.

Equivalent SH version here.

reticular, 11 bytes, noncompeting

"'34'coo1o;

This is the standard quine framework, except an extra 1 is printed after each iteration. Try it online!

First few outputs:

"'34'coo1o;
"'34'coo1o;1
"'34'coo1o;11
"'34'coo1o;111

Microscript II, 6 bytes

Noncompeting, language postdates the challenge.

"qp"qp

The first iteration adds an extra qp to the end, and each successive iteration adds an extra copy of this original program to the beginning.

ECMAScript 6 (38 Characters)

(f=_=>'(f='+f+')();(f='+f+')();')();

Which outputs:

(f=_=>'(f='+f+')();(f='+f+')();')();(f=_=>'(f='+f+')();(f='+f+')();')();

Edit

You could do (28 characters):

(f=_=>'(f='+f+')();'+f())();

However it will recurse infinitely and never return anything... but this can be solved by doing something like this (42 characters):

(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(3);

Which will output:

(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(3);(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(2);(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(1);
  • 3
    +_+ =_= +1 for emoticons – TuxCopter Oct 18 '16 at 12:21

Common Lisp, 16 Characters

(print `(or ,-))

Granted, it's interactive-only, but being able to reference the current top-level form is probably the single best way to minimize a non-trivial program that meets the specification.

What would be really interesting is what blows up the fastest. Maybe something like

(print `(progn ,@(loop repeat (length -) collect -)))

  • +1 For Common Lisp. Looks to me like you can skip ` and ,? – daniero Feb 26 '14 at 13:55
  • @daniero Without the quotation, it just prints the original program, never growing. At that point, you may as well omit the or, too: (print -) – Stuart Olsen Feb 26 '14 at 20:14

Julia, 66 chars

x="print(\"x=\$(repr(x))\\n\$x;\"^2)";print("x=$(repr(x))\n$x;"^2)

Output (134 chars):

x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);

Result of executing the result (268 chars):

x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);

next result (536 chars):

x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);

Next result (1072 chars):

x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);

I hope this is according to the rules.

It produces larger output, and the output itself is valid source code that produces larger output again.

  • Will the output, when ran, produce a valid entry? – PyRulez Jun 30 '15 at 1:11
  • In the first example the output is valid code. It’s a string literal containing 5 periods. In the second example, entering the julia prompt itself wouldn’t do anything. I just thought that just giving the repl actually a newline character by hitting enter produces a longer output than the input. – M L Jun 30 '15 at 1:24
  • Will "....." produce a larger version of itself? – PyRulez Jun 30 '15 at 1:25
  • Ah, now I understand. I just noticed it had to be recursive... time to correct my solution. Thanks for the hint. – M L Jun 30 '15 at 1:28
  • 1
    I guess the code is according to the rules now. – M L Jul 12 '15 at 2:26

05AB1E, 15 bytes, noncompeting

0"DÐ34çý"DÐ34çý

Try it online!

Prints 0"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý,
which prints 0"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý"DÐ34çý,
etc.

  • Both instances of DD can be replaced by Ð. – Emigna Nov 11 '16 at 9:30
  • 1
    Why noncompeting? – MD XF May 25 '17 at 20:10

EcmaScript 6 (51 bytes):

(_=x=>'(_='+_+Array(x++).join(','+_)+')('+x+')')(2)

It produces a longer version of itself, which can produce a longer version of itself, which can produce a longer version of itself, etc. ...

PHP, 38

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

It will add a semicolon at each run.

  • Are the semicolons useless code? – Justin Feb 23 '14 at 18:00
  • 3
    @Quincunx They are, you are right. However, what would you consider useful code? – ComFreek Feb 23 '14 at 18:03
  • Maybe you could put in in the ';'. Then you'd get longer outputs. – Justin Feb 23 '14 at 18:03
  • 1
    why not <?=fgets(fopen(__FILE__,'r')).';';? – Ismael Miguel Feb 24 '14 at 23:54
  • 1
    ;<?echo fgets(fopen(__FILE__,'r')); – jimmy23013 Oct 15 '14 at 8:59

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
  • 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. – Jason C Feb 24 '14 at 0:06
  • @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. – ub3rst4r Feb 24 '14 at 1:59
  • 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). – Jason C Feb 24 '14 at 2:40

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.

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.

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

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.

Batch

set d=time  
copy c:\>loop.bat /B loop%d%.bat  
call c:\>loop.bat

Javascript - 46

(function $(){console.log('('+$+'());$()')}())

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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