/*
DAL version of 99 Bottles of beer programmer:
by Georg Hentsch: ghentsch@blsoft.com
*/
declare integer beers = 99;
declare varchar s;
while (beers > 0)
{
	if (beers != 1)
		s = "s";
	else
		s = "";
	printf("%d bottle%s of beer on the wall,\n", beers, s);
	printf("%d bottle%s of beeeeer . . . ,\n", beers, s);
	printf("Take one down, pass it around,\n");
	beers--;
	if (beers > 0)
		printf("%d", beers);
	else
		printf("No more");
	if (beers != 1)
		s = "s";
	else
		s = "";
	printf(" bottle%s of beer on the wall.\n", s);
}
@echo off REM 99 Bottles of Beer in DOS Batch REM Gert-jan Los (los@lsdb.bwl.uni-mannheim.de) if "%1"=="" goto outer if "%1"=="body" goto body :inner for %%a in ( 9 8 7 6 5 4 3 2 1 0 ) do call beer body %2 %%a goto exit :outer for %%a in ( 9 8 7 6 5 4 3 2 1 0 ) do call beer inner %%a goto exit :body set num=%2%3 set bottle=bottles if "%num%"=="99" goto skipfirst if "%2"=="0" set num=%3 if "%num%"=="1" set bottle=bottle echo %num% %bottle% of beer on the wall echo. if "%num%"=="0" exit :skipfirst echo %num% %bottle% of beer on the wall echo %num% %bottle% of beer echo take one down and pass it around :exit
C     patrick m. ryan pryan@access.digex.net
      program ninetynine
      implicit none
      integer i
      do i=99,1,-1
        print*, i,' bottles of beer on the wall, ',i,' bottles of beer'
        print*, 'take one down, pass it around, ',i-1,
     .       ' bottles of beer on the wall'
      enddo
      end
\ Forth version of the 99 Bottles program. \ Dan Reish, dreish@izzy.net : .bottles ( n -- n-1 ) dup 1 = IF ." One bottle of beer on the wall," CR ." One bottle of beer," CR ." Take it down," ELSE dup . ." bottles of beer on the wall," CR dup . ." bottles of beer," CR ." Take one down," THEN CR ." Pass it around," CR 1- ?dup IF dup 1 = IF ." One bottle of beer on the wall;" ELSE dup . ." bottles of beer on the wall;" THEN ELSE ." No more bottles of beer on the wall." THEN CR ; : nbottles ( n -- ) BEGIN .bottles ?dup NOT UNTIL ; 99 nbottles
C Allen Mcintosh
C mcintosh@bellcore.com 
      integer bottls
      do 50 i = 1, 99
         bottls = 100 - i
         print 10, bottls
10       format(1x, i2, 31h bottle(s) of beer on the wall.)
         print 20, bottls
20       format(1x, i2, 19h bottle(s) of beer.)
         print 30
30       format(34h Take one down and pass it around,)
         bottls = bottls - 1
         print 10, bottls
         print 40
40       format(1x)
50    continue
      stop
      end
;;Geza Gyuk - gyuk@oddjob.uchicago.edu"
(defun beersong (n)
  "Does the n-beers song."
(progn (insert (int-to-string n) " bottle" (cond ((= n 1) "")
                                                 (t "s")) 
                                         " of beer on the wall,\n")
       (insert (int-to-string n) " bottle" (cond ((= n 1) "")
                                                 (t "s"))
                                         " of beer,\n")
       (insert "take one down and pass it around,\n")
       (insert (cond ((= n 1) "no more")
                     (t (int-to-string (- n 1)))) 
               " bottle" (cond ((= n 2) "")
                               (t "s")) 
               " of beer on the wall.\n\n")
       (cond ((> n 1) (beersong (- n 1))))))
! Does the beer song... sends output to a postscript file
! Geza Gyuk - gyuk@oddjob.uchicago.edu
printer 1
erase
data beer.dat
setv rounds c1(1)                       ! get number of rounds
                                        ! from first line, first
setv container bottles                  ! column of file beer.dat
expand {5/rounds}
loop i {rounds} 2 -1
   relocate 0.1 {i*5/(5*rounds)}
   putlabel 6 {i} bottles of beer on the wall,
   relocate 0.1 {(i*5-1)/(5*rounds)}
   putlabel 6 {i} bottles of beer,
   relocate 0.1 {(i*5-2)/(5*rounds)}
   putlabel 6 take one down and pass it around,
   if ({i}=2) setv container bottle
   relocate 0.1 {(i*5-3)/(5*rounds)}
   putlabel 6 {i-1} {container} of beer on the wall.
   relocate 0.1 {(i*5-4)/(5*rounds)}
   putlabel 6
endloop
relocate 0.1 {5/(5*rounds)}
putlabel 6 1 bottle of beer on the wall,
relocate 0.1 {4/(5*rounds)}
putlabel 6 1 bottle of beer,
relocate 0.1 {3/(5*rounds)}
putlabel 6 take it down and pass it around,
relocate 0.1 {2/(5*rounds)}
putlabel 6 no more bottles of beer on the wall.
hardcopy
end
{----------------------------------------------------------------------}
{Contents of BEER99.DPR}
program Beer99;
{99 bottles of beer - Borland Delphi 1.0}
{by Rodney M. Savard <rodney.savard%phun@phunnet.org>}
uses
  Forms,
  Beer in 'BEER.PAS' {Form1};
{$R *.RES}
begin
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
{----------------------------------------------------------------------}
{Contents of BEER.PAS}
unit Beer;
interface
uses
  Classes, Controls, Forms, StdCtrls, SysUtils;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  Bottles: Integer;
  s: String;
implementation
{$R *.DFM}
procedure TakeOneDown;
begin
   with Form1 do begin
      Memo1.Lines.Clear;
      Memo1.Lines.Add(IntToStr(bottles)+' bottle'+s+' of beer on the wall,');
      Memo1.Lines.Add(IntToStr(bottles)+' bottle'+s+' of beer.');
      Memo1.Lines.Add('');
      Memo1.Lines.Add('Take one down, pass it around,');
      Dec(Bottles);
      if Bottles<>1 then s:='s' else s:='';
      if Bottles=0 then begin
         Memo1.Lines.Add('no more bottles of beer on the wall!');
         Button1.Caption:='No More!';
         Button1.Enabled:=False;
      end
      else begin
         Memo1.Lines.Add(IntToStr(bottles)+' bottle'+s+' of beer on the wall.');
      end;
   end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   Bottles:=99;
   s:='s';
   Button1Click(Form1);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
   TakeOneDown;
end;
end.
{----------------------------------------------------------------------}
// Dylan version of 99 Bottles of Beer
// programmer: Jim Studt jim@federated.com
define method enumerate( count == 1 ) "1 bottle" end method enumerate;
define method enumerate( count == 0 ) "no more bottles" end method enumerate;
define method enumerate( count :: <integer> )
  format-to-string("%d bottles", count);
end method enumerate;
define method reference( count == 1) "it" end method reference;
define method reference( count :: <integer>) "one" end method reference;
define method main (argv0, #rest noise)
  for ( i from 99 to 1 by -1) 
    format( *standard-output*, "%s of beer on the wall, %s of beer.\n", 
	   enumerate(i), enumerate(i));
    format( *standard-output*, 
	   "  Take %s down, pass it around, %s of beer on the wall.\n",
	   reference(i), enumerate( i - 1));
  end for;
end method main;
class BEERS
creation
    make
feature     -- Creation
    make is
        local
            i : INTEGER
            b : STRING;
        do
            from i := 99 variant i until i <= 0 loop
                if i = 1 then
                    b := " bottle";
                else
                    b := " bottles"
                end -- if
                io.put_integer(i);
                io.put_string(b);
                io.put_string(" of beer on the wall, ");
                io.put_integer(i);
                io.put_string(b);
                io.put_string(" of beer,");
                io.new_line;
                io.put_string("Take one down and pass it around, ");
                i := i - 1;
                io.put_integer(i);
                io.put_string(b);
                io.put_string(" bottles of beer on the wall.");
                io.new_line;
            end -- loop
            io.put_string("Go to the store and buy some more,");
            io.new_line;
            io.put_string("99 bottles of beer on the wall.");
            io.new_line;
        end;
end -- class BEERS
Here is the OOP version of this in Eiffel... that is to say, the "proper"
way to do Eiffel:
class SHELF
      -- A shelf of bottles
creation
   make
feature
   make (l_bottles: INTEGER) is
      require
         positive_bottles: l_bottles >= 0
      do
         bottles := l_bottles
      end
   remove is
      require
         bottles_exist: bottles > 0
      do
         bottles := bottles - 1
      ensure
         removed: bottles = old bottles - 1
      end
   bottles: INTEGER
   short_description: STRING is
      do
         if bottles = 0 then
            Result := "No"
         else
            Result := bottles.out
         end
         Result.append (" bottle")
         if bottles /= 1 then
            Result.append ("s")
         end
         Result.append (" of beer")
      ensure
         result_exists: Result /= Void
      end
   description: STRING is
      do
         Result := short_description
         Result.append (" on the wall, ")
         Result.append (short_description)
         Result.append ("%N")
      ensure
         result_exists: Result /= Void
      end
   empty: BOOLEAN is
      do
         Result := bottles = 0
      end
invariant
   positive_bottles: bottles >= 0
         
end -- class SHELF
class BEER
   -- Produuce the ditty
   -- Nick Leaton
creation
   make
feature
   shelf: SHELF
   make is
      do
         from
            !!shelf.make (99)
         until
            shelf.empty
         loop
            io.put_string (shelf.description)
            shelf.remove
            io.put_string ("Take one down, pass it all around%N%N")
         end
         io.put_string (shelf.description)
         io.put_string ("Go to the store and buy some more%N%N")
         shelf.make (99)
         io.put_string (shelf.description)
      end   
            
end -- class BEER
% ---------------------------------------------------------------
% Erlang version of the beer song
% Kent Engström, kenen@ida.liu.se
% ---------------------------------------------------------------
% See http://www.ericsson.se/cslab/erlang/ for Erlang information
% ---------------------------------------------------------------
-module(beer).
-export([song/0]).
song() ->
    song(100).
song(0) ->
    done;
song(N) ->
    Bottles=bottles(N),
    Bottles1=bottles(N-1),
    io:format("~s of beer on the wall, ~s of beer.~n",
	      [Bottles,Bottles]),
    io:format("Take one down and pass it around, ~s of beer on the wall.~n",
	      [Bottles1]),
    song(N-1).
bottles(0)->
    "no more bottles";
bottles(1)->
    "1 bottle";
bottles(N)->
    lists:append(integer_to_list(N)," bottles").
01.10 c Focal-8 version of 99 Bottles of beer 01.20 c Hacked by Akira KIDA, <SDI00379@niftyserve.or.jp> 10.10 set bottles = 99 10.20 do 20 10.30 quit 20.10 for i = bottles, 1, -1; do 30 20.20 return 30.10 set b = i 30.20 do 40 ; type " on the wall, " 30.30 do 40 ; type ".", ! , "Take one down, pass it around.", ! 30.40 set b = i - 1 30.50 do 40 ; type " on the wall.", !, ! 30.60 return 40.10 do 50 40.20 type " of beer" 40.30 return 50.10 if (b - 1) 50.20, 50.40, 50.60 50.20 type "No more bottles" 50.30 return 50.40 type %1.0, b, " bottle" 50.50 return 50.60 type %1.0, b, " bottles" 50.70 return
PROCEDURE BEER
          LOCAL BOTTLES, LINE_1, LINE_2, LINE_3;
          BOTTLES := 99;
          LINE_1 := "!SL bottle!%S of beer on the wall";
          LINE_2 := "!SL bottle!%S of beer,";
          LINE_3 := "If !0!1%Cthat single bottle"
                  + "!%Eone of those bottles!%F should happen to fall,";
          LOOP;
               COPY_TEXT( FAO( LINE_1, BOTTLES) + ","); SPLIT_LINE;
               COPY_TEXT( FAO( LINE_2, BOTTLES));       SPLIT_LINE;
               COPY_TEXT( FAO( LINE_3, BOTTLES));       SPLIT_LINE;
               BOTTLES := BOTTLES - 1;
               COPY_TEXT( FAO( LINE_1, BOTTLES) + "."); SPLIT_LINE;
SPLIT_LINE;
               EXITIF BOTTLES = 0;
          ENDLOOP;
ENDPROCEDURE
{ False version of 99 Bottles by Marcus Comstedt (marcus@lysator.liu.se) }
[$0=["no more bottles"]?$1=["One bottle"]?$1>[$." bottles"]?%" of beer"]b:
100[$0>][$b;!" on the wall, "$b;!".
"1-"Take one down, pass it around, "$b;!" on the wall.
"]#%
! Hope Version of 99 Bottles of Beer : RAM-Biter!!!
! Tested on a SPARC classic, SunSolaris 2 
! Programmer: Wolfgang Lohmann   wlohmann@informatik.uni-rostock.de
 
dec app  :( list ( char ) X list ( char )) -> list ( char ) ;
dec i2c  : num -> char;
dec i2s  : num -> list(char);
dec beer : num -> list(char);
--- app ( nil , w )
       <= w  ;
--- app (( a  ::  v ), w )
       <=( a  ::  app ( v , w )) ;
--- i2c(0) <= '0';
--- i2c(1) <= '1';
--- i2c(2) <= '2';
--- i2c(3) <= '3';
--- i2c(4) <= '4';
--- i2c(5) <= '5';
--- i2c(6) <= '6';
--- i2c(7) <= '7';
--- i2c(8) <= '8';
--- i2c(9) <= '9';
--- i2s(x) <= if x < 10 then [i2c(x)] else
				app(i2s(x div 10), i2s( x mod 10)); 
--- beer(x) <= if x = 1 then app( i2s(x), 
				" bottle of beer. No more beer on the wall.")
                	else app( app( app( app( app( 
				i2s(x), 
				" bottles of beer on the wall, "),
				i2s(x)), 
				" bottles of beer. "),
				"Take one down, pass it around. "), 
				beer(y))
                        where y== x-1;
-- Haskell program for the Beer Song.
--
-- Bert Thompson 5.11.95 (aet@cs.mu.oz.au)
module Main where
main = song 99
song n =
        bob n ++ " on the wall,\n" ++
        bob n ++ ".\n" ++
        "Take one down, pass it around.\n"  ++
        if n == 1
        then
                "No more bottles of beer on the wall.\n"
        else
                bob (n-1) ++ " on the wall.\n"
                ++ song (n-1)
bob n =
        show n ++ bottle ++ " of beer"
        where
        bottle = " bottle" ++ if n == 1 then "" else "s"
!  F90 (Fortran 90) version of 99 bottles of beer.
!    written by Akira KIDA,  SDI00379@niftyserver.or.jp
!    Note that this source is in FIXED format.
	program ninetynine
	implicit none
	integer, parameter :: BOTTLES = 99
	integer :: i
	integer :: k
	character*7 :: btl = 'bottles'
	do i = BOTTLES, 1, -1
		k = len(btl)
		if (i == 1) k = k - 1
		print *, i, btl(1:k), ' of beer on the wall, ',
     c			 i, btl(1:k), ' of beer.'
		print *, 'Take one down, pass it around.'
		if (i == 0) exit
		print *, i, btl(1:k), ' of beer on the wall.'
	end do
	print *, 'No more bottles of beer on the wall.'
	end
 
.TITLE - "Program to display 99 bottles of beer on the wall"
;
;=======================================================================================================
;	Author: Bob Welton (welton@pui.com)
;		Projects Unlimited Inc.
;		Dayton, OH  45414
;
;	Language: DIBOL or DBL
;=======================================================================================================
RECORD MISC
    NUMBOTTLES	,D2,99			;Default # of bottles to 99
    ANUMBOTTLES	,A2			;Used to mask the output of bottles
.PROC
    XCALL FLAGS (0007000000,1)		;Suppress STOP message
    OPEN (8,O:C,"TT:")        		;Open the terminal/display
    REPEAT
	BEGIN
	ANUMBOTTLES = NUMBOTTLES,'ZX'
	WRITES (8,ANUMBOTTLES+" Bottles of Beer on the wall,")
	ANUMBOTTLES = NUMBOTTLES,'ZX'
	WRITES (8,ANUMBOTTLES+" Bottles of Beer,")
	WRITES (8,"   Take one down, pass it around,")
	DECR NUMBOTTLES	      		;Reduce # of bottles by 1
	IF (NUMBOTTLES .LE. 1) EXITLOOP	;If just 1 bottle left, get out
	ANUMBOTTLES = NUMBOTTLES,'ZX'
	WRITES(8,ANUMBOTTLES+" Bottles of Beer on the wall.") 
	WRITES (8," ")
	END
    ANUMBOTTLES = NUMBOTTLES,'ZX'
    WRITES(8,ANUMBOTTLES+" Bottle of Beer on the wall.") 
    WRITES (8," ")
    WRITES (8,ANUMBOTTLES+" Bottle of Beer on the wall,")
    WRITES (8,ANUMBOTTLES+" Bottle of Beer,")
    WRITES (8,"   Take one down, pass it around,")
    WRITES (8," ")
    WRITES (8," ")
    WRITES (8, "Hey the Beer's gone, I am out of here...")
    SLEEP 2
    CLOSE 8
    STOP
.END
&& BEER.PRG  - 99 Bottles of Beer  - Brian Hobbs  Jan 1996
&& (BHOBBS@cayman.vf.mmc.com)
SET TALK OFF
I=99
DO WHILE I>=1
   b = STR(i,2)
   ? b +" Bottle"
   IF i > 1
      ?? "s"
   ENDIF
   ?? " of beer on the wall "+b+" bottle"
   IF i> 1 
     ?? "s"
     ENDIF
   ?? " of beer"
   ? "   Take one down and pass it around"
   i=i-1
   b = STR(i,2)
   if i = 0
     b = "No more"
     ENDIF
   ? b + " Bottle"
   IF I > 1 .OR. I=0
      ?? "s"
   ENDIF
   ?? " of beer on the wall"
   ?
ENDDO
   ? "No more bottles of beer on the wall, No more bottles of beer"
   ? "Go to the store and buy some more - 99 bottles of beer on the wall"
SET TALK ON
-- 99 bottles of beer (gofer version)
-- Written by Bow-Yaw Wang (bywang@saul.cis.upenn.edu)
radix 0 _ = []
radix x n = (x `mod` n):(radix (x/n) n)
itoa x = map (\x -> chr(x + ord('0'))) (reverse (radix x 10))
bottles :: Int -> Dialogue
bottles 1 resps = [AppendChan stdout "1 bottle of beer on the wall, ",
                   AppendChan stdout "1 bottle of beer.\n",
                   AppendChan stdout "Take one down, pass it around, ",
                   AppendChan stdout "no more bottles of beer on the wall.\n"]
bottles n resps = [AppendChan stdout (itoa n),
                   AppendChan stdout " bottles of beer on the wall, ",
                   AppendChan stdout (itoa n),
                   AppendChan stdout " bottles of beer.\n",
                   AppendChan stdout "Take one down, pass it around, ",
                   AppendChan stdout (itoa (n-1)),
                   AppendChan stdout " bottles of beer on the wall.\n"] ++
                   bottles (n-1) resps
# Programmer: Mark Gray - mvg@mfltd.co.uk
# http://www.mfltd.co.uk/
#
# Note: requires version 2.5 of Dialog System.
Form BEER
   Screenset Details
       First-Window WIN1
   End Details
   Form Data
       Group BOTTLE-TEXT-GROUP-1 Vertical Occurs 1
           NUMBER-OF-BOTTLES-1 Integer(2)
           BOTTLE-TEXT-1 Character(28)
           BOTTLE-PUNCTUATION-1 Character(1)
       End Group # BOTTLE-TEXT-GROUP-1
       Group BOTTLE-TEXT-GROUP-2 Vertical Occurs 1
           NUMBER-OF-BOTTLES-2 Integer(2)
           BOTTLE-TEXT-2 Character(17)
       End Group # BOTTLE-TEXT-GROUP-2
           BOTTLE-TEXT-1A Character(31)
           BOTTLE-TEXT-2A Character(19)
           BOTTLE-TEXT-3 Character(30)
           BOTTLE-TEXT-4 Character(34)
   End Data
   Object WIN1
       Type DIALOG-BOX
       Parent DESKTOP
       Start (492,720)
       Size  (1208,1150)
       Display "99 Bottles of Beer"
       Style MODELESS TITLEBAR SYSTEM-MENU
   End Object  #WIN1
   Object BEER-LIST
       Type LIST-BOX
       Parent WIN1
       Start (64,100)
       Size  (1088,800)
       Style DISABLE-HORIZONTAL
   End Object  #BEER-LIST
   Object PB1
       Type PUSH-BUTTON
       Parent WIN1
       Start (416,1040)
       Size  (372,96)
       Display "Close"
   End Object  #PB1
   Global Dialog CASE(OFF)
       Event ESC
           SET-EXIT-FLAG ;
           TERMINATE ;
       End Event # ESC
       Event CLOSED-WINDOW
           SET-EXIT-FLAG ;
           TERMINATE ;
       End Event # CLOSED-WINDOW
       Event BUTTON-SELECTED
           SET-EXIT-FLAG ;
           TERMINATE ;
       End Event # BUTTON-SELECTED
       Event SCREENSET-INITIALIZED
           MOVE " bottles of beer on the wall" BOTTLE-TEXT-1(1) ;
           MOVE " bottles of beer," BOTTLE-TEXT-2(1) ;
           MOVE "Take one down, pass it around," BOTTLE-TEXT-3 ;
           MOVE "Go to the store and buy some more," BOTTLE-TEXT-4 ;
           MOVE 99 NUMBER-OF-BOTTLES-1(1) ;
           BRANCH-TO-PROCEDURE COUNT-BOTTLES ;
       End Event # SCREENSET-INITIALIZED
       Procedure COUNT-BOTTLES
           MOVE NUMBER-OF-BOTTLES-1(1) NUMBER-OF-BOTTLES-2(1) ;
           MOVE "," BOTTLE-PUNCTUATION-1(1) ;
           MOVE BOTTLE-TEXT-GROUP-1 BOTTLE-TEXT-1A ;
           MOVE BOTTLE-TEXT-GROUP-2 BOTTLE-TEXT-2A ;
           INSERT-LIST-ITEM BEER-LIST BOTTLE-TEXT-1A 0 ;
           INSERT-LIST-ITEM BEER-LIST BOTTLE-TEXT-2A 0 ;
           MOVE "." BOTTLE-PUNCTUATION-1(1) ;
           IF= NUMBER-OF-BOTTLES-1(1) 0 END-BOTTLES ;
           INSERT-LIST-ITEM BEER-LIST BOTTLE-TEXT-3 0 ;
           DECREMENT NUMBER-OF-BOTTLES-1(1) ;
           MOVE BOTTLE-TEXT-GROUP-1 BOTTLE-TEXT-1A ;
           INSERT-LIST-ITEM BEER-LIST BOTTLE-TEXT-1A 0 ;
           BRANCH-TO-PROCEDURE COUNT-BOTTLES ;
       End Procedure # COUNT-BOTTLES
       Procedure END-BOTTLES
           MOVE 99 NUMBER-OF-BOTTLES-1(1) ;
           MOVE BOTTLE-TEXT-GROUP-1 BOTTLE-TEXT-1A ;
           INSERT-LIST-ITEM BEER-LIST BOTTLE-TEXT-4 0 ;
           INSERT-LIST-ITEM BEER-LIST BOTTLE-TEXT-1A 0 ;
       End Procedure # END-BOTTLES
   End Dialog
End Form
--
-- a version of the "99 bottles of beer" song in HyperTalk
-- by eric carlson: eric@bungdabba.com
--
on BeerSong99
  BottlesOfBeer 99
end BeerSong99
--
-- do something with a lyric from the beer song.  this handler adds 
it to
--  a field on the current card
on OutputBeerLyric beerString
  if ( beerString is "<reset>" ) then
    put empty into cd fld "beer song"
  else
    put beerString & return after cd fld "beer song"
  end if
end OutputBeerLyric
--
-- sing the beer song with the specified number of bottles
on BottlesOfBeer bottleCount
  put bottleCount into initialCount
  OutputBeerLyric "<reset>"
  
  repeat until ( bottleCount < 1 )
    set cursor to busy     -- let 'em know this might take a while
    put BottleString(bottleCount) into currentString
    OutputBeerLyric currentString && "of beer on the wall,"
    OutputBeerLyric currentString && "of beer."
    OutputBeerLyric "Take one down, and pass it around,"
    
    subtract one from bottleCount
    OutputBeerLyric BottleString(bottleCount) && "of beer on the 
wall." & return
  end repeat
  
  OutputBeerLyric "Go to the store and buy some more..."
  OutputBeerLyric initialCount & " bottles of beer on the wall."
end BottlesOfBeer
--
-- return the bottle string appropriate for the current count
function BottleString bottleCount
  if ( bottleCount is 1 ) then
    return "1 bottle"
  else if ( bottleCount is 0 ) then
    return "no more bottles"
  else
    return bottleCount && "bottles"
  end if
end BottleString
** Randy Jean FOR x = 100 TO 1 STEP -1 ?x,"Bottle(s) of beer on the wall,",x,"bottle(s) of beer" ?" Take one down and pass it around," ?x-1,"bottle(s) of beer on the wall" ENDFOR
\ 99 bottles of beer in Froth, by Leo Wong, a teetotaler   6FEB96  +
\ Pass it around.
: LYRICS   [CHAR] ! PARSE  TUCK  HERE CHAR+  SWAP CHARS MOVE   DUP C,  CHARS ALLOT ;
: VOCALIZE  ( a)  COUNT TYPE ;
: SING   CREATE LYRICS  DOES> VOCALIZE ;
SING NO_MORE No more !
SING BOTTLE bottle! 
SING BOTTLES bottles! 
SING OF_BEER  of beer!  
SING ON_THE_WALL  on the wall!
SING TAKE Take !
SING IT it! 
SING ONE one!
SING DOWN_AND_PASS_IT_AROUND  down and pass it around!
SING GO_TO_THE_STORE_&_BUY_SOME_MORE Go to the store and buy some more! 
SING COMMA ,!
SING PERIOD .!
: ?: CREATE  ( n)  ,   ' ,  ' ,
   DOES>  ( n)  TUCK @ <>  1-  CELLS -  @ EXECUTE ;
: NONE  ( n)  DROP NO_MORE ;
: SOME  ( n)  . ;
0 ?: HOW_MANY  NONE  SOME 
1 ?: BOTTLE(S)  BOTTLE  BOTTLES
1 ?: IT|ONE  IT  ONE
: COMMERCIAL  ( 0 - 99)  GO_TO_THE_STORE_&_BUY_SOME_MORE  99 + ;  
: SHAREWARE  ( n - n-1)  DUP  TAKE IT|ONE DOWN_AND_PASS_IT_AROUND  1- 
;
0 ?: main(){0?99:--}  COMMERCIAL  SHAREWARE
: BURP  ( n - n n)  DUP ;
: HOW_MANY_BOTTLES_OF_BEER  ( n n n)  HOW_MANY BOTTLE(S) OF_BEER ;
: Froth  ( n - n')
   CR  BURP BURP BURP  HOW_MANY_BOTTLES_OF_BEER ON_THE_WALL  COMMA
   CR  BURP BURP BURP  HOW_MANY_BOTTLES_OF_BEER              COMMA 
   CR  BURP            main(){0?99:--}                       COMMA
   CR  BURP BURP BURP  HOW_MANY_BOTTLES_OF_BEER ON_THE_WALL  PERIOD 
CR ;
: LeoWong  ( n)  DROP ;
: SONG   99
/* 99 Bottles of Beer */
/* James Hicks (hicksjl@cs.rose-hulman.edu) */
/* 5 August 1996 */
int BEERS = 99;
proc main()void:
  uint i;
  for i from BEERS downto 1 do
    if i > 1 then
      writeln(i, " bottles of beer on the wall, ", i, " bottles of beer.");
    else
      writeln(i, " bottle of beer on the wall, ", i, " bottle of beer.");
    fi;
    writeln("Take one down, pass it around,");
    if i > 2 then
      writeln(i - 1, " bottles of beer on the wall.");
    elsif i > 1 then
      writeln(i - 1, " bottle of beer on the wall.");
    else
      writeln("No bottles of beer on the wall.");
    fi;
  od;
corp;
#!/usr/local/bin/expect # 99 bottles of beer on the wall, Expect-style # Author: Don LibesSample output:# Unlike programs (http://www.ionet.net/~timtroyr/funhouse/beer.html) # which merely print out the 99 verses, this one SIMULATES a human # typing the beer song. Like a real human, typing mistakes and timing # becomes more erratic with each beer - the final verse is barely # recognizable and it is really like watching a typist hunt and peck # while drunk. # Finally, no humans actually sing all 99 verses - particularly when # drunk. In reality, they occasionally lose their place (or just get # bored) and skip verses, so this program does likewise. # Because the output is timed, just looking at the output isn't enough # - you really have to see the program running to appreciate it. # Nonetheless, for convenience, output from one run (it's different # every time of course) can be found in the file beer.exp.out # But it won't show the erratic timing; you have to run it for that. proc bottles {i} { return "$i bottle[expr $i!=1?"s":""] of beer" } proc line123 {i} { out $i "[bottles $i] on the wall,\n" out $i "[bottles $i],\n" out $i "take one down, pass it around,\n" } proc line4 {i} { out $i "[bottles $i] on the wall.\n\n" } proc out {i s} { foreach c [split $s ""] { # don't touch punctuation; just looks too strange if you do if [regexp "\[,. \n\]" $c] { append d $c continue } # keep first couple of verses straight if {$i > 97} {append d $c; continue} # +3 prevents it from degenerating too far # /2 makes it degenerate faster though set r [rand [expr $i/2+3]] if {$r} {append d $c; continue} # do something strange switch [rand 3] { 0 { # substitute another letter if [regexp \[aeiou\] $c] { # if vowel, substitute another append d [string index aeiou [rand 5]] } elseif [regexp \[0-9\] $c] { # if number, substitute another append d [string index 123456789 [rand 9]] } else { # if consonant, substitute another append d [string index bcdfghjklmnpqrstvwxyz [rand 21]] } } 1 { # duplicate a letter append d $c$c } 2 { # drop a letter } } } set arr1 [expr .4 - ($i/333.)] set arr2 [expr .6 - ($i/333.)] set shape [expr log(($i+2)/2.)+.1] set min 0 set max [expr 6-$i/20.] set send_human "$arr1 $arr2 $shape $min $max" send -h $d } set _ran [pid] proc rand {m} { global _ran set period 259200 set _ran [expr ($_ran*7141 + 54773) % $period] expr int($m*($_ran/double($period))) } for {set i 99} {$i>0} {} { line123 $i incr i -1 line4 $i # get bored and skip ahead if {$i == 92} { set i [expr 52+[rand 5]] } if {$i == 51} { set i [expr 12+[rand 5]] } if {$i == 10} { set i [expr 6+[rand 3]] } } 
99 bottles of beer on the wall, 99 bottles of beer, take one down, pass it around, 98 bottles of beer on the wall. 11 botqle off baer oc tbe wakl, 1 botplo of beer, take onne da, pass itt arounm, 0 yotglees oof beeeer on tte walll.
Enter Browse Mode
Set Field No. Bottles/Calculation (99)
Set Field Bottle Text/Calculation (³²)
Loop
  Set Field Bottle Text/Calculation
    If(No. Bottles ‚ 1,
      No. Bottles & ³bottles of beer on the wall. ³ & No. Bottles & ³bottles of beer.² & Paragraph & ³Take one down and pass it around and ³,
      No. Bottles & ³bottle of beer on the wall. ³ & No. Bottles & ³bottle of beer.² & Paragraph & ³Take one down and pass it around and ³) & Paragraph &
    If(No. Bottles - 1 ‚ 1,
      (No. Bottles - 1) & ³ bottles of beer on the wall²,
      (No. Bottles - 1) & ³ bottle of beer on the wall²)
Refresh Window
Comment (Viewing text is optional)
Speak (Speech Data: Field: Bottle Text/Wait for completion)
Comment  (Speech is optional)
Set Field No. Bottles/Calculation (No. Bottles - 1)
Exit Loop If (Calculation (No. Bottles = 0))
End Loop
Set Field Bottle Text/Calculation (³0 bottles of beer on the wall. 0 bottles of beer. Go to the store and buy some more.² & Paragraph & ³99 bottles of beer on the wall.²
Refresh Window
Speak (Speech Data: Field: Bottle Text/Wait for completion)
video 1 local var1 99 local var2 24 mark 98 text 1 @var2 @var1 text " bottle(s) of beer on the wall," text 1 @var2-1 @var1 text " bottle(s) of beer!" text 1 @var2-2 "Take one down, pass it around," text 1 @var2-3 @var1-1 text " bottle(s) of beer on the wall!" waitkey 500 set var1 @var1-1 loop
/************************************************************************/ /* bottle.cpp */ /* 1996 Walter Zimmer (walter.zimmer@rz.uni-ulm.de) */ /* */ /* Save as "bottle.cpp" or change all the #includes ! */ /* #include is necessary since cpp expands each line into */ /* no more than one new line */ /* */ /* Invocation: cpp -P bottle.cpp */ /* */ /* Remove comments to have less empty lines in the output */ /* but we still have to many... */ /************************************************************************/ #if defined TEXT /* This is the part which outputs one verse. 'Passed' parameters are */ /* ONES: inner digit */ /* TENS: outer digit */ /* SECONDTEN: outer digit decremented by one */ /* if ONES == 0 then we have to use the decremented outer digit */ #if ONES == 0 /* omit output of 00 verse */ #if SECONDTEN < 10 /* Use SECONDTEN */ print(TENS,ONES) print(TENS,ONES) Take one down, pass it around print(SECONDTEN,SECONDONE) #endif /* SECONDTEN */ #else /* ONES */ /* Here everthing is normal, we use the normal TENS */ print(TENS,ONES) print(TENS,ONES) Take one down, pass it around print(TENS,SECONDONE) #endif /* ONES */ #elif defined LOOP /* This is the inner loop which iterates about the last digit */ /* #undef LOOP, #define TEXT so we output text in the next #include */ #undef LOOP #define TEXT /* #undef and #define the inner digits, invoke text output */ #undef ONES #undef SECONDONE #define ONES 9 #define SECONDONE 8 #include "bottle.cpp" /* ...and so on for digits 8-0 */ #undef ONES #undef SECONDONE #define ONES 8 #define SECONDONE 7 #include "bottle.cpp" #undef ONES #undef SECONDONE #define ONES 7 #define SECONDONE 6 #include "bottle.cpp" #undef ONES #undef SECONDONE #define ONES 6 #define SECONDONE 5 #include "bottle.cpp" #undef ONES #undef SECONDONE #define ONES 5 #define SECONDONE 4 #include "bottle.cpp" #undef ONES #undef SECONDONE #define ONES 4 #define SECONDONE 3 #include "bottle.cpp" #undef ONES #undef SECONDONE #define ONES 3 #define SECONDONE 2 #include "bottle.cpp" #undef ONES #undef SECONDONE #define ONES 2 #define SECONDONE 1 #include "bottle.cpp" #undef ONES #undef SECONDONE #define ONES 1 #define SECONDONE 0 #include "bottle.cpp" #undef ONES #undef SECONDONE #define ONES 0 #define SECONDONE 9 #include "bottle.cpp" /* Clean up */ #undef TEXT #else /* TEXT, LOOP */ /* Here is the basic 'loop' which iterates about the outer digit */ /* First define the print macro which outputs one line of xx beer */ /* We have to define it over the second define 'raw' to combine */ /* prescan with concatenation */ #define raw(TENS,ONES) TENS ## ONES #define print(TENS,ONES) raw(TENS,ONES) bottles of beer on the wall /* Tell bottle.cpp to invoke the inner loop when #included */ #define LOOP /* #define outer digit and process inner loop */ #define TENS 9 #define SECONDTEN 8 #include "bottle.cpp" /* Do this for the other digits 8 to 0, now with #undef */ /* Since LOOP gets #undef'd, we have to define it again */ #define LOOP #undef TENS #define TENS 8 #undef SECONDTEN #define SECONDTEN 7 #include "bottle.cpp" #define LOOP #undef TENS #define TENS 7 #undef SECONDTEN #define SECONDTEN 6 #include "bottle.cpp" #define LOOP #undef TENS #define TENS 6 #undef SECONDTEN #define SECONDTEN 5 #include "bottle.cpp" #define LOOP #undef TENS #define TENS 5 #undef SECONDTEN #define SECONDTEN 4 #include "bottle.cpp" #define LOOP #undef TENS #define TENS 4 #undef SECONDTEN #define SECONDTEN 3 #include "bottle.cpp" #define LOOP #undef TENS #define TENS 3 #undef SECONDTEN #define SECONDTEN 2 #include "bottle.cpp" #define LOOP #undef TENS #define TENS 2 #undef SECONDTEN #define SECONDTEN 1 #include "bottle.cpp" #define LOOP #undef TENS #define TENS 1 #undef SECONDTEN #define SECONDTEN 0 #include "bottle.cpp" #define LOOP #undef TENS #define TENS 0 #undef SECONDTEN /* We @define SECONDTEN as 10 to indicate that we are outputting */ /* the last block and therefore need only 9 verses */ #define SECONDTEN 10 #include "bottle.cpp" #endif
* EXEC version of 99 Bottles of beer program * By Torbjørn Vaaje (etotv@eto.ericsson.se) * &BEERS = 99 &S = ES &LOOP 5 99 &TYPE &BEERS BOTTL&S OF BEER ON THE WALL, &BEERS BOTTL&S OF BEER. &BEERS = &BEERS - 1 &IF &BEERS = 1 &S = E &IF &BEERS = 0 &BEERS = NO_MORE &TYPE TAKE ONE DOWN AND PASS IT AROUND, &BEERS BOTTL&S OF BEER ON THE WALL
-* Randy Gleason -* 99 beer challenge -REPEAT ENDBEER FOR &COUNTER FROM 99 TO 1 STEP -1 -SET &PL = IF &COUNTER EQ 1 THEN '' ELSE 's' ; -TYPE &COUNTER bottle&PL of beer on the wall, &COUNTER bottle&PL of beer -TYPE Take one down, pass it around -TYPE -ENDBEER -TYPE No more bottles of beer on the wall, No more bottles of beer -TYPE And we all shout out..WHO'S BUYING THE NEXT ROUND!
"  Language:  Express
"  Written by Lori Smallwood, IRI Software
"  April 12, 1997
vrb _beer  int
_beer = 99
while _beer gt 0
  do
    shw joinchars(_beer ' bottles of beer on the wall,')
    shw joinchars(_beer ' bottles of beer... ')
    shw 'Take one down, pass it around,'
    _beer = _beer - 1
    shw joinchars(_beer ' bottles of beer on the wall!')
  doend
Sub Beers()
' 99 bottles of beer on the wall
' Visual Basic for Excel version
' by Alejandro Julien (ajulien@tonatiuh.sis.uia.mx)
' Done with Excel 7 (Windows '95)
'
' It will start from the first cell of the first worksheet
' and move on downwards.
    Dim Cervezas As Integer 'Cervezas = beer in spanish
    Dim miCelda As Integer  'miCelda = myCell in spanish
    Worksheets(1).Activate
    ' Colors
    Range("A1:AA1").Interior.Color = RGB(0, 0, 128)
    ActiveCell.Offset(1, 0).Value = "by Alejandro Julien"
    Range("A1:A204").Font.Color = RGB(0, 0, 128)
    ' Title
    Range("A1").Select
    With ActiveCell
        .Value = "The 99 bottles of beer on the wall song"
        .Font.Size = 18
        .Font.Color = RGB(255, 255, 255)
    End With
    With ActiveCell.Offset(2, 0)
        .Value = "(ajulien@tonatiuh.sis.uia.mx)"
        With .Font
            .Italic = True
            .Size = 8
        End With
    End With
    miCelda = 3
    ' GO!
    For Cervezas = 99 To 2 Step -1
        ActiveCell.Offset(miCelda, 0).Value = Cervezas & " bottles of beer on the wall, " & Cervezas & " bottles of beer"
        miCelda = miCelda + 1
        ActiveCell.Offset(miCelda, 0).Value = "take one down and pass it around"
        miCelda = miCelda + 1
    Next
    ' ONE_BEER_EXCEPTION handling *whew!*
    ActiveCell.Offset(miCelda, 0).Value = "One bottle of beer on the wall, one bottle of beer"
    miCelda = miCelda + 1
    ActiveCell.Offset(miCelda, 0).Value = "take it down and pass it around"
    miCelda = miCelda + 1
    ' Beer's over
    ActiveCell.Offset(miCelda, 0).Value = "No more bottles of beer on the wall, no more bottles of beer"
    miCelda = miCelda + 1
    ActiveCell.Offset(miCelda, 0).Value = "Go to the store and buy some more"
    miCelda = miCelda + 1
    ' Sponsor's message
    With ActiveCell.Offset(miCelda, 0)
        .Value = "...but make sure it's mexican beer!"
        .Font.Italic = True
        .Font.Size = 8
    End With
    Application.Caption = "Cerveza mexicana siempre!"
    ' No kidding. If you have the chance, try a good mexican beer (:
    '-------
    ' This piece of code goes for the "99 bottles of beer" homepage,
    ' and may be used by whoever finds it useful to show Language,
    ' way of doing the chore, or proof that programmers seem to have
    ' no life (even though this is not a complete truth...)
    ' <#include "disclaim.h>
End Sub
[ bottles of beer on the wall ]sa [ bottles of beer ]sb [ take one down, pass it around ]sc [ ]sd 99sn [lalnpsnPlblnp1-snPlcPlalnpsnPldPln0
dc
dc is the Desk Calculator for *nix; It works on reverse polish notation, and a few other commands. The output of this routine is a little jagged, as dc has no commands to control screen formatting.
Usage: dc 99bottles
where this source file is saved as 99bottles NB: A blank line is required at the end of the file Without it, dc will not quit.[ bottles of beer on the wall ]sa [ bottles of beer ]sb [ take one down, pass it around ]sc [ ]sd 99sn [lalnpsnPlblnp1-snPlcPlalnpsnPldPln0
E
E is the macro language for IBM's EPM editor.; 99 bottles of beer in E, the macro language for IBM's EPM editor. -- Todd Fox /* The most interesting thing about this language is that it has 3 * different commenting styles and that the macros must be recompiled * directly into the editor to be used. */ defproc make_bottle_text(num_bottles) if (num_bottles > 1) then bottle_text = num_bottles || ' bottles' elseif (num_bottles = 1) then bottle_text = num_bottles || ' bottle' else bottle_text = 'No bottles' endif return(bottle_text) defproc sing_beer_main_line(num_bottles, is_long) lyrics = make_bottle_text(num_bottles) || ' of beer' if (is_long) then lyrics = lyrics || ' on the wall' endif insertline lyrics defproc sing_beer_song() init_bottle_cnt = 99 curr_bottle_cnt = init_bottle_cnt do while curr_bottle_cnt >= 1 sing_beer_main_line(curr_bottle_cnt, 1) sing_beer_main_line(curr_bottle_cnt, 0) insertline 'Take one down and pass it around' curr_bottle_cnt = curr_bottle_cnt - 1 sing_beer_main_line(curr_bottle_cnt, 1) insertline '' -- don't use "insert", existing text will get mixed in enddo sing_beer_main_line(curr_bottle_cnt, 1) sing_beer_main_line(curr_bottle_cnt, 0) insertline 'Go to the store and buy some more' curr_bottle_cnt = init_bottle_cnt sing_beer_main_line(curr_bottle_cnt, 1) ; Define a command to execute it from the EPM command line. defc sing_beer_song call sing_beer_song() ; Execute with ctrl-X def c_X = 'sing_beer_song' ; done
DSSP
For Info see http://www.dssp.msk.ru[ 99 bottles in DSSP Programmer: Laszlo Aszalos <aszalos@math.klte.hu> Run it with 99 BOTTLE ] B10 : BOTTLE [N] LOT_OF ONE_LEFT ZERO [] ; : LOT_OF [N] CR C 1- DO ONE_BOTTLE D ; : ONE_BOTTLE [N] ON_THE_WALL .", " CR NUMBER_OFF BOTTLES ."," CR TAKE 1- [N-1] C 1 = IF0 MANY ; : MANY ON_THE_WALL ."." CR ; : TAKE ."take one down, pass it around," CR ; : ON_THE_WALL NUMBER_OFF BOTTLES ." on the wall" ; : BOTTLES ." bottles of beer" ; : ONE_LEFT ONE_ON_THE_WALL ."." CR ONE_ON_THE_WALL ."," CR BOTTLE1 ."," CR ; : ONE_ON_THE_WALL BOTTLE1 ." on the wall" ; : BOTTLE1 ." 1 bottle of beer" ; : ZERO TAKE ZERO_ON ."." CR ZERO_ON ."," CR NO_MORE ."," CR ."go to the store, and buy some more!" CR ; : ZERO_ON NO_MORE ." on the wall" ; : NO_MORE ."no more bottles of beer" ; : NUMBER_OFF C 2 TON ; : NUMBER_OFF C 2 TON ;
Compilation Copyright 1995, 1996, 1997 Tim Robinson. All Rights Reserved 
Permission to copy enthusiastically granted to instructors of computer science
(who would like to demonstrate the styles of different programming languages
to their students) provided that the names of the contributors are retained.
More beer
Back to the Funhouse