99 Bottles of Beer
One program in 571 languages
 
     
  Submit new example     Change log     History     Links     Tip: internet.ls-la.net     Thanks, Oliver     Guestbook      
Choose languages starting with letter:
0-9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
IBasic   IBM/3x0 Assembler   Icon   IDL   IGOR   IJVM   ILE   Illgol   IMP77   Impacto   Inform 6   Inform   Inger   InstallScript   INTERCAL   Io   io   IRCII   Irie Pascal   ISETL   ISM/SML   IT   ITCL Shell  
 
  Programming language: IBasic
 
REM IBasic version of 99 Bottles of beer (Bottles.iba)
REM See http://www.pyxia.com/ibasic.html
REM Philipp Winterberg, http://www.winterbergs.de 

OPENCONSOLE
FOR B = 99 TO 1 #-1
  PRINT B, " bottle(s) of beer on the wall,"
  PRINT B, " bottle(s) of beer."
  PRINT "Take one down, pass it around,"
  PRINT B-1, " bottle(s) of beer on the wall." + chr$(13) + chr$(10)
NEXT B 
INPUT B
CLOSECONSOLE
 
  Programming language: IBM/3x0 Assembler
 
This one is in IBM 360/370/390 assembler, and is known 
to assemble under HLASM/390. Identifiers start in 
column 1, opcodes/instructions in column 10, and 
operands in column 16, with continuation characters in column 72 
when needed. Isn't emulating punched cards fun?

BEER     CSECT
* Standard entry linkage.
          STM   14,12,12(13)
          LR    12,15
          USING BEER,12
          LA    14,BEERSV
          ST    13,4(,14)
          ST    14,8(,13)
          LR    13,14
* The meat of the thing.
          OPEN  (BEERDCB,(OUTPUT))
MOREBEER CP    BOTTLES,=P'0'
          BE    NOBEER
          MVC   LINE1(4),=X'40202120'
          MVC   LINE2(4),=X'40202120'
          MVC   LINE5(4),=X'40202120'
          ED    LINE1(4),BOTTLES
          ED    LINE2(4),BOTTLES
          MVI   LINE1,C'0'
          PUT   BEERDCB,LINE1
          PUT   BEERDCB,LINE2
          PUT   BEERDCB,LINE3
          PUT   BEERDCB,LINE4
          SP    BOTTLES,=P'1'
          ED    LINE5(4),BOTTLES
          PUT   BEERDCB,LINE5
          B     MOREBEER
NOBEER   DS    0H
          CLOSE (BEERDCB)
* Standard exit linkage.
          L     13,4(,13)
          LM    14,12,12(13)
          XR    15,15
          BR    14
          LTORG
BEERSV   DC    18F'0'
BOTTLES  DC    PL2'99'
LINE1    DC    CL132'     bottles of beer on the wall,'
LINE2    DC    CL132'     bottles of beer!'
LINE3    DC    CL132'  Take one down,'
LINE4    DC    CL132'  Pass it around,'
LINE5    DC    CL132'     bottles of beer on the wall!'
BEERDCB  DCB   DDNAME=BEEROUT,                                         X
                DSORG=PS,                                               X
                RECFM=FA,                                               X
                MACRF=PM,                                               X
                LRECL=132
          END   BEER
 
  Programming language: Icon
 
# Scott E Gilbert <scott@cs.arizona.edu>
procedure main()
  t:= table("bottles")
  t[1]:= "bottle"
  every n:= 100 to 1 by -1 do {
    write(n, " ", t[n], " of beer on the wall.\n",
      n, " ", t[n], " of beer.\n",
      "Take one down, Pass it around.\n",
      n-1, " ", t[n-1], " of beer on the wall.\n"
    )
  }
end
 
  Programming language: IDL
 
; The Bottles of Beer song (c) 1996 Eric Korpela (korpela@ssl.berkeley.edu)
; USAGE:  BOTTLES or BOTTLES, NUMBER
;
pro bottles, number
;
if not(keyword_set(number)) then begin
  number=99
  print,'BOTTLES: Defaulting to 99 bottles!'
endif
;
; Set up our song structure............
st1=replicate({n0:0,s1:' bottles of beer on the wall.',          $
               n1:0,s2:' bottles of beer.',                      $
               s3:'You take one down and pass it around.',       $
               n2:0,s4:' bottles of beer on the wall.'}, number)
;
; put in the appropriate numbers
i=(number-1)-indgen(number)
st1(*).n0=i+1
st1(*).n1=i+1
st1(*).n2=i
;
print,st1,format='(i3,a/i3,a/a/i3,a//)'
;
 
  Programming language: IGOR
 
// IGOR version of: 99 Bottles of Beer
// IGOR PRO is a graphing and numerical analysis environment by WaveMetrics, Inc.
//  http://www.wavemetrics.com/
//
//  Kenneth A. Goldberg, http://goldberg.lbl.gov
//
Proc beer(count)
   variable count
   variable i=count
   do
     if (i > 1)
       print, i, "Bottles of beer on the wall, ",i, " Bottles of beer"
     else
       print, i, "Bottle of beer on the wall, ",i, " Bottle of beer"
     endif

     print,
     i -= 1	// increment our loop variable
     if (i > 1)
       print, "Take one down pass it around, ", i, "Bottles of beer on the wall"
     else
       if (i == 1)
         print,  "Take one down pass it around, 1 Bottle of beer on the wall"
       else
         print,  "Take one down pass it around, NO MORE botles of beer on the wall"
       endif
     endif

   while(i > 0)
   print, "Go to the store and buy some more."
End
 
  Programming language: IJVM
 
// Bottles of beer on the wall in IJVM, as defined in 
// _Structured Computer Organization_, 4th edition. IJVM tools are
// found at http://www.ontko.com/mic1/ and 
// http://onegeek.org/~tom/software/ijvm/.
//
// By Tom Rothamel <tom-ijvm@onegeek.org>

.constant
objref 42
.end-constant

.main
.var
i
.end-var

	// Store 99 in i.
	BIPUSH 99
	ISTORE i

	// This loop is executed 99 times, and is terminated at the
	// bottom when i falls to 0.
mainloop:

	/// <i> bottles of beer
	LDC_W OBJREF
	ILOAD i
	INVOKEVIRTUAL printbottlesob
	POP

	/// on the wall,
	BIPUSH 0x20
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x68
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x77
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x2C
	OUT
	BIPUSH 0xA
	OUT

	/// <i> bottles of beer
	LDC_W OBJREF
	ILOAD i
	INVOKEVIRTUAL printbottlesob
	POP

	/// .
	BIPUSH 0x2E
	OUT
	BIPUSH 0xA
	OUT

	// i = i - 1;
	IINC i -1
	
	/// Take one down, pass it around,
	BIPUSH 0x54
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x6B
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x64
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x77
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x2C
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x70
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x73
	OUT
	BIPUSH 0x73
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x69
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x72
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x75
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x64
	OUT
	BIPUSH 0x2C
	OUT
	BIPUSH 0xA
	OUT

	/// <i> bottles of beer
	LDC_W OBJREF
	ILOAD i
	INVOKEVIRTUAL printbottlesob
	POP

	/// on the wall.
	BIPUSH 0x20
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x6E
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x68
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x77
	OUT
	BIPUSH 0x61
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x2E
	OUT
	BIPUSH 0xA
	OUT
	BIPUSH 0xA
	OUT


	// If i reaches zero, we're done. 
	ILOAD i
	IFEQ done

	// Else, repeat.
	GOTO mainloop

done:
	HALT

.end-main


// This is responsible for printing the '<n> bottles of beer' strings 
// seen above. It also properly handles printing 'No' for the case
// where n == 0 and the removal of pluralization for n == 1.
.method printbottlesob(n)
.var
q
oldn
.end-var
	// oldn = n
	ILOAD n
	ISTORE oldn

	// See if n == 0.
	ILOAD n
	IFEQ zero


	// Otherwise, we have a real number and need to divide to convert
	// it to decimal.
	BIPUSH 0x0
	ISTORE q

	// We do that by looping up to 9 times. Sucks, but what the hey.
divide_loop:
	// Bail if n is less than 10.
	ILOAD n
	BIPUSH 0xA
	ISUB
	IFLT divide_done

	// Subtract ten from n, add one to the quotient.
	IINC n -10
	IINC q 1

	GOTO divide_loop


divide_done:
	// Now, we have the first digit of the decimal number in q and the
	// second is left in n.


	// if q is zero, skip printing the first digit.
	ILOAD q
	IFEQ q_is_zero

	// print the first digit.
	BIPUSH 0x30
	ILOAD q
	IADD
	OUT

q_is_zero:	
	// Print the second digit.
	ILOAD n
	BIPUSH 0x30
	IADD
	OUT

	GOTO number_done
	
zero:
	// If we made it here, n == 0. So, instead of printing out '0',
	// we print out 'No'.
	BIPUSH 0x4E
	OUT
	BIPUSH 0x6F
	OUT

number_done:
	// print out ' bottle' in any case.
	BIPUSH 0x20
	OUT
	BIPUSH 0x62
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x74
	OUT
	BIPUSH 0x6C
	OUT
	BIPUSH 0x65
	OUT

	// If oldn == 1, we skip printing out the plural 's', otherwise
	// we print it out.
	BIPUSH 0x1
	ILOAD oldn
	IF_ICMPEQ singular

	BIPUSH 0x73
	OUT
singular:

	// We then print out ' of beer' in any case.
	BIPUSH 0x20
	OUT
	BIPUSH 0x6F
	OUT
	BIPUSH 0x66
	OUT
	BIPUSH 0x20
	OUT
	BIPUSH 0x62
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x65
	OUT
	BIPUSH 0x72
	OUT

	// We return zero, since we have to return something.
	BIPUSH 0x0
	IRETURN
	/// }
.end-method
 
  Programming language: ILE
 
This is IBM's next generation of RPG.

H*
H*  ILE RPG/400 - 99 Bottles of Beer on the Wall.
H*  (IBM AS/400 Midrange Platform)
H*  (Program Source BOTTLESR1)
H*
FBottlesS1 O    E             WorkStn
C
C                   Z-Add     *HIVAL        Bottles1
C
C                   DoW       Bottles1 > *Zero
C                   Eval      Bottles2 = Bottles1
C                   Write     #Display
C                   Sub       1             Bottles1
C                   EndDo
C
C                   Eval      *InLR = *On
C

-----------------------

A*
A*  ILE RPG/400 - 99 Bottles of Beer on the Wall.
A*  (IBM AS/400 Midrange Platform)
A*  (Display File Source BOTTLESS1)
A*
A                                      DSPSIZ(24 80 *DS3)
A          R #DISPLAY                  FRCDTA
A
A            BOTTLES1       2Y 0O  4  2EDTCDE(4)
A                                  4  5'Bottles of Beer On the Wall,'
A            BOTTLES2       2Y 0O  4 34EDTCDE(4)
A                                  4 37'Bottles of Beer,'
A                                  5  2'Take one down, pass it around.'
A
 
  Programming language: Illgol
 
*p={if#0>0print(stu#0)else print"No more";print"
bottle";if#0<>1print"s";
print" of beer"};*i=0;for i=0to 98{do p(99-i);print" on the
wall,",EoL;do
p(99-i);print".",EoL;print"Take one down, pass it around,",EoL;do
p(98-i);print".",EoL,EoL;}

FIN
 
  Programming language: IMP77
 
This is the language IMP77 which is a version of IMP from Edinburgh
University. (IMP is a somewhat modernised version of Atlas Autocode,
one of the earliest programming languages from the 50's)

Edinburgh had another language from the mid 70's called HAL (High-Level
Assembler) which was an assembler with high-level programming construct
support and advanced macros; generally programs in it looked more
like a programming language than an assembler.

There is a *different* language called IMP which is the one that
used to be used by the NSA.  They're not similar.



%begin;         ! This is the Edinburgh programming language IMP
  %routine beer me(%integer bottles)
    %string (255) glass = ""
    ! avoiding use of standard library int->str conversion for no good reason.
    %if bottles > 9 %then glass = to string(bottles//10+'0')
    glass <- glass.to string(bottles - bottles // 10 * 10 + '0')
    glass = "No more" %if glass = "0" {string compare}
    glass <- glass." bottle"
    glass <- glass."s" %if bottles \= 1
    glass <- glass." of beer"
    print string(glass." on the wall".snl)
    %return %if bottles = 0
    print string(glass.snl)
    print string("Take one down, pass it around,".snl)
    beer me(bottles - 1)  {gratuitously recursive, but compiler will fix it!}
  %end
  %cycle
    beer me(99)
    print string("Go to the store and buy some more,".snl)
  %repeat
%end %of %programme
 
  Programming language: Impacto
 
\ Impacto version of 99 Bottles of beer (Bottles.imp) 
\ Philipp Winterberg, http://www.winterbergs.de       
\ See http://scorpius.spaceports.com/~esanto/
for(b = 1, 99, 1) {
  print(100-b " bottle(s) of beer on the wall,\n")	
  print(100-b " bottle(s) of beer.\n")
  print("Take one down, pass it around,\n")
  print(99-b " bottle(s) of beer on the wall.\n\n")
}
end()
 
  Programming language: Inform 6
 
Inform 6 is version 6 of a compiler meant for writing adventure games 
for the  so-called "Z-machine" created by Infocom.  It seems to be 
more object oriented than the original sent to me. 
<a href=http://www.doggysoft.co.uk/inform>Click here</a> for more information.

! -----------------------------------------------------------------------------
! 99 Bottles of Beer on the Wall, Inform 6 version.
!
! Torbjörn Andersson, (d91tan@Student.DoCS.UU.SE), August 1997
! -----------------------------------------------------------------------------

Constant NUM_BOTTLES	99;

Object wall
  private
	bottles_left,
  with	init [ n;
	    self.bottles_left = n;
	],
	bottle_name [;
	    if (self.bottles_left == 1)
		return "bottle";

	    return "bottles";
	],
	bottle_count [;
	    return self.bottles_left;
	],
	take_one_down [;
	    self.bottles_left--;
	];

[ Main;
    wall.init(NUM_BOTTLES);

    while (wall.bottle_count() > 0) {
	print
	    "^",
	    wall.bottle_count(), " ", (string) wall.bottle_name(),
	    " of beer on the wall,^  ",
	    wall.bottle_count(), " ", (string) wall.bottle_name(),
	    " of beer^You take one down and pass it around^  ";

	wall.take_one_down();

	if (wall.bottle_count() == 0)
	    print "No more";
	else
	    print wall.bottle_count();

	print " ", (string) wall.bottle_name(), " of beer on the wall.^";
    }
];
 
  Programming language: Inform
 
Inform is a compiler meant for writing adventure games for the 
so-called "Z-machine" created by Infocom. 
<a href=http://www.doggysoft.co.uk/inform>Click here</a> for more information.

! ---------------------------------------------------------------------------
!  99 Bottles of Beer on the Wall, Inform version [smaller]
!       _
!  Torbjorn Andersson, (d91tan@Minsk.DoCS.UU.SE) December 1995
! ---------------------------------------------------------------------------

! For technical reasons, the first function is not allowed to use local
! variables.

Global i = 99;

[ Main;
    print "^^^^";

    while (i > 0) {
        new_line;
        print i, (char) ' ', (PluralBottle) i, " of beer on the wall,^";
        print (Chorus) i--;
        print "You take one down & pass it around^";
        print (Chorus) i;
    }

    @read_char 1 i;
    quit;
];

[ PluralBottle n;
    if (n == 1)
        print "bottle";
    else
        print "bottles";
];

[ Chorus n;
    print "  ";

    if (n == 0)
        print "No more";
    else
        print n;

    print_ret (char) ' ', (PluralBottle) n, " of beer";
];

end;
 
  Programming language: Inger
 
/*
 * 99 bottles of beer in Inger
 * (http://inger.sourceforge.net)
 *
 * by Alex van Oostenrijk: atrox [@] zebra [.] uem [.] mz
 *
 */

module bottles;

#include "stdio.ih"

void say: int bottles -> void
{
    switch( bottles )
    {
        case 0
        {
            printf( "No more bottles" );
        }
        case 1
        {
            printf( "One bottle" );
        }
        default
        {
            printf( bottles ); 
            printf( "bottles" );
        }
    }
}
  
start beer: void -> void 
{
    int bottles = 99;

    while( bottles > 0 ) do
    {
        say( bottles );
        printf( " of beer on the wall,\n" );
        say( bottles );
        printf( " of beeeeer . . .,\n" );
        printf( "Take one down, pass it around,\n" );
        bottles = bottles - 1;
        say( bottles );
        printf( " of beer on the wall,\n" );
        say( bottles );
        printf( " of beeeeer . . .,\n\n" );
    }

    printf( "\nTime to buy more beer!\n" );
}
 
  Programming language: InstallScript
 
/************************************************************
99 Bottles of Beer in InstallScript    (c) 2003 Andrew Rich / Project Insomnia
Released under GPL for http://99-bottles-of-beer.ls-la.net/
Requires: InstallShield Professional 5 or greater
*************************************************************/

#include "ifx.h"

	NUMBER	nBottles;
	STRING	szTitle, szStatus, szTitleS, szStatusS;

program

	Disable ( BACKGROUND );
	Enable ( STATUSDLG );
	
	for nBottles = 99 downto 0
		switch ( nBottles )
			case	1:
				szTitleS = "";
				szStatusS = "s";				
			default:
				szTitleS = "s";
				switch ( nBottles )
					case	2:
						szStatusS = "";
					default:
						szStatusS = "s";
				endswitch;
		endswitch;
		Sprintf ( szTitle, "%d bottle%s of beer on the wall, %d bottle%s of beer",
			nBottles, szTitleS, nBottles, szTitleS );
		if ( nBottles ) then
			Sprintf ( szStatus, "Take one down, pass it around, %d bottle%s of beer on the wall.",
				nBottles - 1, szStatusS );
		else
			szStatus = "";
		endif;
		SetDialogTitle ( DLG_STATUS, szTitle );
		SetStatusWindow ( nBottles, szStatus );
		Delay ( 1 );
	endfor;
	
	Disable ( STATUSDLG );

endprogram
 
  Programming language: INTERCAL
 
INTERCAL is a real language, apparently created with the 
notion that programming ought to be hard. Program courtesy Matt Dimeo.

PLEASE DO ,10 <- #1
PLEASE DO ,10SUB#1 <- #176
PLEASE DO ,11 <- #30
PLEASE DO ,11SUB#1 <- #76
       DO ,11SUB#2 <- #190
       DO ,11SUB#3 <- #80
       DO ,11SUB#4 <- #200
PLEASE DO ,11SUB#5 <- #256
       DO ,11SUB#6 <- #248
       DO ,11SUB#7 <- #144
       DO ,11SUB#8 <- #216
PLEASE DO ,11SUB#9 <- #202
       DO ,11SUB#10 <- #14
       DO ,11SUB#11 <- #144
       DO ,11SUB#12 <- #98
PLEASE DO ,11SUB#13 <- #190
       DO ,11SUB#14 <- #160
       DO ,11SUB#15 <- #256
       DO ,11SUB#16 <- #88
PLEASE DO ,11SUB#17 <- #74
       DO ,11SUB#18 <- #14
       DO ,11SUB#19 <- #128
       DO ,11SUB#20 <- #114
PLEASE DO ,11SUB#21 <- #214
       DO ,11SUB#22 <- #24
       DO ,11SUB#23 <- #112
       DO ,11SUB#24 <- #162
PLEASE DO ,11SUB#25 <- #22
       DO ,11SUB#26 <- #104
       DO ,11SUB#27 <- #80
       DO ,11SUB#28 <- #256
PLEASE DO ,11SUB#29 <- #2
       DO ,11SUB#30 <- #228
PLEASE DO ,12 <- #49
PLEASE DO ,12SUB#1 <- #76
       DO ,12SUB#2 <- #190
       DO ,12SUB#3 <- #80
       DO ,12SUB#4 <- #200
PLEASE DO ,12SUB#5 <- #256
       DO ,12SUB#6 <- #248
       DO ,12SUB#7 <- #144
       DO ,12SUB#8 <- #216
PLEASE DO ,12SUB#9 <- #202
       DO ,12SUB#10 <- #14
       DO ,12SUB#11 <- #144
       DO ,12SUB#12 <- #98
PLEASE DO ,12SUB#13 <- #190
       DO ,12SUB#14 <- #160
       DO ,12SUB#15 <- #256
       DO ,12SUB#16 <- #88
PLEASE DO ,12SUB#17 <- #218
       DO ,12SUB#18 <- #36
       DO ,12SUB#19 <- #38
       DO ,12SUB#20 <- #164
PLEASE DO ,12SUB#21 <- #176
       DO ,12SUB#22 <- #48
       DO ,12SUB#23 <- #162
       DO ,12SUB#24 <- #14
PLEASE DO ,12SUB#25 <- #128
       DO ,12SUB#26 <- #208
       DO ,12SUB#27 <- #162
       DO ,12SUB#28 <- #222
PLEASE DO ,12SUB#29 <- #48
       DO ,12SUB#30 <- #8
       DO ,12SUB#31 <- #120
       DO ,12SUB#32 <- #66
PLEASE DO ,12SUB#33 <- #48
       DO ,12SUB#34 <- #246
       DO ,12SUB#35 <- #136
       DO ,12SUB#36 <- #184
PLEASE DO ,12SUB#37 <- #256
       DO ,12SUB#38 <- #202
       DO ,12SUB#39 <- #110
       DO ,12SUB#40 <- #104
PLEASE DO ,12SUB#41 <- #42
       DO ,12SUB#42 <- #126
       DO ,12SUB#43 <- #56
       DO ,12SUB#44 <- #88
PLEASE DO ,12SUB#45 <- #72
       DO ,12SUB#46 <- #56
       DO ,12SUB#47 <- #80
       DO ,12SUB#48 <- #242
PLEASE DO ,12SUB#49 <- #228
PLEASE DO ,13 <- #31
PLEASE DO ,13SUB#1 <- #76
       DO ,13SUB#2 <- #190
       DO ,13SUB#3 <- #80
       DO ,13SUB#4 <- #200
PLEASE DO ,13SUB#5 <- #256
       DO ,13SUB#6 <- #248
       DO ,13SUB#7 <- #144
       DO ,13SUB#8 <- #216
PLEASE DO ,13SUB#9 <- #202
       DO ,13SUB#10 <- #14
       DO ,13SUB#11 <- #144
       DO ,13SUB#12 <- #98
PLEASE DO ,13SUB#13 <- #190
       DO ,13SUB#14 <- #160
       DO ,13SUB#15 <- #256
       DO ,13SUB#16 <- #88
PLEASE DO ,13SUB#17 <- #74
       DO ,13SUB#18 <- #14
       DO ,13SUB#19 <- #128
       DO ,13SUB#20 <- #114
PLEASE DO ,13SUB#21 <- #214
       DO ,13SUB#22 <- #24
       DO ,13SUB#23 <- #112
       DO ,13SUB#24 <- #162
PLEASE DO ,13SUB#25 <- #22
       DO ,13SUB#26 <- #104
       DO ,13SUB#27 <- #80
       DO ,13SUB#28 <- #256
PLEASE DO ,13SUB#29 <- #194
       DO ,13SUB#30 <- #36
       DO ,13SUB#31 <- #256
PLEASE DO ,20 <- #10
PLEASE DO ,20 SUB #1 <- #76
       DO ,20 SUB #2 <- #196
       DO ,20 SUB #3 <- #4
       DO ,20 SUB #4 <- #132
PLEASE DO ,20 SUB #5 <- #36
       DO ,20 SUB #6 <- #164
       DO ,20 SUB #7 <- #228
       DO ,20 SUB #8 <- #100
PLEASE DO ,20 SUB #9 <- #52
       DO ,20 SUB #10 <- #180
PLEASE DO ,21 <- #10 BY #10
PLEASE DO ,21SUB#1#1 <- #248
PLEASE DO ,21SUB#1#2 <- #120
PLEASE DO ,21SUB#1#3 <- #184
PLEASE DO ,21SUB#1#4 <- #56
PLEASE DO ,21SUB#1#5 <- #216
PLEASE DO ,21SUB#1#6 <- #88
PLEASE DO ,21SUB#1#7 <- #152
PLEASE DO ,21SUB#1#8 <- #24
PLEASE DO ,21SUB#1#9 <- #232
PLEASE DO ,21SUB#1#10 <- #104
       DO ,21SUB#2#1 <- #128
       DO ,21SUB#2#2 <- #256
       DO ,21SUB#2#3 <- #64
       DO ,21SUB#2#4 <- #192
       DO ,21SUB#2#5 <- #96
       DO ,21SUB#2#6 <- #224
       DO ,21SUB#2#7 <- #32
       DO ,21SUB#2#8 <- #160
       DO ,21SUB#2#9 <- #112
       DO ,21SUB#2#10 <- #240
       DO ,21SUB#3#1 <- #64
       DO ,21SUB#3#2 <- #192
       DO ,21SUB#3#3 <- #256
       DO ,21SUB#3#4 <- #128
       DO ,21SUB#3#5 <- #32
       DO ,21SUB#3#6 <- #160
       DO ,21SUB#3#7 <- #224
       DO ,21SUB#3#8 <- #96
       DO ,21SUB#3#9 <- #48
       DO ,21SUB#3#10 <- #176
       DO ,21SUB#4#1 <- #192
       DO ,21SUB#4#2 <- #64
       DO ,21SUB#4#3 <- #128
       DO ,21SUB#4#4 <- #256
       DO ,21SUB#4#5 <- #160
       DO ,21SUB#4#6 <- #32
       DO ,21SUB#4#7 <- #96
       DO ,21SUB#4#8 <- #224
       DO ,21SUB#4#9 <- #176
       DO ,21SUB#4#10 <- #48
PLEASE DO ,21SUB#5#1 <- #32
PLEASE DO ,21SUB#5#2 <- #160
PLEASE DO ,21SUB#5#3 <- #224
PLEASE DO ,21SUB#5#4 <- #96
PLEASE DO ,21SUB#5#5 <- #256
PLEASE DO ,21SUB#5#6 <- #128
PLEASE DO ,21SUB#5#7 <- #192
PLEASE DO ,21SUB#5#8 <- #64
PLEASE DO ,21SUB#5#9 <- #16
PLEASE DO ,21SUB#5#10 <- #144
       DO ,21SUB#6#1 <- #160
       DO ,21SUB#6#2 <- #32
       DO ,21SUB#6#3 <- #96
       DO ,21SUB#6#4 <- #224
       DO ,21SUB#6#5 <- #128
       DO ,21SUB#6#6 <- #256
       DO ,21SUB#6#7 <- #64
       DO ,21SUB#6#8 <- #192
       DO ,21SUB#6#9 <- #144
       DO ,21SUB#6#10 <- #16
       DO ,21SUB#7#1 <- #96
       DO ,21SUB#7#2 <- #224
       DO ,21SUB#7#3 <- #32
       DO ,21SUB#7#4 <- #160
       DO ,21SUB#7#5 <- #64
       DO ,21SUB#7#6 <- #192
       DO ,21SUB#7#7 <- #256
       DO ,21SUB#7#8 <- #128
       DO ,21SUB#7#9 <- #80
       DO ,21SUB#7#10 <- #208
       DO ,21SUB#8#1 <- #224
       DO ,21SUB#8#2 <- #96
       DO ,21SUB#8#3 <- #160
       DO ,21SUB#8#4 <- #32
       DO ,21SUB#8#5 <- #192
       DO ,21SUB#8#6 <- #64
       DO ,21SUB#8#7 <- #128
       DO ,21SUB#8#8 <- #256
       DO ,21SUB#8#9 <- #208
       DO ,21SUB#8#10 <- #80
PLEASE DO ,21SUB#9#1 <- #16
PLEASE DO ,21SUB#9#2 <- #144
PLEASE DO ,21SUB#9#3 <- #208
PLEASE DO ,21SUB#9#4 <- #80
PLEASE DO ,21SUB#9#5 <- #240
PLEASE DO ,21SUB#9#6 <- #112
PLEASE DO ,21SUB#9#7 <- #176
PLEASE DO ,21SUB#9#8 <- #48
PLEASE DO ,21SUB#9#9 <- #256
PLEASE DO ,21SUB#9#10 <- #128
       DO ,21SUB#10#1 <- #144
       DO ,21SUB#10#2 <- #16
       DO ,21SUB#10#3 <- #80
       DO ,21SUB#10#4 <- #208
       DO ,21SUB#10#5 <- #112
       DO ,21SUB#10#6 <- #240
       DO ,21SUB#10#7 <- #48
       DO ,21SUB#10#8 <- #176
       DO ,21SUB#10#9 <- #128
       DO ,21SUB#10#10 <- #256
PLEASE DO ,22 <- #10
PLEASE DO ,22 SUB #1 <- #8
       DO ,22 SUB #2 <- #136
       DO ,22 SUB #3 <- #72
       DO ,22 SUB #4 <- #200
PLEASE DO ,22 SUB #5 <- #40
       DO ,22 SUB #6 <- #168
       DO ,22 SUB #7 <- #104
       DO ,22 SUB #8 <- #232
PLEASE DO ,22 SUB #9 <- #24
       DO ,22 SUB #10 <- #152
       DO .10 <- #9
       DO .11 <- #9
PLEASE DO ,10 <- #1
PLEASE DO ,10SUB#1 <- #176
       DO READ OUT ,10		
       DO COME FROM (999)	
       DO (500) NEXT		
PLEASE DO ,11SUB#1 <- .5	
       DO READ OUT ,11
       DO (500) NEXT		
       DO ,12SUB#1 <- .5	
PLEASE DO READ OUT ,12
PLEASE DO .6 <- '?"!10~.10'~#1"$#1'~#3
       DO (50) NEXT
PLEASE DO .7 <- '?"!11~.11'~#1"$#1'~#3		
       DO (70) NEXT
       DO .2 <- #1
       DO .1 <- .11
PLEASE DO (1010) NEXT		
       DO .11 <- .3
       DO (600) NEXT		
       DO (101) NEXT		
(70)   DO (71) NEXT
       DO .11 <- #9		
       DO .2 <- #1
PLEASE DO .1 <- .10
       DO (1010) NEXT		
       DO .10 <- .3
       DO (600) NEXT		
       DO (101) NEXT		
(71)   DO RESUME .7		
(50)   DO (51) NEXT
PLEASE DO FORGET #1
       DO .2 <- #1
       DO .1 <- .11
PLEASE DO (1010) NEXT		
       DO .11 <- .3
       DO (600) NEXT		
PLEASE DO .7 <- '?"!11~.11'~#1"$#1'~#3		
       DO (80) NEXT
       DO (101) NEXT
(80)   DO (81) NEXT
       DO GIVE UP
(81)   DO RESUME .7
(51)   DO RESUME .6		
(101) DO FORGET #1
(999) DO FORGET #1		
(600)  DO (500) NEXT		
       DO ,13SUB#1 <- .5	
       DO READ OUT ,13	
       DO RESUME #1
(500)  DO ,30 <- #1		
       DO .1 <- .10		
       DO (1020) NEXT		
PLEASE DO ,30SUB#1 <- ,20SUB.1  
       DO READ OUT ,30		
       DO .3 <- .1		
       DO .1 <- .11		
       DO (1020) NEXT		
PLEASE DO ,30SUB#1 <- ,21SUB .3 .1  
       DO READ OUT ,30		
       DO .5 <- ,22SUB.1	
PLEASE DO RESUME #1		
 
  Programming language: Io
 
See http://www.dekorte.com/Software/C/Io/

bottle = block(i,
     if(i==0, return "no more bottles of beer")
     if(i==1, return "1 bottle of beer")
     return "" .. i .. " bottles of beer"
)

for(i, 99, 1,
     current = bottle(i)
     write(current, " on the wall, ", current, ",\n",
	  "take one down, pass it around,\n",
	  bottle(i - 1), " on the wall.\n\n")
)
 
  Programming language: io
 
#  io version of 99 bottles of beer
#  Laurent Vogel,  http://lvogel.free.fr
#  Tested with the Amalthea interpreter:
#  http://www.dtek.chalmers.se/~d97masa/files/amalthea084.zip

declare p: -> s c; print_string_ s c.
declare nl: -> c; print_string "" c.
declare a: -> n c; = 0 n (p "No more" c); print_int_ n; c.
declare b: -> n c; = 1 n c; p "s"; c.
declare q: -> n c; a n ; p " bottle"; b n; p " of beer"; c.
declare r: -> n c; q n; p " on the wall,"; nl; q n; p "."; nl;
  p "Take one down, pass it around,"; nl; - n 1 -> n; q n; 
  p " on the wall."; nl; nl; = 0 n c; r n c.
r 99 terminate
 
  Programming language: IRCII
 
This is the scripting language for Inter Relay Chat.

alias bottles.start {
        while (1) {
                @ bottles.count = 99;
                while ( bottles.count )
                {
                        bottles.sayonwall ,
                        bottles.say
                        echo Take one down and pass it around
                        @ bottles.count = bottles.count - 1
                        bottles.sayonwall .
                        echo
                }
                echo No more bottles of beer on the wall,
                echo no more bottles of beer,
                echo Go to the store and buy some more,
                echo 99 bottles of beer on the wall.
                echo
        }
}

alias bottles.sayonwall echo $bottles.count bottles of beer on the wall$0
alias bottles.say echo $bottles.count bottles of beer,

bottles.start
 
  Programming language: Irie Pascal
 
// Irie Pascal version of 99 Bottles of beer (Bottles.pas)
// See http://www.irietools.com/
// Philipp Winterberg, http://www.winterbergs.de  

program Bottles(output);  

var b: byte;  
    a, c: string; 

begin 
  a:= #32+#98+#111+#116+#116+#108+#101+#40+#115+#41+#32+#111+#102+#32+#98+#101+#101+#114; 
  c:= #32+#111+#110+#32+#116+#104+#101+#32+#119+#97+#108+#108;   
  b:= 99;  
  repeat 
    writeln(b:2, a, c, #44, #13, #10, b:2, a, #46, #13, #10, #84, #97, #107, #101, #32, 
            #111, #110, #101, #32, #100, #111, #119, #110, #44, #32, #112, #97, #115, 
            #115, #32, #105, #116, #32, #97, #114, #111, #117, #110, #100, #44);
    dec(b);
    writeln(b:2, a, c, #46, #13, #10);
  until b = 0; 
end.
 
  Programming language: ISETL
 
$ ISETL version of 99 Bottles of beer (Bottles.stl)
$ See http://isetlw.muc.edu/isetlw/about.htm
$ Philipp Winterberg, http://www.winterbergs.de

program Bottles;
  local b;
  b:= 99;
  while b > 0 do
    printf b, " bottle(s) of beer on the wall,\n";
    printf b, " bottle(s) of beer.\n";
    b:= b - 1;
    printf "Take one down, pass it around,\n";
    printf b, " bottle(s) of beer on the wall.\n\n";
  end;
end;
 
  Programming language: ISM/SML
 
SML is the language used in ISM/Openmaster, the BULL 
Administrative Platform. ISM/SML (for Integrated System Management 
/ System Management Language).

; Code Begin
; A.Brunet@frcl.bull.fr (Alain Brunet)

(defun beer(cap)
  (dotimes (i cap)
    (print (- cap i) " bottle" (if (= i (- cap 1)) "" "s") " of beer on the wall.")
    (print "Take one down, pass it around.\n")
  )
  (print "Time to buy more beer !")
)

(beer 99)
 
  Programming language: IT
 
This may not qualify for your programming language
survey because there are only 2 or 3 pieces of
equipment in the world that would run it.

The IT (interface tester) was designed in 1986
to test our product's ability to respond to
serial control commands. IT's top speed is 
38.4 Kbaud (and on a 1 MHz processor, that was
considered fast!) IT's a Mot 6809 based thing.

Anyway, it has a sort of "shell" that is 
capable of some rudimentary loops and conditionals.
I no longer work at GPS (Graham-Patten Systems
http://www.gpsys.com ) but IT lives on and is 
still used today to test our products.

So, IT's programming language is over 15 years old.

This has to be all on one line. No \n's.

do 99 (echo -100 bottles of beer on the wall;de 1;echo
-100 bottles of beer;de 1;echo You take one down pass
it around;de 1;-99 bottles of beer on the wall);echo
All gone!

 
  Programming language: ITCL Shell
 
#!/usr/local/bin/itcl_sh
# [incr Tcl] version of "99 bottles of beer"
# Author: Steven Grady
# grady@xcf.berkeley.edu

itcl_class bottle {
	constructor {config} {
		incr numBottles
	}

	destructor {
		incr numBottles -1
	}

	method drink {} {
		puts "Take one down, pass it around,"
		$this delete
	}

	proc numBottleStr {} {
		switch $numBottles {
		  0 {
			return "No more bottles of beer"
		  }
		  1 {
			return "1 bottle of beer"
		  }
		  default {
			return "$numBottles bottles of beer"
		  }
		}
	}

	proc numBottles {} {
		return $numBottles
	}

	common numBottles 0
}

proc createBottles {numBottles} {
	for {set i 0} {$i < $numBottles} {incr i} {
		bottle #auto
	}
}

createBottles 99
foreach b [itcl_info objects -class bottle] {
	set str [bottle :: numBottleStr]
	puts "$str on the wall, $str"
	$b drink
	puts "[bottle :: numBottleStr] on the wall."
}
 
  © Oliver Schade <os@ls-la.net>, Generated: 06.06.2003 17:38:32