Skip to main content
GameDev.net gamedev.net
Using GameDev.net for your class this semester?
Learn more →
🔒 Locked

99 Bottles Of Beer Challenge With Least Amount Of Characters ?

Started by RLS0812 Jul 6, 2013 at 1:28 AM 95 replies 45.2k views
Original Post
RLS0812
RLS0812

99 Bottles Of Beer Project is a collection of the "99 Bottles Of Beer" song written in over 1,500 different programming languages.

I was wondering, what is the shortest program you can write, that outputs the whole song "99 Bottles Of Beer" ( total characters ) ?

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
Servant of the Lord
Servant of the Lord

I see your 473 non-whitespace characters, and raise you 331.

(Yes, it's permitted in the C++ standard to not include the return statement in the main() function)

[Edit:] Got it to 314 non-whitespace characters. Still has the flaw @slicer mentions below. =(...

slicer4ever
slicer4ever

I see your 473 non-whitespace characters, and raise you 331.

(Yes, it's permitted in the C++ standard to not include the return statement in the main() function)

aha! but you missed that instead of "0 bottles of beer on the wall." it's suppose to be: "no more bottles of beer on the wall."

=-)

SiCrane
SiCrane
I'm disappointed I haven't been seeing more obfuscated C++ tricks like using the preprocessor definitions and implicit string concatenation to shrink the string literals. For instance, "bottles of beer" is repeated in a number of places in both of those code samples so you can use things like

#define B "bottles of beer"
printf("No more " B " on the wall, no more " B ".\n"
You guys are actually producing readable code.
swiftcoder
swiftcoder

I see your 473 non-whitespace characters, and raise you 331.

[Edit:] Got it to 314 non-whitespace characters. Still has the flaw @slicer mentions below. =(...

By the powers vested in me by Python, I see your 314 and raise you 274.

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]
Servant of the Lord
Servant of the Lord

Ah, but now you have a mistake in your output! You went from 1 bottle of beer to none, without passing it around. tongue.png

cowsarenotevil
cowsarenotevil

I see your 473 non-whitespace characters, and raise you 331.

[Edit:] Got it to 314 non-whitespace characters. Still has the flaw @slicer mentions below. =(...

By the powers vested in me by Python, I see your 314 and raise you 274.

I don't know Python, but following from what SiCrane said, could you perhaps make line 6 stick an 's' into the string a, removing the need for a substantially-identical string b?

EDIT: This seems to work with fewer characters, and I'm sure someone who has actually used Python, you know, ever, could do this in a smarter way.


a = 'bottles of beer'
w = 'on the wall.\n'

def D(i):
	return i if i!=0 else 'no more'

def Q(i):
	return a if i!=1 else "".join(a.split("s"))

def C(i):
	return '\nTake one down and pass it around,' if i>0 else '\nGo to the store and buy some more,'

for i in range(99,-1,-1):
    print D(i), Q(i), 'on the wall,', D(i), Q(i)+'.', C(i), D(i-1), Q(i-1), w

#print 'No more', b, 'on the wall, no more', b+'.'+C(i), '99', b, w

EDIT: Oops, I must have stolen swiftcoder's code to make that change at a moment when it was broken, so there's an off-by-one error in mine.

-~-The Cow of Darkness-~-
swiftcoder
swiftcoder

I don't know Python, but following from what SiCrane said, could you perhaps make line 6 stick an 's' into the string a, removing the need for a substantially-identical string b?

Yeah, but unfortunately I also had a couple of bugs, so even with that, I had to go back up to 290 to fix them...

Edit: that's still 30 characters shorter than the shortest complete example on the site, so I guess I am happy.

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]
slicer4ever
slicer4ever

I'm disappointed I haven't been seeing more obfuscated C++ tricks like using the preprocessor definitions and implicit string concatenation to shrink the string literals. For instance, "bottles of beer" is repeated in a number of places in both of those code samples so you can use things like


#define B "bottles of beer"
printf("No more " B " on the wall, no more " B ".\n"
You guys are actually producing readable code.

challanged accepted: http://codepad.org/jHzuL4zd

not sure what you guys are using to do non-whitespace counting, but i don't feel like counting them all to give a number.

edit: made minor fix.

swiftcoder
swiftcoder




not sure what you guys are using to do non-whitespace counting, but i don't feel like counting them all to give a number.

Character counting a la the internet.

You are rocking a 330, and you have a capitalization error on the 2nd-to-last line (I'm quibbling, I know, but that capital cost me 5 characters to get right).

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]
slicer4ever
slicer4ever

not sure what you guys are using to do non-whitespace counting, but i don't feel like counting them all to give a number.

Character counting a la the internet.

You are rocking a 330, and you have a capitalization error on the 2nd-to-last line (I'm quibbling, I know, but that capital cost me 5 characters to get right).

ah thanks=-). had to bump it up by 3 characters to fix that, and one other mistake: http://codepad.org/aDEAu5R6

edit: here's a c# version: http://ideone.com/S7Hcs5 clocks in at 382 characters.

edit2: managed to reduce it down to 338 characters.

Endurion
Endurion

Silly little change to get the C# to 330 smile.png

http://ideone.com/D0iVbE

Fruny: Ftagn! Ia! Ia! std::time_put_byname! Mglui naflftagn std::codecvt eY'ha-nthlei!,char,mbstate_t>
Andy474
Andy474

Ah, but now you have a mistake in your output! You went from 1 bottle of beer to none, without passing it around. tongue.png

He stole my beer!

SamLowry
SamLowry

z = concat
a = " bottle"
e = a ++ "s"

y = "o more"
b 0 = "n" ++ y ++ e
b 1 = "1" ++ a
b n = show n ++ e

c = " of beer"
d = c ++ " on the wall"

f 0 = z [ "N", y, e, d, ", ", b 0, c, ".\nGo to the store and buy some more, ", b 99, d, ".\n" ]
f n = z [ b n, d, ", ", b n, c, ".\nTake one down and pass it around, ", b $ n-1, d, ".\n\n" ]

main = mapM_ (putStr . f) [99,98..0]

260 nonwhitespaces using Haskell.

Cornstalks
Cornstalks
C99, 365 characters including whitespace (newlines and all), 314 excluding whitespace (I personally think we should be counting whitespace):
#define T ".\nTake one down and pass it around, "
#define B " bottles of beer"
#define b "1 bottle of beer"
#define W B" on the wall"
#define w b" on the wall"
int main(){for(int j=100;j--;)printf(j?j>1?"%d"W", %d"B:w", "b:"No more"W", no more"B,j,j),printf(j?j>1?j>2?T"%d"W".\n\n":T w".\n\n":T"no more"W".\n\n":".\nGo to the store and buy some more, 99"W".",j-1);}
I'm tired. It's time for bed. I might try some more tomorrow.

Edit: I just learned implicit function declaration was made illegal in C99, so my code is an unholy union of C89 and C99. Here's a C89 version (added 10 characters):
#define T ".\nTake one down and pass it around, "
#define B " bottles of beer"
#define b "1 bottle of beer"
#define W B" on the wall"
#define w b" on the wall"
int main(){for(int j=100;j--;)printf(j?j>1?"%d"W", %d"B:w", "b:"No more"W", no more"B,j,j),printf(j?j>1?j>2?T"%d"W".\n\n":T w".\n\n":T"no more"W".\n\n":".\nGo to the store and buy some more, 99"W".",j-1);return 0;}
Edit edit: I think these both technically invoke undefined behavior. I ended up being curious about the legal-ness of implicitly declared functions and asked on StackOverflow. According to the answer (and the comments), implicitly declared functions in C89 are legal, but only for specific types of functions, and printf isn't one of those. Learned something new!
RLS0812
RLS0812

215 non white space characters - thanks Ruby


i = 99
x = " bottles of beer"
y = x + " on the wall, "
z = "Take one down, pass it around, "
a = ".\n"
b = "no more "
while i > 1
    q = i.to_s
    r = (i - 1).to_s
    puts q + y + q + x + a  + z + r + y
    i -= 1
end
q = i.to_s
puts q + y + q + x + a + z + b + y,"No more" + y + b + x + a + "Go to the store and buy some more, 99" + y
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
Juliean
Juliean

#include <fstream>
#include <iostream>

void main()
{
std::fstream s;
s.open("b", std::ios::in);

while(s)
{
char c;
s.get(c);
std::cout << c;
}
}

160 characters. Yet I've got the feeling that this one doesn't count...

Bacterius
Bacterius

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 I understand the standard right it is legal and safe to do this but the resulting value could be anything.”
RLS0812
RLS0812

The characters from your imported files also count .... tongue.png


import BoB
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

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.