Many years ago (1994) programmer, and my geek idol, Tim Robinson compiled a list of ways to output the lyrics to the song 99 Bottles of Beer. It started with someone posting to a mailing list the entire lyrics to the song and then someone else replied with a Basic version of the song:
10 REM BASIC Version of 99 Bottles of beer20 FOR X=100 TO 1 STEP -130 PRINT X;"Bottle(s) of beer on the wall,";X;"bottle(s) of beer"40 PRINT "Take one down and pass it around,"50 PRINT X-1;"bottle(s) of beer on the wall"60 NEXT
Tim posted a C++ version and it grew from there to hundreds of versions. Unfortunately Tim's web site (and Tim) disappeared from the 'net and all was lost for a few years. Now, Oliver Schade has posted the entire collection and then some on a web site: http://www.99-bottles-of-beer.net.
One of my contributions was Modula-2:
MODULE BottlesOfBeer;FROM InOut IMPORT WriteCard, WriteString, WriteLn;CONST BOTTLES = 99;VAR counter : CARDINAL;BEGIN counter := BOTTLES; REPEAT WriteCard( counter,2 ); WriteString(" bottles of beer on the wall, "); WriteCard( counter,2 ); WriteString(" bottles of beer."); WriteLn; WriteString(" Take one down, and pass it around, "); DEC( counter ); WriteCard( counter,2 ); WriteString(" bottles of beer on the wall."); WriteLn; UNTIL ( counter = 1 ); WriteString("1 bottle of beer on the wall, 1 bottle of beer"); WriteLn; WriteString("Take it down and pass it around, "); WriteString("No more bottles of beer on the wall."); WriteLn;END BottlesOfBeer.
What I enjoy about this catalog is that people tried to incorporate features from the language. Along with the usual cast of languages like SQL, C#, and various C++ versions, some clever languages were posted. Here are some of my favorites:
99 to: 1 by: -1 do: [ :i | i print. ' bottles of beer on the wall, ' print. i print. ' bottles of beer. ' print. 'take one down, pass it around, ' print. (i-1) print. ' bottles of beer on the wall, ' print. ]
<html> <head> <title> 99 Bottles of Beer: The Compleat Lyrics </title> </head> <body> ;;; ;;; The actual source code to The Compleat Lyrics. <defsubst plural whitespace=delete> <if <not <eq %0 1>> s> </defsubst> <set-var beers=99> <while <gt beers 0>> <get-var beers> bottle<plural beers> of beer on the wall, <br> <get-var beers> bottle<plural beers> of beer, <br> You take one down, pass it around, <br> <decrement beers> <get-var beers> bottle<plural beers> of beer on the wall. <p> </while> No more bottles of beer on the wall, <br> No more bottles of beer, <br> Go to the store, and buy some more, <br> <form method=GET action="<get-var mhtml::current-url>"> <input type="submit" name="button" value="99 Bottles of beer on the wall"> </form> </body> </html>
#!/usr/bin/perl -iake_one_down_pass_it_around:_bottles_of_beer:_on_the_wall:99 for(($t,$a,$b,$i)=split/:/,$^I;$i;print){$_="-$i$a$b,-$i$a,-T$t,-".--$i."$a$b ";s/(-1_.*?e)s/$1/g;y/_-/ \n/}# by Randolph Chung and Joey Hess
POV-Ray is a ray-tracing program. // povray 3 file for the 99 bottles of beer ... #declare S1 = " bottles" #declare L1 = " of beer on the wall,\n" #declare L2 = " of beer.\n" #declare L3 = "Take one down and pass it around,\n" #declare L4 = " of beer on the wall.\n\n" #declare Beer = 99 #declare S2 = concat(str(Beer,0,0),S1) #render "\n" #while (Beer > 0) #render concat(S2,L1) #render concat(S2,L2) #render L3 #declare Beer = Beer - 1 #if (Beer = 1) #declare S2 = "1 bottle" #else #if (Beer = 0) #declare S2 = "No more bottles" #else #declare S2 = concat(str(Beer,0,0),S1) #end #end #render concat(S2,L4) #end sphere { 0, 1 pigment { colour rgb <1,0,0> } } light_source { x*2, colour rgb 1 } camera { perspective location x*2 look_at 0 }
There are also some unmentionables like this one and this one. 621 versions so far. One glaring omission is Managed C++ [looks over at Yves Dolce]. I also wonder whatever happened to Tim Robinson. He was the brains behind Excalibur BBS which was a Windows based BBS that served up screens with meta-driven GUI. Instead of writing classic BBS doors you would write DLL add-in's. It was unfortunately timed to come out just as the WWW was emerging but the software was very cool nonetheless.