122
\$\begingroup\$

Your favourite programming language has just had a birthday. Be nice and sing it the Happy Birthday song.

Of course you should accomplish this by writing a program in that language. The program takes no input, and writes the following text to the standard output or an arbitrary file:

Happy Birthday to You
Happy Birthday to You
Happy Birthday Dear [your favourite programming language]
Happy Birthday to You

You should substitute the bracketed part (and omit the brackets).

This is a code golf — shortest code wins.

UPDATE

I'm glad that the question aroused great interest. Let me add some extra info about scoring. As stated originally, this question is a code golf, so the shortest code is going to win. The winner will be picked at the end of this week (19th October).

However, I'm also rewarding other witty submissions with up-votes (and I encourage everybody to do so as well). Therefore although this is a code-golf contest, not-so-short answers are also welcome.

Results

Congratulations to Optimizer, the winner of this contest with his 42 byte long, CJam submission.

Leaderboard

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

/* Configuration */

var QUESTION_ID = 39752; // 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\$
  • 2
    \$\begingroup\$ Can we count the name of the programming language as one byte because it would only seem fair to people coding in a long-winded language such as JavaScript vs. someone doing it in C. We are really looking for most creative logic right? \$\endgroup\$ – MonkeyZeus Oct 13 '14 at 18:49
  • 14
    \$\begingroup\$ Why all the upvotes for this despite all the downvotes for the Bonbon song? This is just as boring a challenge. \$\endgroup\$ – xnor Oct 14 '14 at 7:15
  • 10
    \$\begingroup\$ I should probably mention that the song is copyrighted and distributing these programs may cause a DMCA \$\endgroup\$ – ratchet freak Oct 14 '14 at 14:38
  • 12
    \$\begingroup\$ guys! Happy Birthday song is now in public domain!! \$\endgroup\$ – Optimizer Sep 23 '15 at 10:01
  • 5
    \$\begingroup\$ At least one of the answers prints a leading newline. Is that allowed? \$\endgroup\$ – Dennis Jun 19 '16 at 21:32

190 Answers 190

1
3 4 5
6
7
0
\$\begingroup\$

JS 70 Bytes

alert([c=(a="Happy Birthday")+" to You",c,a+" Dear JS",c].join("\n"));
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Swift, 68 bytes

(1...4).map{print("Happy Birthday "+($0==3 ?"dear Swift":"to You"))}

also differently:

print({$0+$1+$0+$1+$0+"dear Swift"+$0+$1}("\nHappy Birthday ","to You"))

with 71 bytes

| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ Another 70-byte alternative: for i in 1...4{print("Happy Birthday "+(i==3 ?"Dear Swift":"to You"))} \$\endgroup\$ – Mr. Xcoder Aug 3 '17 at 6:22
0
\$\begingroup\$

HPPPL (HP Prime Programming Language), 88

n:=char(10);a:="Happy Birthday ";b:="To You";c:="Dear HPPPL";d:=a+b+n;print(d+d+a+c+n+d)

Result:

Happy Birthday To You HPPPL

HPPPL is the programming language for the HP Prime color graphing calculator/CAS. An emulator is available at the HP website.

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Stringy, 78 bytes

(Happy birthday );a to you;p;p;^ to you!dear Stringy;p;^ dear Stringy!to you;p
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Mouse-2002, 70 bytes

Mouse isn't very skilled at . :(

$H"Happy Birthday "@
$Y"to you!"@
#H;#Y;#H;#Y;#H;"Dear Mouse!"#H;#Y;$

The exclamation points print newlines, not themselves, and the $H and $Y are functions, not variables, because poor Mouse can't comprehend strings.

MUSYS, MUsic-SYStem, Mouse's predecessor, 93 bytes

"Happy Birthday to you!Happy Birthday to you!Happy birthday dear MUSYS!Happy Birthday to you"
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Staq, 67 66 chars

{h"Happy Birthday "}{T"To You"}{D"Dear Staq"}{N&iiqi,;}hTNhTNhDNhT

Result:

Executing D:\codegolf\Happy Birthday Staq.staq

Happy Birthday To You
Happy Birthday To You
Happy Birthday Dear Staq
Happy Birthday To You

Execution complete.
>
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

JavaScript, 70 Bytes

a="Happy Birthday ";b=a+"to You\n";c=a+b;d=c+c+a+"Dear JavaScript\n"+c

Best answer JavaScript answer so far!

a="Happy Birthday ";
b=a+"to You\n";
c=a+b;                         // Create string "Happy Birthday to You\n"
d=c+c+a+"Dear JavaScript\n"+c  // Create song

Implementation:

a="Happy Birthday ";b=a+"to You\n";c=a+b;d=c+c+a+"Dear JavaScript\n"+c
alert(d);
console.log(d);
| improve this answer | |
\$\endgroup\$
  • 1
    \$\begingroup\$ You're not allowed to leave output in a variable. You have to write a full program which prints it or a function which returns it. \$\endgroup\$ – FlipTack Jan 11 '17 at 17:04
0
\$\begingroup\$

Edited Processing.js 80 bytes

var a="\nhappy birthday to you";print(a+a+"\nHappy birthday processing.js"+a);

Processing JS is a language that is fun but I am lazy and use an edited version that also is ungolfable. Try it online Println was used so you don't have to open the console :P

Khanacademy version

| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ Ah, it's the Khan Academy version. Perhaps you should mention that somewhere (also, I believe the source code is here) \$\endgroup\$ – ETHproductions Mar 6 '17 at 23:33
0
\$\begingroup\$

ZPL (Zebra Programming Language), 112 bytes

This is a just for fun answer.

^XA^FB137,4^FDHappy Birthday to You\&Happy Birthday to You\&Happy Birthday Dear ZPL\&Happy Birthday to You^FS^XZ

Try It Online

Explanation:

^XA                                # Start Format
    ^FB                            # Field Block
        137,                       # Width of text block line (in dots)
        4                          # Maximum number of lines in text block
    ^FD                            # Field Data
        Happy Birthday to You      # Hardcoded String
        \&                         # New Line (as allowed by the ^FB command)
        Happy Birthday to You      # Hardcoded String
        \&                         # New Line (as allowed by the ^FB command)
        Happy Birthday Dear ZPL    # Hardcoded String
        \&                         # New Line (as allowed by the ^FB command)
        Happy Birthday to You      # Hardcoded String
    ^FS                            # Field Separator
^XZ                                # End Format

Note: The Zebra Programming Language is a printer control language that is not Turing complete.

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Sprects, 49 bytes

.12121Dear Sprects\n12.1Happy Birthday .2to You\n

Try it here

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

C, 74 bytes

i=5;main(){while(--i)printf("Happy Birthday %s\n",i-2?"to You":"Dear C");}

Detailed

void main()
{
    int i = 5;

    while (--i > 0)
    {
        printf("Happy Birthday %s\n",
        i!=2 ? "to You" : "Dear C" );
    }
}
| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ You're supposed to write a program, not a function. Change f() to main() and it should be OK (but one character longer than V-X's answer). \$\endgroup\$ – r3mainer Apr 19 '17 at 11:44
  • \$\begingroup\$ @squeamishossifrage fixed. \$\endgroup\$ – Khaled.K Apr 19 '17 at 12:48
0
\$\begingroup\$

C++, 92 bytes

#include<iostream> 
int main(int c){for(c=4;c--;)std::cout<<"Happy Birthday "<<(c-1?"To You":"Dear C++")<<"\n";}

Try it online

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Batch, 72 bytes

@SET h=@ECHO Happy Birthday 
%h%to You
%h%to You
%h%Dear Batch
%h%to You
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Fourier, 52 bytes

|`Happy Birthday `|A|`to You
`|BABABA`Dear Fourier
`AB

Try it online!

Nothing particularly special except that it demonstrates that you can have newlines in string prints.

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Braingolf, 69 bytes

"Happy Birthday to You
"VR{.M}v&,6>[$_]"dear Braingolf
"R!&@!&@v&@c&@

Try it online!

Explanation

"Happy Birthday to You
"

Pushes "Happy Birthday to You\n" to the stack

VR{.M}

Creates a 2nd stack and duplicates the contents of the first stack to it, in reverse order

v&,

Switches to the 2nd stack and flips the entire stack

6>[$_]

Drops the last 7 items from the 2nd stack

"dear Braingolf
"

Pushes "dear Braingolf\n" to the 2nd stack

R!&@!&@

Prints the contents of the first stack twice

v&@

Prints the contents of the 2nd stack

c&@

Prints the contents of the first stack

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

tcl, 69 68 65

puts "[set t [set h Happy\ Birthday]\ To\ You]
$t
$h Dear tcl
$t"

demo

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Cubically, 813 bytes

I guess this belongs here now too! Loops haven't been added to the language yet, so this is the best I can manage.

+53@6:5+2/1+55@6:4/1+552@66+1@6:5/1+3@6/1+52@6:5+1/1+551@6+1@6:5+3/1+552@6:5/1+551@6:1/1+551@6:5+2/1+55@6:4/1+553@6:5/1+3@6:5+3/1+552@6:3/1+552@6:5/1+3@6:5+3/1+54@6:3/1+552@6:5+53@6:1/1+1@6:5+3@6:5+2/1+55@6:4/1+552@66+1@6:5/1+3@6/1+52@6:5+1/1+551@6+1@6:5+3/1+552@6:5/1+551@6:1/1+551@6:5+2/1+55@6:4/1+553@6:5/1+3@6:5+3/1+552@6:3/1+552@6:5/1+3@6:5+3/1+54@6:3/1+552@6:5+53@6:1/1+1@6:5+3@6:5+2/1+55@6:4/1+552@66+1@6:5/1+3@6/1+52@6:5+1/1+551@6+1@6:5+3/1+552@6:5/1+551@6:1/1+551@6:5+2/1+55@6:4/1+553@6:5/1+3@6+4@6:2/1+551@6:5+2/1+55@6:5+1/1+552@6:5/1+3@6:4/1+52@6:5+53@6:5+3/1+55@6:5+1/1+551@6:5+51@6:5+2/1+55@6:5+52@66:4/1+553@6:1/1+1@6:5+3@6:5+2/1+55@6:4/1+552@66+1@6:5/1+3@6/1+52@6:5+1/1+551@6+1@6:5+3/1+552@6:5/1+551@6:1/1+551@6:5+2/1+55@6:4/1+553@6:5/1+3@6:5+3/1+552@6:3/1+552@6:5/1+3@6:5+3/1+54@6:3/1+552@6:5+53@6

Try It Online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Pyth, 49 bytes

Since the other Pyth answer is quite outdated and non-competing has been removed per meta consensus, here is a newer answer:

K"Happy Birthday "J+K"to You\n"+*J2+K"Dear Pyth"J

Try it online!

Pyth, 50 bytes

K+"Happy Birthday to You"b+++KK++<K15"Dear Pyth"bK

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

AWK, 70 bytes

BEGIN{for(x=-3;x<1;)print"Happy Birthday "(s=++x?"to You":"Dear AWK")}

Try it online!

I didn't see an AWK solution, so here we go. :)

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Golfscript, 56 bytes

Thanks, professorfish!

"Happy Birthday ":h"to You\n"+:s s h"dear Golfscript\n"s

Output:

Happy Birthday to You
Happy Birthday to You
Happy Birthday dear Golfscript
Happy Birthday to You
| improve this answer | |
\$\endgroup\$
  • 1
    \$\begingroup\$ You don't need to concatenate them; they'll all be printed anyway \$\endgroup\$ – user16402 Oct 13 '14 at 19:17
  • 1
    \$\begingroup\$ and you seem to do "Happy Birthday ":h;h - why do you need to pop the value and then push it again? "Happy Birthday ":h will have the same effect AFAIK. same for :s;s \$\endgroup\$ – user16402 Oct 13 '14 at 19:32
0
\$\begingroup\$

SOGL V0.12, 29 bytes

‰║M─╬RS‘ūΖTtŗQQ"8Ν¼ģ^ļ&NZøe‘O

Try it Here!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Canvas, 43 bytes

3[to You¶}Dear Canvas¶)«∑Happy Birthday 4*×

Try it online!

With notes (not valid code, as Canvas does not support comments):

3[to You¶}                                      Push the string "to You\n" to the stack three times
            Dear Canvas¶                          Push the string "Dear Canvas\n" to the stack
                        )                        Compress the stack to an array
                          «                       Shift the array once to the left
                           ∑                      Join all strings in the array to one string
                            Happy Birthday 4*   Push the string "Happy Birthday " repeated four times vertically to the stack
                                               ×  Concatenate the second object in the stack to the first object in the stack
                                                  Print the object at the top of the stack (implicit)
| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ 40 bytes \$\endgroup\$ – dzaima Jul 30 '18 at 16:43
0
\$\begingroup\$

Add++, 55 bytes

L,"Happy Birthday "dddB]"To You"ddV"Dear Add++"GBCBcB+n

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Python 2, 82 Bytes

h="Happy Birthday";y='to You';d="Dear Python";print h,y,'\n',h,y,'\n',h,d,'\n',h,y

Still getting my head around slicing...

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Attache, 54 bytes

Print=>4&("Happy Birthday "+2&"To You"'"Dear Attache")

Try it online!

Explanation

2&"To You"'"Dear Attache"
2&"To You"                  resizes "To You" into a 2-length array
          '"Dear Attache"   concatenate with "Dear Attache"

                            result: ["To You", "To You", "Dear Attache"]


"Happy Birthday "+_         Adds this string to each element
                            result: ["Happy Birthday To You", "Happy Birthday To You", "Happy Birthday Dear Attache"]

4&(_)                       Resizes the array to size 4
                            result: ["Happy Birthday To You", "Happy Birthday To You", "Happy Birthday Dear Attache", "Happy Birthday To You"]

Print=>_                    Prints each member on its own line
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

jamal, 57 characters

{@for _(///dear jamal/0)Happy Birthday {@if/_/_/to You}
}

Sample run:

bash-4.4$ jamal.pl birthday.jam 
Happy Birthday to You
Happy Birthday to You
Happy Birthday dear jamal
Happy Birthday to You
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

C\C++ Preprocessor, 244 224 bytes

Live in C

Live in C++

#define A "to"
#define B "You"
#define C "C"
#ifdef __cplusplus
#define C "C++"
#endif
#define D "Dear"
#define E "Happy Birthday"
#define H printf("%s %s %s \n",E,A,B)
int main(){H;H;printf("%s %s %s \n",E,D,C);H;return 0;}
| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ You don't need the "return 0"... Also, too many whitespaces. Why do you split E and F? ... \$\endgroup\$ – user202729 Jun 26 '18 at 8:23
  • \$\begingroup\$ @user202729 just made E and F the same thing, return is needed for it to work in C++ \$\endgroup\$ – Khaled.K Jun 26 '18 at 17:54
0
\$\begingroup\$

Charcoal, 56 bytes

≔Happy Birthdayη≔ to YouτP⁺ητ↓P⁺ητ↓P⁺η”↶ G↗5▶h…≡-⌕”↓P⁺ητ

Try it online! (Link to the verbose version.)

It wasn't fair that Charcoal still hadn't its own birthday party...

| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ 47 \$\endgroup\$ – ASCII-only Aug 6 '18 at 6:23
0
\$\begingroup\$

Noether, 54 bytes

"Happy Birthday "~s"to You"+~mP?P?sP"Dear Noether"P?mP

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

MBASIC, 93 bytes

1 FOR I=1 TO 4:PRINT"Happy Birthday ";:IF I=3 THEN PRINT"Dear MBASIC"ELSE PRINT"to You"
2 NEXT
| improve this answer | |
\$\endgroup\$
1
3 4 5
6
7

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.