130
\$\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\$
14
  • 8
    \$\begingroup\$ I guess import in python is not permitted. \$\endgroup\$
    – Alexandru
    Feb 1 '11 at 0:07
  • 27
    \$\begingroup\$ Does these rules apply to language keywords as well? \$\endgroup\$
    – hallvabo
    Feb 1 '11 at 13:04
  • 9
    \$\begingroup\$ are those case insensitive restrictions? \$\endgroup\$
    – Rommudoh
    Aug 4 '11 at 14:22
  • 23
    \$\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\$ Aug 5 '11 at 23:01
  • 5
    \$\begingroup\$ @trinithis, and others, ASCII character 72 is "H" which is why I chose those two \$\endgroup\$ Sep 18 '11 at 23:18

132 Answers 132

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

Detour, 18 bytes

`<u
@'Ifmmp!Xpsme'

Basically the same as @gnibbler's answer, only breaks rule 2.

Try it online!

The 19-byte version breaks none of the rules:

Detour, 19 bytes

`<<u
@'Jgnnq"Yqtnf'

Try it online!

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

JavaScript, 77 70 69 characters

This satisfies conditions number 2 and 3.

"H"+([]+![])[4]+"ll"+([]+{})[+!![]]+" W"+([]+{})[+!![]]+([]+!![])[+!![]]+"ld"

a=!![];b=([]+{});c=b[+a];"H"+([]+![])[4]+"ll"+c+" W"+c+([]+a)[+a]+"ld"

a=!![];b=([]+{});c=b[+a];`H${([]+![])[4]}ll${c} W${c}${([]+a)[+a]}ld`

Please help me shorten this up.

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

Molecule, 7 chars (18 bytes)

"ৣ҆͢๡Ԫł"C

Molecule uses Chocolate Compressor to compress strings.
So I just decompress it.

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

tcl, 104

\u6cmap x {G d k k n \U1F V n q k c} {scan $x %c n;incr n;puts -n\u6Fn\u65w\u6cin\u65 [f\U6Frmat %c $n]}

Almost meets 3 requirements. Unfortunately I am not successful when I try to use directly the char by key pressing Alt+Num 31, representable as:

Dec U-Hex  Oct
\31 \U1F   \037

which happens to have forbidden chars in all number bases!

Available to run on: http://rextester.com/live/GQBHU26987

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

Ruby, 51 bytes

Chars not used: hlwd27

puts "Ifmmp!Xpsme".chars.map{|i|(i.ord-1).chr}.join
\$\endgroup\$
0
\$\begingroup\$

Perl, 33 bytes

print 'Ifmmp Xpsme'=~y/G-t/F-s/r

Breaks rule 2.

Alternatively:

perl -E "say 'Ifmmp Xpsme'=~y/G-t/F-s/r"

I think this counts as one byte shorter...

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

Mathematica 144 Bytes

StringJoin@Insert[ToUpperCase@StringPart[#,1]<>StringPart[#,5-3;;]&/@IntegerString[{349644888483444,656639565449499}/(498331*8*3+3),36]," ",5-3]

This is a pain in Mathematica because so few functions adhere to rules 2 & 3. This answer adheres to rules 1 & 2 and also takes care to do the Capitalization. I couldn't even use the built in Capitalize function. The basic idea is to find the base 10 representation of the string assuming it's in base 36.

as can be seen by running

Select[Names["System`*"],StringFreeQ[#,{"h","l","w","d"},IgnoreCase->True]&&StringFreeQ[#,{"e","o","r","0","1"},IgnoreCase->True]&&UpperCaseQ[StringPart[#,1]]&]

which yields a handful of built in symbols, only some of which are functions, and none of which are helpful with string manipulation.

{Abs,Annuity,Ask,Assuming,Axis,Back,C,Cap,Csc,Cubics,Cup,CupCap,Cyan,Fit,Gamma,I,If,Im,In,Infinity,Infix,Inpaint,Input,K,Magnify,Map,MapAt,Masking,Max,Min,MinMax,Minus,Missing,MissingQ,N,NSum,Pi,Pick,Pink,Put,QGamma,Quantity,QuantityQ,QuantityUnit,Quit,Scan,Sign,Sin,Sinc,Skip,Spacings,Span,Stack,Stub,SubMinus,Sum,Syntax,SyntaxQ,Tab,TabSpacings,Tan,Ticks,Timing,Tiny,Up,Using}

A single function solution that came to mind was:

Transliterate["הֶללֳ וֳרלד"]

which translates from Hebrew characters, but as you can see it it violates rules 2 and 3.

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

Jelly, 7 bytes (non-competing)

“½,⁾ẇṭ»

Try it online!

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

PHP, 41 bytes

<?for(;$a='Gdkkn vnqkc'[$p++];print++$a);

Complies with rules 1 and 3.

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

TeX, 39 bytes

Meets conditions 1 and 2:

^^48^^%^^,^^,^^/ ^^57^^/^^2^^,^^$\by^^%

Try it online!

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

Pxem, 0 bytes (content) + 41 36 bytes (filename).

Inspired by @MD FX.

  • Filename (escaped): ayIfmmp!Xpsme?.z\001.-.t.v.m.v.c?.a.s.p
  • Content: empty

What it does

  • Push next characters
  • Decrement each of them
  • Output them finally

Try it online!

Previously

41 bytes

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

Excel 138

(Not actually a language and not really obfuscated, but why not)

=CONCAT(CHAR(69+3),CHAR(98+3),CHAR(99+9),CHAR(99+9),CHAR(45+66),CHAR(35-3),CHAR(33+86),CHAR(43+68),CHAR(48+66),CHAR(44+64),CHAR(45+55))

Violates rule #2 tho, as it contains 'o' and 'r'

\$\endgroup\$
2
  • 4
    \$\begingroup\$ it also contains H (rule #1). \$\endgroup\$
    – Andrey
    Jan 18 '17 at 9:27
  • \$\begingroup\$ 1. CHAR automatically violates 1 and 2. 2. Older Excel versions use CONCATENATE, but besides that, you can use the & operator. I've posted another answer that doesn't break Rule 1. \$\endgroup\$ Jun 15 '20 at 15:39
1 2 3 4
5

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.