125
\$\begingroup\$

Create the shortest possible obfuscated program that displays the text "Hello World".

In order to be considered an obfuscated program, it must meet at least two of the following requirements:

  • Does not contain the characters: h, l, w and d in any case
  • Does not contain the characters: e, o, r, 0, and 1 in any case
  • Does not contain the characters: 2 or 7

Input:
none

Output:
Hello World

Leaderboard

Here is a Stack Snippet to generate both a regular leaderboard and an overview of winners by language.

/* Configuration */

var QUESTION_ID = 307; // 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 = 48934; // 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 = jQuery(lang).text();
    
    languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
  });

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

  langs.sort(function (a, b) {
    if (a.lang > b.lang) return 1;
    if (a.lang < b.lang) 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/codegolf/all.css?v=83c949450c8b">
<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>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>

\$\endgroup\$
  • 6
    \$\begingroup\$ I guess import in python is not permitted. \$\endgroup\$ – Alexandru Feb 1 '11 at 0:07
  • 26
    \$\begingroup\$ Does these rules apply to language keywords as well? \$\endgroup\$ – hallvabo Feb 1 '11 at 13:04
  • 8
    \$\begingroup\$ are those case insensitive restrictions? \$\endgroup\$ – oenone Aug 4 '11 at 14:22
  • 20
    \$\begingroup\$ Could someone explain why 2 and 7 are not allowed? I'm just curious as I don't see why those were chosen in particular. \$\endgroup\$ – Thomas Eding Aug 5 '11 at 23:01
  • 4
    \$\begingroup\$ @trinithis, and others, ASCII character 72 is "H" which is why I chose those two \$\endgroup\$ – Kevin Brown Sep 18 '11 at 23:18

125 Answers 125

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

Z80Golf, 21 bytes

Contains unprintable bytes, so here's xxd (breaks rule 1):

00000000: 0063 6b71 6e56 1f6e 6b6b 6447 2e0b 7e3c  .ckqnV.nkkdG..~<
00000010: ff2d 20fa 76                             .- .v

Try it online!

    nop
    ld h, e ; 'Hello World' backwards if you add 1 to each byte
    ld l, e ; execution falls through
    ld (hl), c
    ld l, (hl)
    ld d, (hl)
    rra
    ld l, (hl)
    ld l, e
    ld l, e
    ld h, h
    ld b, a
    ld l, loop - 3
loop:
    ld a, (hl)
    inc a
    rst $38
    dec l
    jr nz, loop
    halt
\$\endgroup\$
0
\$\begingroup\$

DOS .com executable: 31 bytes

BE 13 01 AC B4 02 34 FF 88 C2 75 03 80 C4 4A CD
21 EB F0 B7 9A 93 93 90 DF A8 90 8D 93 9B FF

Stores the string byte-inverted, outputs using DOS syscalls. Contains none of the banned characters.

source:

.code16
.org 0x100
start:
 movw $str, %si
l:
 lodsb
 mov $0x02, %ah
 xor $0xff, %al
 mov %al, %dl
 jnz 1f
 add $0x4a, %ah
1: int $0x21
 jmp l
str:
.ascii "\xb7\x9a\x93\x93\x90\xdf\xa8\x90\x8d\x93\x9b\xff"
\$\endgroup\$
0
\$\begingroup\$

Runic Enchantments, 39 bytes

\>`''`
\+kw+kwb8qn;' 83*´34 f-;@

Try it online!

As seen in Notepad++ to better distinguish the non-printing bytes:

Notepad++ view

Violates only rule 1. I had fun computing the first line (a sequence of raw byte values). Alternatively I could have violated rule 2, but I felt that doing so was less obfuscated. There's four different methods used in the 39 byte solution for generating integer values, making it hard to figure out what's going on (compared to just some mathematical operators in the 17 byte solution).

39 byte solution must occupy two lines.

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

Gol><>, 21 bytes

"mu{x`)xuunQ"T:Z;9-ot

This is a program that JoKing made, golfing the heck out of it.

Try it online!

Old version, 37 bytes

"Fcjjm"b3+s"Umpjb"c&rT&M:&33-)QPPot|;

This is a really simple, not very creative way of doing this, all it does is just encode everything 2 below their actual ascii encoding, the hardest part is not using 'l', which in gol><> is the length of the stack!

Try it online!

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

Python 3, 85 bytes

Not golfed, but obfuscated.

input(('%c'*11)%(9*8,93+8,99+9,9+99,3999//36,4*8,9*9+6,3996//36,4353//38,36*3,5*4*5))

Try it online!

\$\endgroup\$
  • 1
    \$\begingroup\$ From a golfing standpoint, the fact that you're already using 11 to break rule 2 means that every code point except 72, 32, and 87 are valid (since 0 will also be allowed). From an obfuscation standpoint, I'm sure there are more creative and fun numbers you can use, like idk, 33**3//399-3 for 87, 3225%346 for 111, etc. \$\endgroup\$ – Value Ink Jun 7 '19 at 21:45
1 2 3 4
5

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