Jump to content

  • Log In with Google      Sign In   
  • Create Account

99 Bottles Of Beer Challenge With Least Amount Of Characters ?

  • This topic is locked This topic is locked
101 replies to this topic

#21   Members   -  Reputation: 1865

Like
2Likes
Like

Posted 06 July 2013 - 06:03 AM

Nobody said we had to use a real language. Therefore, zero characters, using the newly created "bottles of beer" language..


The specification of the "bottles of beer" language states that:

 

An empty source file shall produce a program which prints out the lyrics of the "99 bottles of beer" song. The behaviour of non-empty source files is unspecified.

 

 

Thank you.

 

If you would perhaps extend it to produce Pascal's triangle when feeding it a non-empty source file, it might become a serious contender to PacTri as language to be used in these kinds of contests.



#22   GDNet+   -  Reputation: 3039

Like
3Likes
Like

Posted 06 July 2013 - 06:32 AM

Theoretically any one who could write this program in Whitespace would win ...


I cannot remember the books I've read any more than the meals I have eaten; even so, they have made me.

~ Ralph Waldo Emerson

Code_Fox_Sig.png


#23   Senior Moderators   -  Reputation: 17669

Like
2Likes
Like

Posted 06 July 2013 - 08:34 AM


215 non white space characters - thanks Ruby

You are missing the singular case of bottles/bottle, and you have a comma instead of a period at the end of every second line.

 

The "canonical" output has 89 characters in unique runs, so entropy is the limiting factor in program size. One can reduce the size of the program pretty substantially by cutting corners in the output...


Tristam MacDonald - Software Engineer @ Amazon - [swiftcoding] [GitHub]


#24   Crossbones+   -  Reputation: 1304

Like
0Likes
Like

Posted 06 July 2013 - 09:41 AM

C# version:

string b, w, t, n, c, g;
b = " bottles of beer";
c = b.Remove(7, 1);
w = " on the wall";
t = "Take one down and pass it around, ";
n = "o more";
for (int a = 99; a > 0; a--)
{
   g = a.ToString();
   Console.WriteLine(g + (a > 2 ? b : c) + w + ", " + g + (a > 2 ? b : c) + ((a > 1) ? (".\n" + t + (a - 1).ToString() + (a > 2 ? b : c) + w + ".\n") : "."));
}
Console.WriteLine(t + "n" + n + b + w + ".\n\nN" + n + b + w + ", n" + n + b + ".\nGo to the store and buy some more, 99" + b + w + ".");

349 non-whitespace characters. I have no idea how to reduce it more without cutting corners in output format...

 

Full solution is here, as is the result. I didn't count anything besides pure solution.



#25   GDNet+   -  Reputation: 3039

Like
0Likes
Like

Posted 06 July 2013 - 09:54 AM

Here is the corrected version ... 250 characters . I'm going to see if I can slim that down a bit later today.

i = 99
c = "of beer"
d = "."
e = ", "
f = " on the wall"
x = " bottles " + c
y = x + f
z = "Take one down, pass it around, "
a = " bottle of " + c
b = "no more"
while i > 1
    q = i.to_s
    r = (i - 1).to_s
    puts q + y + e +  q + x + d, z + r + y + d
    i -= 1
end
puts r + a + f + e + r + a + d, z + b + y + d,b.capitalize + y + e + b + x + d,"Go to the store and buy some more, 99" + y + d

Edited by Shippou, 06 July 2013 - 10:24 AM.

I cannot remember the books I've read any more than the meals I have eaten; even so, they have made me.

~ Ralph Waldo Emerson

Code_Fox_Sig.png


#26   Senior Moderators   -  Reputation: 17669

Like
0Likes
Like

Posted 06 July 2013 - 11:06 AM


I have no idea how to reduce it more without cutting corners in output format...

I guess verbose languages like C# and Java pretty much screwed by the criteria themselves.

 

The variable declarations cost you 20 characters, and the length of Console.WriteLine and ToString cost even more.


Tristam MacDonald - Software Engineer @ Amazon - [swiftcoding] [GitHub]


#27   Crossbones+   -  Reputation: 7022

Like
0Likes
Like

Posted 06 July 2013 - 11:22 AM

I have no idea how to reduce it more without cutting corners in output format...

One common way of doing ToString() in "shorthand" is just doing +"" (in both C# and Java), which will convert the object to a string using ToString().

You could also save more by doing Console.Write() (and adding '\n' to the end) instead of Console.WriteLine(). Also, no need to use g. And some parens aren't needed. Here's a smaller version (296 non-whitespace characters):
 
string
b = " bottles of beer",
c = b.Remove(7, 1),
w = " on the wall",
t = "Take one down and pass it around, ",
n = "o more", x;
for (int a = 99; a>0;)
{
    x = a > 2 ? b : c;
    Console.WriteLine(a + x + w + ", " + a + x + (a-- > 1 ? ".\n" + t + a + (a > 1 ? b : c) + w + ".\n" : "."));
}
Console.Write(t + "n" + n + b + w + ".\n\nN" + n + b + w + ", n" + n + b + ".\nGo to the store and buy some more, 99" + b + w + ".\n");
output

I still think we should be counting whitespace, because it's actually significant. Try running a program with no whitespace... Also, I think C# and Java should include their using/import and class definitions.

Edited by Cornstalks, 06 July 2013 - 11:50 AM.

[ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

#28   Crossbones+   -  Reputation: 1304

Like
0Likes
Like

Posted 06 July 2013 - 12:22 PM

Wow, thanks Cornstalks for showing me those tricks (mainly string with comma, which I didn't know) :D



#29   Members   -  Reputation: 104

Like
0Likes
Like

Posted 06 July 2013 - 12:32 PM

Do \n etc. Count as one character?



#30   Crossbones+   -  Reputation: 2872

Like
0Likes
Like

Posted 06 July 2013 - 12:53 PM

  Closest I can get using "C" and no sleep!
 

#include <stdio.h>


void r(int i)
{
  if(i <= 0)
  {
    printf("No more bottles of beer");
    return;
  }
  printf("%d bottles of beer on the wall, %d bottles of beer\nTake one down and pass it around, %d bottles of beer on the wall\n\n", i, i, i);
  r(i - 1);
}


void main()
{
  r(99);
}

Edited by ByteTroll, 06 July 2013 - 12:59 PM.

"The code you write when you learn a new language is shit.
You either already know that and you are wise, or you don’t realize it for many years and you are an idiot. Either way, your learning code is objectively shit." - L. Spiro

"This is called programming. The art of typing shit into an editor/IDE is not programming, it's basically data entry. The part that makes a programmer a programmer is their problem solving skills." - Serapth

 

"The 'friend' relationship in c++ is the tightest coupling you can give two objects. Friends can reach out and touch your privates." - frob


#31   Prime Members   -  Reputation: 699

Like
0Likes
Like

Posted 06 July 2013 - 01:02 PM

I can't anwer this, sorry, because I've drunk all the beers



#32   GDNet+   -  Reputation: 6280

Like
0Likes
Like

Posted 06 July 2013 - 01:04 PM

Also, I think C# and Java should include their using/import and class definitions.

 

I did, they add ~20-30 characters to your character count.


Edited by slicer4ever, 06 July 2013 - 01:05 PM.

Check out https://www.facebook.com/LiquidGames for some great games made by me on the Playstation Mobile market.

#33   Crossbones+   -  Reputation: 7022

Like
0Likes
Like

Posted 06 July 2013 - 01:13 PM

Closest I can get using "C" and no sleep!

*snip*

That doesn't print all the right words. The last verse is wrong (you're not going to the store to buy some more), and when you have 1 bottle left you still say bottles. And when you have 1 bottle of beer on the wall and you take it down, you mysteriously still have 1 bottle of beer on the wall. You're also missing periods.

Do \n etc. Count as one character?

Nope, they count as two.
[ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

#34   Crossbones+   -  Reputation: 2872

Like
0Likes
Like

Posted 06 July 2013 - 01:18 PM

 

Closest I can get using "C" and no sleep!

*snip*

That doesn't print all the right words. The last verse is wrong (you're not going to the store to buy some more), and when you have 1 bottle left you still say bottles. And when you have 1 bottle of beer on the wall and you take it down, you mysteriously still have 1 bottle of beer on the wall. You're also missing periods.

Do \n etc. Count as one character?

Nope, they count as two.

 

 

Ah snap! I didn't even notice that ;P  I shall fix it.


"The code you write when you learn a new language is shit.
You either already know that and you are wise, or you don’t realize it for many years and you are an idiot. Either way, your learning code is objectively shit." - L. Spiro

"This is called programming. The art of typing shit into an editor/IDE is not programming, it's basically data entry. The part that makes a programmer a programmer is their problem solving skills." - Serapth

 

"The 'friend' relationship in c++ is the tightest coupling you can give two objects. Friends can reach out and touch your privates." - frob


#35   Crossbones+   -  Reputation: 3249

Like
10Likes
Like

Posted 06 July 2013 - 02:51 PM

*
POPULAR

 

Also, I think C# and Java should include their using/import and class definitions.

 

I did, they add ~20-30 characters to your character count.

 

 

Actually, with the Roslyn shell you no longer need the surrounding class / Main function cruft, just as if you were using the python shell. Granted, you should still include the using statements, since they're required.

 

Also, I see your 300+ C# entry and raise you 250 (even beats some of the other languages)  biggrin.png

string f="{0:#;;",e=".\n",o="s;s;''} of beer",w=" on the wall",n="o more} bottle",x=n+"{1:"+o;
for(int a=99;a>=0;)System.Console.WriteLine(f+'N'+x+w+", "+f+'n'+x+e+
"{1:Take one down and pass it around;Go to the store and buy some more}, {1:#;99;n"+n+"{2:"+o+w+e,a,a-1,--a-1);

It doesn't require the conditional operator either, which is nifty.


Edited by Mike.Popoloski, 06 July 2013 - 02:55 PM.

Mike Popoloski | Journal | SlimDX

#36   GDNet+   -  Reputation: 6280

Like
0Likes
Like

Posted 06 July 2013 - 02:59 PM



 



 

Also, I think C# and Java should include their using/import and class definitions.

 

I did, they add ~20-30 characters to your character count.

 

 

Actually, with the Roslyn shell you no longer need the surrounding class / Main function cruft, just as if you were using the python shell. Granted, you should still include the using statements, since they're required.

 

Also, I see your 300+ C# entry and raise you 250 (even beats some of the other languages)  biggrin.png

string f="{0:#;;",e=".\n",o="s;s;''} of beer",w=" on the wall",n="o more} bottle",x=n+"{1:"+o;
for(int a=99;a>=0;)System.Console.WriteLine(f+'N'+x+w+", "+f+'n'+x+e+
"{1:Take one down and pass it around;Go to the store and buy some more}, {1:#;99;n"+n+"{2:"+o+w+e,a,a-1,--a-1);

It doesn't require the conditional operator either, which is nifty.

 

impressive, i wrapped it up to be compilable with ideone: http://ideone.com/MX82jD adding the extra fluff for ideone's compiler bumps it up to 288, but still, quite impressive mate.


Check out https://www.facebook.com/LiquidGames for some great games made by me on the Playstation Mobile market.

#37   Senior Moderators   -  Reputation: 17669

Like
0Likes
Like

Posted 06 July 2013 - 03:14 PM

Also, I see your 300+ C# entry and raise you 250 (even beats some of the other languages)  biggrin.png

string f="{0:#;;",e=".\n",o="s;s;''} of beer",w=" on the wall",n="o more} bottle",x=n+"{1:"+o;
for(int a=99;a>=0;)System.Console.WriteLine(f+'N'+x+w+", "+f+'n'+x+e+
"{1:Take one down and pass it around;Go to the store and buy some more}, {1:#;99;n"+n+"{2:"+o+w+e,a,a-1,--a-1);
It doesn't require the conditional operator either, which is nifty.

That is a thing of beauty.

Tristam MacDonald - Software Engineer @ Amazon - [swiftcoding] [GitHub]


#38   Crossbones+   -  Reputation: 7022

Like
2Likes
Like

Posted 06 July 2013 - 05:53 PM

Also, I see your 300+ C# entry and raise you 250 (even beats some of the other languages)  biggrin.png

string f="{0:#;;",e=".\n",o="s;s;''} of beer",w=" on the wall",n="o more} bottle",x=n+"{1:"+o;
for(int a=99;a>=0;)System.Console.WriteLine(f+'N'+x+w+", "+f+'n'+x+e+
"{1:Take one down and pass it around;Go to the store and buy some more}, {1:#;99;n"+n+"{2:"+o+w+e,a,a-1,--a-1);

It doesn't require the conditional operator either, which is nifty.

You, sir, just blew my mind

Mind-Blown.jpg

 

Edit: this thread needs to be somewhere where I can upvote... I'm learning all sorts of tricks in this wide variety of languages.


Edited by Cornstalks, 06 July 2013 - 05:54 PM.

[ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

#39   Senior Moderators   -  Reputation: 17669

Like
0Likes
Like

Posted 06 July 2013 - 06:05 PM


Edit: this thread needs to be somewhere where I can upvote... I'm learning all sorts of tricks in this wide variety of languages.

Your wish is my command.

 

Plus, this thread seemed to qualify from the beginning.


Tristam MacDonald - Software Engineer @ Amazon - [swiftcoding] [GitHub]


#40   Crossbones+   -  Reputation: 1304

Like
0Likes
Like

Posted 06 July 2013 - 06:27 PM

 

Also, I see your 300+ C# entry and raise you 250 (even beats some of the other languages)  biggrin.png
string f="{0:#;;",e=".\n",o="s;s;''} of beer",w=" on the wall",n="o more} bottle",x=n+"{1:"+o;
for(int a=99;a>=0;)System.Console.WriteLine(f+'N'+x+w+", "+f+'n'+x+e+
"{1:Take one down and pass it around;Go to the store and buy some more}, {1:#;99;n"+n+"{2:"+o+w+e,a,a-1,--a-1);

It doesn't require the conditional operator either, which is nifty.

 

 

What? Wait... what? Can somebody translate that for me, because some things I didn't see yet in C# (or I saw but didn't have the need to use hence forgot it).







PARTNERS