111
\$\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)

This is code-golf, so shortest answer wins.

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

50 Answers 50

1 2
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

\$\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.

\$\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!

\$\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#"$_@("_$-.

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

Underload, 9 bytes

(:::aSSS):^

Modification on the standard underload quine, which is (:aSS):aSS. First, I changed the second :aSS into :^ since it still runs the same code (by duplicating and then running the top item of the stack, which is the stuff inside the bracket) whilst saving bytes. Then I added another S to make it so the program gets longer, and added two more :s to make it so the program it produces doesn't error.

Try it Online!

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

Bash, 14 bytes

cat $0&cat $0&

Try it online!

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

Keg, 18 15 14 13SBCS 11 10SBCS 9SBCS 6SBCS bytes

`④⑩`④⑩

Try it online!

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

`④⑩`④⑩④⑩

Which will print:

`④⑩`④⑩`④⑩`④⑩④⑩

Which prints:

`④⑩`④⑩`④⑩`④⑩`④⑩`④⑩④⑩④⑩

And so on.

Answer History

9 bytes

`::.,`⑵④⑩

This uses the same approach as the 10 byte answer

Explained

`::.,`⑵④⑩
`::.,`      #Push the string `::.,`
      ⑵     #Double the string
        ④⑩  #Print raw then nice without popping

10 bytes

`::.,`⑵:.,

This prints:

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

Which prints:

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

11 bytes

`::.,`6*:.,

This prints:

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

Which prints:

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

And so on

Try it online!

13 bytes

`::.,`!⑨*:(.,

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!

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

Python 2, 38 37 36 34 bytes

-1 bytes thanks to Jo King

s='print"s=%r;exec s;"%s+s';exec s

Try it online!


Python 3.8 (pre-release), 39 38 36 bytes

exec(s:='print("exec(s:=%r);"%s+s)')

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Batch

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

Javascript - 46

(function $(){console.log('('+$+'());$()')}())
\$\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
__"__"__"__"
\$\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.

\$\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.
\$\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
\$\endgroup\$
0
\$\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.
\$\endgroup\$
0
\$\begingroup\$

Befunge-98 (FBBI), 38 bytes

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

Try it online!

\$\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.

\$\endgroup\$
  • 1
    \$\begingroup\$ There's no issue solving old challenges. \$\endgroup\$ – PyRulez Jul 16 '19 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!

\$\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!

\$\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+
\$\endgroup\$
1 2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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