150
\$\begingroup\$

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.

Leaderboard

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 ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8349457; // This should be the user ID of the challenge author.

/* App */

var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;

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

function commentUrl(index, answers) {
  return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}

function getAnswers() {
  jQuery.ajax({
    url: answersUrl(answer_page++),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      answers.push.apply(answers, data.items);
      answers_hash = [];
      answer_ids = [];
      data.items.forEach(function(a) {
        a.comments = [];
        var id = +a.share_link.match(/\d+/);
        answer_ids.push(id);
        answers_hash[id] = a;
      });
      if (!data.has_more) more_answers = false;
      comment_page = 1;
      getComments();
    }
  });
}

function getComments() {
  jQuery.ajax({
    url: commentUrl(comment_page++, answer_ids),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      data.items.forEach(function(c) {
        if (c.owner.user_id === OVERRIDE_USER)
          answers_hash[c.post_id].comments.push(c);
      });
      if (data.has_more) getComments();
      else if (more_answers) getAnswers();
      else process();
    }
  });  
}

getAnswers();

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

var OVERRIDE_REG = /^Override\s*header:\s*/i;

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

function process() {
  var valid = [];
  
  answers.forEach(function(a) {
    var body = a.body;
    a.comments.forEach(function(c) {
      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],
        link: a.share_link,
      });
    
  });
  
  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;
    
    var answer = jQuery("#answer-template").html();
    answer = answer.replace("{{PLACE}}", lastPlace + ".")
                   .replace("{{NAME}}", a.user)
                   .replace("{{LANGUAGE}}", a.language)
                   .replace("{{SIZE}}", a.size)
                   .replace("{{LINK}}", a.link);
    answer = jQuery(answer);
    jQuery("#answers").append(answer);

    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)
                       .replace("{{LINK}}", lang.link);
    language = jQuery(language);
    jQuery("#languages").append(language);
  }

}
body { text-align: left !important}

#answer-list {
  padding: 10px;
  width: 290px;
  float: left;
}

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

table thead {
  font-weight: bold;
}

table td {
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/Sites/codegolf/all.css?v=617d0685f6f3">
<div id="answer-list">
  <h2>Leaderboard</h2>
  <table class="answer-list">
    <thead>
      <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
    </thead>
    <tbody id="answers">

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

    </tbody>
  </table>
</div>
<table style="display: none">
  <tbody id="answer-template">
    <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr>
  </tbody>
</table>

\$\endgroup\$
33
  • 2
    \$\begingroup\$ @Mr.Xcoder Then I'll just have to include one in my own source. \$\endgroup\$
    – steenbergh
    Jul 15, 2017 at 17:55
  • 3
    \$\begingroup\$ @Mr.Xcoder I think that you should have prevented reading your own source code. \$\endgroup\$ Jul 15, 2017 at 18:09
  • 2
    \$\begingroup\$ It only needs to work when doubled once? We don't need to support n many doublings? \$\endgroup\$ Jul 16, 2017 at 8:36
  • 8
    \$\begingroup\$ @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. \$\endgroup\$
    – Mr. Xcoder
    Jul 17, 2017 at 9:11
  • 1
    \$\begingroup\$ This shouldn't be hard for esolangs that automatically dump the top of stack upon program termination. \$\endgroup\$
    – MD XF
    Jul 18, 2017 at 22:26

160 Answers 160

1 2 3 4 5
6
1
\$\begingroup\$

05AB1E, 2 bytes

2*

Try it online!

2 pushes 2 to the stack.

* multiplies the last 2 elements of the stack.

Doubled

05AB1E, 4 bytes

2*2*

Try it online!

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

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=...

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

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!

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

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

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

brainfuck, 41 bytes

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

Try it online!

Try it online!Try it online!

Contecting two brainfuck programs always output the output of first program, so 1 and 1.999... is the only choice

\$\endgroup\$
1
  • \$\begingroup\$ I remember I've seen a brainfuck solution using \b to erase but I can't find it(even not a removed one) \$\endgroup\$
    – l4m2
    Feb 15, 2022 at 6:11
1
\$\begingroup\$

Uiua (0.0.18): 9 bytes

(unfortunately not 7 bytes because Uiua has no single-byte codepage yet)

⍣'2;'1;

Try it online or Try it online doubled

Explanation: is the try glyph, so it attempts to pop an item off the stack and then push 2. This fails, because the stack is empty, so instead it switches to the other branch, where it pops off the (automatically pushed) error description and then pushes 1. If the code is doubled, the second time it is successful at popping an item off the stack, and so it continues on the main branch and outputs 2 instead.

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

05AB1E, 2 bytes

¼¾

Try it online!

¼¾  # full program
¼   # increment counter_variable (initially 0)
 ¾  # push counter_variable
    # implicit output

Doubled, 4 bytes

¼¾¼¾

Try it online!Try it online!

¼¾¼¾  # full program
¼     # increment counter_variable (initially 0)
 ¾    # push counter_variable
  ¼   # increment counter_variable
   ¾  # push counter_variable
      # implicit output
\$\endgroup\$
0
\$\begingroup\$

Pxem, 0 bytes (content) + 21 bytes (filename); requires to be executed on console.

  • Content is empty.
  • Filename (escaped): \001.r.v.w.s\b2.p.d.a11.o

Try it online!

Try it online!Try it online!

How it works

When single, it just outputs 1; when doubled, it appends backspace character and 2; this is how it looks like as if it were doubled. If this would violate the rules, I'm sorry.

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

Python 3 (notebook), 2 bytes

+1

This only works in a notebook enviroment. Also, You can replace the 1 with any p. number and it'll work.

Try it online!

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

Thunno, \$ 2\log_{256}(96) \approx \$ 1 byte

(actually 1.65 bytes but the leaderboard doesn't accept that)

1+

Attempt This Online!

Or try it doubled

Pretty straight-forward approach. The stack starts off at [0] so the first + doesn't do anything.

Alternative approach, \$ 3 \log_{256}(96) \approx \$ 2.47 bytes

zdL

Attempt This Online!

Or try it doubled!

(Sort-of) port of Wheat Wizard's Python solution:

  • zd gets the source code
  • L gets the length
  • (Implicit output of the top of the stack)

When you double it, it will run it twice, and just end up with 6 on the top of the stack.

\$\endgroup\$
1 2 3 4 5
6

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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