# I double the source, you double the output!

Your task, if you wish to accept it, is to write a program that outputs a positive integer (higher than 0). The tricky part is that if I duplicate your source code, the output must be double the original integer.

# Rules

• You must build a full program. That is, your output has to be printed to STDOUT.

• The initial source must be at least 1 byte long.

• Both the integers must be in base 10 (outputting them in any other base or with scientific notation is forbidden).

• Your program must not take input (or have an unused, empty input).

• Outputting the integers with trailing / leading spaces is allowed.

• You may not assume a newline between copies of your source.

• This is , so the shortest (original) code in each language wins!

• Default Loopholes apply.

### Example

Let's say your source code is ABC and its corresponding output is 4. If I write ABCABC instead and run it, the output must be 8.

This uses uses @manatwork's layout.

/* Configuration */

var QUESTION_ID = 132558; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8349457; // This should be the user ID of the challenge author.

/* App */

return "https://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

}

jQuery.ajax({
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(a) {
});
comment_page = 1;
}
});
}

jQuery.ajax({
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
});
else process();
}
});
}

var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(-?\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;

function getAuthorName(a) {
return a.owner.display_name;
}

function process() {
var valid = [];

var body = a.body;
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});

var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
});

});

valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});

var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;

.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)

var lang = a.language;
if (! /<a/.test(lang)) lang = '<i>' + lang + '</i>';
lang = jQuery(lang).text().toLowerCase();

languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link, uniq: lang};
});

var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);

langs.sort(function (a, b) {
if (a.uniq > b.uniq) return 1;
if (a.uniq < b.uniq) return -1;
return 0;
});

for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
language = jQuery(language);
jQuery("#languages").append(language);
}

}
body { text-align: left !important}

width: 290px;
float: left;
}

#language-list {
width: 290px;
float: left;
}

font-weight: bold;
}

table td {
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>

</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<tr><td>Language</td><td>User</td><td>Score</td></tr>
<tbody id="languages">

</tbody>
</table>
</div>
<table style="display: none">
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
</tbody>
</table>

• @Mr.Xcoder Then I'll just have to include one in my own source. Jul 15, 2017 at 17:55
• @Mr.Xcoder I think that you should have prevented reading your own source code. Jul 15, 2017 at 18:09
• It only needs to work when doubled once? We don't need to support n many doublings? Jul 16, 2017 at 8:36
• @Daniel Let's say your source is  (empty program) and it produces 5. If you double it, your source is  (empty program) and that produces 5 as well, no matter what you do. That being said, an empty program duplicated is still the empty program, and always produces the same output, except for the case where the empty program means something else (a random number generator, for example), which could not be valid anyway. Jul 17, 2017 at 9:11
• This shouldn't be hard for esolangs that automatically dump the top of stack upon program termination. Jul 18, 2017 at 22:26

# WinDBG, 40 bytes

r$t0=d;r$t0=@$t0*2;.printf"\r%d",@$t0;$$ Outputs 26, and that doubles each time the source is appended. How it works: r t0 = d; Initialize psuedo-register t0 to 13 r t0 = @t0 * 2; Double t0 .printf "\r%d", @t0; Move caret to start of output line and print t0$$                                   Comment until the next ; (comment r $t0 = d)  Sample output: 0:000> r$t0=d;r$t0=@$t0*2;.printf"\r%d",@$t0;$$26 0:000> rt0=d;rt0=@t0*2;.printf"\r%d",@t0;$$r$t0=d;r$t0=@$t0*2;.printf"\r%d",@$t0;$$52 0:000> rt0=d;rt0=@t0*2;.printf"\r%d",@t0;$$r$t0=d;r$t0=@$t0*2;.printf"\r%d",@$t0;$$rt0=d;rt0=@t0*2;.printf"\r%d",@t0;$$ 104 0:000> r$t0=d;r$t0=@$t0*2;.printf"\r%d",@$t0;$$rt0=d;rt0=@t0*2;.printf"\r%d",@t0;$$r$t0=d;r$t0=@$t0*2;.printf"\r%d",@$t0;$$rt0=d;rt0=@t0*2;.printf"\r%d",@t0;$$ 208  ## Scala (interpreted), 85 Bytes if(System getProperty "v"eq "")print(2)else{System.setProperty("v","");print("1\r")};  Commented if(System getProperty "v"eq "") // If the system property "v" is set to "" print(2) // Print 2 else{ // Otherwise System.setProperty("v",""); // Set the system property "v" to "" print("1\r") // Print 1 with a carriage return };  Text that ends with a carriage return and not a newline will be overwritten if anything else is written to the line. Note: likely doesn't work on all consoles, tested on Windows 8.1 command prompt. For example the TIO console. ## Lua, 63 bytes a=1+(a or 0)t=setmetatable(t or{},{__gc=function()print(a)end})  This code does not have a newline at the end. When program starts, variable a is nil, then it gets modified from nil to 1 and (if program code is doubled) from 1 to 2. The finalizer of table t gets executed when program finishes (when memory of the table is released), it simply prints last value of variable a. Lua 5.2+ is required. • Seems like it prints nothing. Checked it at lua.org/cgi-bin/demo. Isn't it too late to print when the finalizer is called? Jul 19, 2017 at 9:29 • @Qwertiy - Thanks for bugreport. It is a bug on Lua demo web page. Jul 22, 2017 at 20:43 • Yep, fine: ideone.com/5xuJhk & ideone.com/poh01N Jul 22, 2017 at 21:26 • You can golf this down to 64 bytes (from 76 bytes at current) by removing whitespace (see Here) Aug 1, 2017 at 12:24 • @TaylorScott - All the bytes are <s>belong to us</s> counted! They are 63. Newline was removed. Aug 3, 2017 at 18:53 # Ruby, 21 bytes $.+=1
END{p$. exit!};  # Ruby, 31 bytes x||=1;x*=2;END{p x;exit!};  Try it online! • You can use END instead of at_exit for -7 bytes. Dec 17, 2017 at 23:02 • @Jordan nice, thanks! I've edited to incorporate that, but your answer is still shorter so I hope that's okay with you :) Dec 18, 2017 at 15:49 • Totally fine. Nice answer! Dec 18, 2017 at 15:50 # Implicit on TIO, 2 bytes :.  Hmm, not particularly positive how this works. I'll explain it to myself: :. (implicit read integer input), duplicate stack (stack: 0, 0) . increment (stack: 0, 1)  Ok, now I see. : doesn't read input if the stack has a value on it. :.:. : stack: 0, 0 . stack: 0, 1 : stack: 0, 1, 1 . stack: 0, 1, 2  Only works on TIO (:., :.:.) when the input box is empty. • Would this not also work if you redirect STDIN to an empty file, or if you press Ctrl + Shift + 2 when prompted for input? Sep 7, 2017 at 5:32 • @LyricLy Yes, but those require extra bytes. Sep 8, 2017 at 2:42 • I don't understand. Doesn't it work that way already? Both methods would be sending empty input, just like TIO does. Or am I misunderstanding the reason that it only works on TIO? Sep 8, 2017 at 2:45 • @LyricLy Yes, it works that way. But redirecting to STDIN would require, in a shell, ./interpreter sourcefile < emptyfile, and assuming you have an empty file is a standard loophole. Pressing Ctrl+Shift+2 would require user input that is not specified in the challenge, another standard loophole. Sep 8, 2017 at 2:46 • I wouldn't consider merely requiring EOF to be piped to the program a standard loophole, but I see where you're coming from. Sep 8, 2017 at 2:52 # Pyt, 2 bytes 0Ł  Explanation: 0 Push 0 onto the stack [0] Ł Get the length of the stack (1)  Doubled: 0Ł0Ł  Explanation: 0 Push 0 onto the stack [0] Ł Get the length of the stack (1) 0 Push 0 onto the stack [1,0] Ł Get the length of the stack (2)  # Chip, 11+5 = 16 bytes +5 bytes for -wc1 <b *\ae*f   ### The active code: *\ae*f  Activates a, e, and f which means 0x00110001. ### Active code when doubled:  b *\ae*f < *\a  Prevents activation of both a's, activates b, e, and f, which means 0x00110010. Try it online! # tinylisp, 16 bytes ((q(G(i G 2 1)))  Try it online! Try it doubled! ### How? (q (G (function-body))) creates an unnamed lambda function that takes a variable number of arguments and names the arglist G. In our case, the body of the function is (i G 2 1), which tests if G is empty or not; if it is, we return 1; if it isn't, we return 2. In other words, if we call this function with zero arguments, it returns 1; otherwise, 2. In the single version, therefore, we call the function without arguments: (function (with an implicit closing parenthesis). In the double version, we call the function, and then call it again with that result as an argument: (function (function (with two implicit closing parentheses). # Newline 3 bytes i\n  Note: running newline in TC mode Output is the red text up top Try it online • You should indicate a newline by leaving an empty line in the code block, not by using an escape sequence. Aug 22, 2017 at 22:38 • You're referring to the last line of code, correct? That is an actual newline; the string literal is 2 bytes (i and a newline), but its representation in JavaScript source is three (i\n). Your submission here should be encoded as text, not JavaScript source. Aug 23, 2017 at 1:32 • Could you provide a reference to the thread on Meta? You posted a 3-byte solution here, but the solution you link to is 2 bytes. This doesn't make sense to me. Aug 23, 2017 at 21:24 • continuing in chat Aug 24, 2017 at 21:25 • @Christopher This has nothing to do with rewriting the interpreter in another language. The source code of your program in memory is 2 bytes, not 3. Whether you create that string with a literal (which takes more than 2 characters) or read it from a file (which would contain 2 characters) doesn't matter. Feb 13, 2018 at 14:15 # Microscript, 2 bytes 1  (Note the trailing space.) # SNOBOL4 (CSNOBOL4), 48 bytes  INPUT('I',1,,'.code.tio'); OUTPUT =size(I);end;  Try it online! Equivalent to this python answer. Because the existence of an END label terminates the program, reading the source file is the only way to get this to work, as the program ABCABC is otherwise equivalent to ABC. SNOBOL always reads input one line at a time so we have to use ; rather than newlines. # Stax, 2 bytes |X  Added for completeness. |X in Stax means increment register x and push. Register x is implicitly initialized with 0. The top of stack is implicitly output. # SmileBASIC, 11 10 bytes CLS?X+1X=1  # Yabasic, 22 bytes An Anonymous function that takes no input and outputs to STDOUT in graphics mode. Clear Screen n=n+1 ?n  Note: Because this answer uses graphics mode, it does not function on TIO # Fission, 13 bytes O\aL; +$
SV;


Returns 1

Try it online!

Doubled:

O\aL;
+
$SV;O\aL; +$
SV;


Returns 2

Try it online!

Fun twist with this language, that doubling source will double atoms, and each atom is in general command pointer. So my idea was to build such code that second atom will be destroyed.

  L  Created atom, moving left (mass 1, energy 0)
a   stores in it ascii code of 'a' (97)
\    mirrors
V   fission reactor, spliting atom into two with halved masses (48)
;  destroy right atom
S    conditional mirror - mirrors right, if energy is zero (default energy level)
$increase energy by 1 (mass 48, energy 1) + increase mass by one (mass 49)  if one copy on source: O print ascii by mass of atom, destroy atom (prints 1)  if code was copied S conditional mirror - energy is 1 now, so goes throw$    increase energy by 1 (mass 49, energy 2)
+    increase mass by one (mass 50)
O    print ascii by mass of atom, destroy atom (prints 2)


Second atom is created with copied code \aL; on 4th row. Mirror \ sends it to the ; on the first row, where atom is destroyed

## Reflections, 10 bytes

_~#  _#_v



### Explanation:

• _~: read own source and push size
• # _: convert to string
• #_: print the first digit
• v: reflects the IP down

Then, the program does either end when hitting the other v or when leaving the grid.

# QBasic, 12 bytes

A script that takes no input and outputs to the console. Outputs 1 when single, outputs 2 when doubled.

CLS
n=n+1
?n


# Small Basic, 45 bytes

A script which takes no input and outputs to the TextWindow console.

n=n+1
TextWindow.Clear()
TextWindow.Write(n)



Try it at SmallBasic.com

n=n+1
TextWindow.Clear()
TextWindow.Write(n)
n=n+1
TextWindow.Clear()
TextWindow.Write(n)



Try it Doubled at SmallBasic.com

SmallBasic.com depends on Silverlight, and thus the links must be opened in IE to function.

# Python 2, 25 24 bytes

x=1
print 4*'\b',x,;x=2#


Both values of x (1 and 2) get printed when the code is repeated. However the second time, the backspace character backspaces/"erases" the 1 and prints the 2 over the top of it.

The behaviour of printing the backspace escape character \b seems quite system dependent (and it doesn't seem to work on many web REPLs...).

Trailing comment idea inspired by W W's answer.

Edit: byte saved, see comment.

• Welcome to the site! Jul 17, 2018 at 17:52
• Why don't you put x=2 after the print and before the comment instead of multiplying by two before the print? Jul 17, 2018 at 17:54
• Thanks: I think that will save a byte or two... Jul 17, 2018 at 19:46

# Z80Golf, 6 bytes

00000000: 3676 f630 3ce5                           6v.0<.


Try it online!

### Doubled

00000000: 3676 f630 3ce5 3676 f630 3ce5            6v.0<.6v.0<.


Try it online!

### Disassembly

start:
ld (hl), $76 or$30
inc a
push hl


The trick is to exclude any call or rst instructions, so that the execution exactly follows the order:

• The program (one or two copies)
• The nop slide, then putchar at address $8000 (exactly once), and then • halt which should be hit on return from putchar. or$30; inc a sets up the ASCII '1' = $31 to print. push hl sets up the stack; ld (hl),$76 writes the halt instruction on the return address.

When doubled, the second inc a changes the value to ASCII '2' = \$32. The other instructions are effective no-ops; the return address and the halt instruction on return don't change.

1~@O+K~


Prints 1 on its own, 2 when doubled, 3 when tripled etc.

Try it online!

# Aheui, 23 bytes

분아떠망히
아뷴



outputs 4.

Doubled:

분아떠망히
아뷴
분아떠망히
아뷴



outputs 8.

Try it on jsaheui

## W, 2 bytes

1+


## Explanation

1+   % Adds an (implicit) 0 (on empty input)
1+ % Add the constant 1 by 1
% Implicit output


# MathGolf, 1 byte

)


Try it online!

# 05AB1E, 2 bytes

2*


Try it online!

2 pushes 2 to the stack.

* multiplies the last 2 elements of the stack.

# 05AB1E, 4 bytes

2*2*


Try it online!

## Javascript (NodeJS) 44 bytes

l={get a(){console.log(z)}};z=this.z?2:1;l.a


Or in a browser environment, 38 bytes:

l={get a(){alert(z)}};z=this.z?2:1;l.a


I found this really challenging, but really interesting. I probably overlooked a much simpler way of doing this.

Using a getter was the only way I could think of so far where appending the second copy of the string would not cause the initial behaviour to run before we get a chance to intervene. When it's repeated, we get:

l={get a(){console.log(z)}};z=this.z?2:1;l.al={get a(){console.log(z)}};z=this.z?2:1;l.a


The critical part is that l.a (the getter) only ends up happening once, because the first time it becomes l.al=...

# Pxem (esolang-box notation), 8 bytes.

In this docker environment Pxem program, officially given as a pair of filename and its content, is given as a file:

The first line is the file name of the pxem code.

The rest is the content of the pxem code.

Original is

.f.+.n
.


which is translated to filename .f.+.n with content .. It outputs 46, which is ASCII code for ..

When doubled:

.f.+.n
..f.+.n
.


which is translated to filename .f.+.n with content ..f.+.n\n.. It outputs 92.

## How it works

.f pushes content in reverse order
.+ does push (pop+pop) if size>=2; nop otherwise
.n does printf %d pop


Try it online!

Try it online!Try it online!

# Lenguage, 730750818665451459101842416358141509827966271746 bytes

Not doubled: Try it online!

Doubled: Try it online!

Not that golfed but at least it's a solution, handling loop is so hard

# Wolfram Language (Mathematica), 13 bytes

There is already another Mathematica answer, but this one is a full program instead of an REPL snippet.

Print@Depth@a


Try it online!

The depth of the expression a is 1.

Doubled:

Print@Depth@aPrint@Depth@a


Try it online!

aPrint@Depth@a is aPrint[1], which has depth 2.