# 99 bottles of beer

(Redirected from 99 Bottles of beer)
99 bottles of beer
You are encouraged to solve this task according to the task description, using any language you may know.
Task

Display the complete lyrics for the song:     99 Bottles of Beer on the Wall.

The beer song

The lyrics follow this form:

99 bottles of beer on the wall
99 bottles of beer
Take one down, pass it around
98 bottles of beer on the wall

98 bottles of beer on the wall
98 bottles of beer
Take one down, pass it around
97 bottles of beer on the wall

... and so on, until reaching   0     (zero).

Grammatical support for   1 bottle of beer   is optional.

As with any puzzle, try to do it in as creative/concise/comical a way as possible (simple, obvious solutions allowed, too).

See also

## 11l

Translation of: Python
L(i) (99..1).step(-1)
print(i‘ bottles of beer on the wall’)
print(i‘ bottles of beer’)
print(‘Take one down, pass it around’)
print((i - 1)" bottles of beer on the wall\n")

## 8th

\ 99 bottles of beer on the wall:
: allout "no more bottles" ;
: just-one "1 bottle"  ;
: yeah!	 dup . " bottles" ;

[
' allout ,
' just-one ,
' yeah! ,
] var, bottles

: .bottles  dup 2 n:min bottles @ swap caseof ;
: .beer     .bottles . " of beer" . ;
: .wall     .beer " on the wall" . ;
: .take     "  Take one down and pass it around" . ;
: beers     .wall ", " . .beer '; putc cr
n:1- 0 max .take ", " .
.wall '. putc cr drop ;

' beers 1 99 loop- bye


## AArch64 Assembly

Works with: as version Raspberry Pi 3B version Buster 64 bits
/* ARM assembly AARCH64 Raspberry PI 3B */
/*  program bootleBeer64.s   */

/*******************************************/
/* Constantes file                         */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"

.equ MAXI,   99

/*********************************/
/* Initialized data              */
/*********************************/
.data
szMessLine1:        .asciz "@ bottles of beer on the wall\n"
szMessLine2:        .ascii "@ bottles of beer\n"
.asciz "Take one down, pass it around\n"
szMessLine3:        .asciz "@ bottles of beer on the wall\n\n"

szMessLine4:       .ascii "\nNo more bottles of beer on the wall, no more bottles of beer.\n"
.asciz "Go to the store and buy some more, 99 bottles of beer on the wall.\n"

szCarriageReturn:   .asciz "\n"
/*********************************/
/* UnInitialized data            */
/*********************************/
.bss
sZoneConv:        .skip 24
/*********************************/
/*  code section                 */
/*********************************/
.text
.global main
main:                            // entry of program
mov x2,#MAXI
1:
mov x0,x2
ldr x1,qAdrsZoneConv
bl conversion10              // call decimal conversion
ldr x0,qAdrszMessLine1
ldr x1,qAdrsZoneConv         // insert conversion in message
bl strInsertAtCharInc
bl affichageMess

ldr x0,qAdrszMessLine2
ldr x1,qAdrsZoneConv         // insert conversion in message
bl strInsertAtCharInc
bl affichageMess

subs x0,x2,#1
ble 2f
ldr x1,qAdrsZoneConv
bl conversion10              // call decimal conversion
ldr x0,qAdrszMessLine3
ldr x1,qAdrsZoneConv         // insert conversion in message
bl strInsertAtCharInc
bl affichageMess
2:
subs x2,x2,1
bgt 1b

ldr x0,qAdrszMessLine4
bl affichageMess

100:                                  // standard end of the program
mov x0, #0                        // return code
mov x8, #EXIT                     // request to exit program
svc #0                            // perform the system call

qAdrszCarriageReturn:     .quad szCarriageReturn
qAdrszMessLine1:          .quad szMessLine1
qAdrszMessLine2:          .quad szMessLine2
qAdrszMessLine3:          .quad szMessLine3
qAdrszMessLine4:          .quad szMessLine4
qAdrsZoneConv:            .quad sZoneConv

/********************************************************/
/*        File Include fonctions                        */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"

## ABAP

REPORT z99bottles.

DATA lv_no_bottles(2) TYPE n VALUE 99.

DO lv_no_bottles TIMES.
WRITE lv_no_bottles NO-ZERO.
WRITE ' bottles of beer on the wall'.
NEW-LINE.
WRITE lv_no_bottles NO-ZERO.
WRITE ' bottles of beer'.
NEW-LINE.
WRITE 'Take one down, pass it around'.
NEW-LINE.
SUBTRACT 1 FROM lv_no_bottles.
WRITE lv_no_bottles NO-ZERO.
WRITE ' bottles of beer on the wall'.
WRITE /.
ENDDO.


or (With ABAP 7.40)

REPORT YCL_99_BOTTLES.

DATA it_99_bottles TYPE TABLE OF string WITH EMPTY KEY.
DATA(cr_lf) = cl_abap_char_utilities=>cr_lf.
it_99_bottles = VALUE #(
FOR i = 99 THEN i - 1 UNTIL i = 0 ( COND string( LET  lv = ( i - 1 )
lr = i && | bottles of beer on the wall|
&& cr_lf
&& i && | bottles of beer|
&& cr_lf
&& |Take one down, pass it around|
&& cr_lf
&& lv && | bottles of beer on the wall|
&& cr_lf IN WHEN 1 = 1 THEN lr )
)
).
cl_demo_output=>write( it_99_bottles ).
cl_demo_output=>display( ).


## ABC

HOW TO RETURN bottles n:
SELECT:
n<0: RETURN "99 bottles"
n=0: RETURN "No more bottles"
n=1: RETURN "1 bottle"
n>1: RETURN "n bottles"

HOW TO SING VERSE n:
WRITE "bottles n of beer on the wall,"/
WRITE "bottles n of beer,"/
SELECT:
n=0: WRITE "Go to the store and buy some more,"/
n=1: WRITE "Take it down and pass it around,"/
n>1: WRITE "Take one down and pass it around,"/
WRITE "bottles (n-1) of beer on the wall."/
WRITE /

FOR n IN {0..99}:
SING VERSE 99-n

## Action!

PROC Bottles(BYTE i)
IF i=0 THEN
Print("No more")
ELSE
PrintB(i)
FI
Print(" bottle")
IF i#1 THEN
Print("s")
FI
RETURN

PROC Main()
BYTE i=[99]

WHILE i>0
DO
Bottles(i) PrintE(" of beer on the wall,")
Bottles(i) PrintE(" of beer,")
Print("Take ")
IF i>1 THEN
Print("one")
ELSE
Print("it")
FI
PrintE(" down and pass it around,")
i==-1
Bottles(i) PrintE(" of beer on the wall.")
IF i>0 THEN
PutE()
FI
OD
RETURN
Output:
99 bottles of beer on the wall,
99 bottles of beer,
Take one down and pass it around,
98 bottles of beer on the wall.

...

2 bottles of beer on the wall,
2 bottles of beer,
Take one down and pass it around,
1 bottle of beer on the wall.

1 bottle of beer on the wall,
1 bottle of beer,
Take it down and pass it around,
No more bottles of beer on the wall.


## ActionScript

for(var numBottles:uint = 99; numBottles > 0; numBottles--)
{
trace(numBottles, " bottles of beer on the wall");
trace(numBottles, " bottles of beer");
trace("Take one down, pass it around");
trace(numBottles - 1, " bottles of beer on the wall\n");
}


## Ada

### Simple version

with Ada.Text_Io; use Ada.Text_Io;

procedure Bottles is
begin
for X in reverse 1..99 loop
Put_Line(Integer'Image(X) & " bottles of beer on the wall");
Put_Line(Integer'Image(X) & " bottles of beer");
Put_Line("Take one down, pass it around");
Put_Line(Integer'Image(X - 1) & " bottles of beer on the wall");
New_Line;
end loop;
end Bottles;


### Concurrent version

with 1 task to print out the information and 99 tasks to specify the number of bottles

with Ada.Text_Io; use Ada.Text_Io;

procedure Tasking_99_Bottles is
subtype Num_Bottles is Natural range 1..99;
task Print is
entry Set (Num_Bottles);
end Print;
task body Print is
Num : Natural;
begin
for I in reverse Num_Bottles'range loop
select
accept
Set(I) do -- Rendezvous with Counter task I
Num := I;
end Set;
Put_Line(Integer'Image(Num) & " bottles of beer on the wall");
Put_Line(Integer'Image(Num) & " bottles of beer");
Put_Line("Take one down, pass it around");
Put_Line(Integer'Image(Num - 1) & " bottles of beer on the wall");
New_Line;
or terminate; -- end when all Counter tasks have completed
end select;
end loop;
end Print;
task type Counter(I : Num_Bottles);
task body Counter is
begin
Print.Set(I);
end Counter;
type Task_Access is access Counter;

Task_List : array(Num_Bottles) of Task_Access;

begin
for I in Task_List'range loop -- Create 99 Counter tasks
Task_List(I) := new Counter(I);
end loop;
end Tasking_99_Bottles;


## Aime

integer bottles;

bottles = 99;

do {
o_(bottles, " bottles of beer on the wall\n");
o_(bottles, " bottles of beer\n");
o_("Take one down, pass it around\n");
o_(bottles -= 1, " bottles of beer on the wall\n\n");
} while (bottles);

## Algae

# 99 Bottles of Beer on the Wall
# in Algae
# bottles.A
for (i in 99:1:1) {
if (i != 1) {
printf("%d bottles of beer on the wall\n";i);
printf("%d bottles of beer...\n";i);
printf("you take on down and pass it around...\n");
if ( i == 2) {
printf("%d bottles of beer on the wall\n\n";i-1);
else
printf("%d bottles of beer on the wall\n\n";i-1);
}
else
printf("1 bottle of beer on the wall\n");
printf("1 bottle of beer...\n");
printf("you take on down and pass it around..\n");
printf("no more bottles of beer on the wall!\n\n");
}
}

## ALGOL 60

begin
integer n;

for n:= 99 step -1 until 2 do
begin
outinteger(1,n);
outstring(1,"bottles of beer on the wall,");
outinteger(1,n);
outstring(1,"bottles of beer.\nTake one down and pass it around,");
outstring(1,"of beer on the wall...\n\n")
end;

outstring(1," 1 bottle of beer on the wall, 1 bottle of beer.\n");
outstring(1,"Take one down and pass it around, no more bottles of beer on the wall...\n\n");

outstring(1,"No more bottles of beer on the wall, no more bottles of beer.\n");
outstring(1,"Go to the store and buy some more, 99 bottles of beer on the wall.")
end

## ALGOL 68

Works with: ALGOL 68 version Standard - no extensions to language used
Works with: ALGOL 68G version Any - tested with release mk15-0.8b.fc9.i386
main:(
FOR bottles FROM 99 TO 1 BY -1 DO
printf(($z-d" bottles of beer on the wall"l$, bottles));
printf(($z-d" bottles of beer"l$, bottles));
printf(($"Take one down, pass it around"l$));
printf(($z-d" bottles of beer on the wall"ll$, bottles-1))
OD
)

## ALGOL-M

BEGIN

COMMENT PRINT LYRICS TO "99 BOTTLES OF BEER ON THE WALL";

STRING FUNCTION BOTTLE(N); % GIVE CORRECT GRAMMATICAL FORM %
INTEGER N;
BEGIN
IF N = 1 THEN
BOTTLE := " BOTTLE"
ELSE
BOTTLE := " BOTTLES";
END;

INTEGER N;

N := 99;
WHILE N > 0 DO
BEGIN
WRITE(N, BOTTLE(N), " OF BEER ON THE WALL,");
WRITEON(N, BOTTLE(N), " OF BEER");
WRITE("TAKE ONE DOWN AND PASS IT AROUND, ");
N := N - 1;
IF N = 0 THEN
WRITEON("NO MORE")
ELSE
WRITEON(N);
WRITEON(BOTTLE(N), " OF BEER ON THE WALL");
WRITE(" "); % BLANK LINE BETWEEN STANZAS %
END;
WRITE("THANKS FOR SINGING ALONG!");

END

## AmigaE

PROC main()
DEF t: PTR TO CHAR,
s: PTR TO CHAR,
u: PTR TO CHAR, i, x
t := 'Take one down, pass it around\n'
s := '\d bottle\s of beer\s\n'
u := ' on the wall'
FOR i := 99 TO 0 STEP -1
ForAll({x}, [u, NIL], WriteF(s, i, IF i <> 1 THEN 's' ELSE NIL,
x))
IF i > 0 THEN WriteF(t)
ENDFOR
ENDPROC

## Apache Ant

Implementation in Apache Ant, due to the limitations of Ant, this requires ant-contrib for arithmetic operations and a dummy target to keep Ant from detecting the loop.

<?xml version="1.0"?>
<project name="n bottles" default="99_bottles">

<!-- ant-contrib.sourceforge.net for arithmetic and if -->
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

<!-- start count of bottles, you can set this with
e.g. ant -f 99.xml -Dcount=10 -->
<property name="count" value="99"/>

<target name="99_bottles">
<antcall target="bottle">
<param name="number" value="${count}"/> </antcall> </target> <target name="bottle"> <echo message="${number} bottles of beer on the wall"/>
<echo message="${number} bottles of beer"/> <echo message="Take one down, pass it around"/> <math result="result" operand1="${number}" operation="-" operand2="1" datatype="int"/>

<echo message="${result} bottles of beer on the wall"/> <if> <not><equals arg1="${result}" arg2="0" /></not>
<then>
<antcall target="bottleiterate">
<param name="number" value="${result}"/> </antcall> </then> </if> </target> <target name="bottleiterate"> <antcall target="bottle"> <param name="number" value="${number}"/>
</antcall>
</target>

</project>


## Apex

   for(Integer i = 99; i=0; i--){
system.debug(i + ' bottles of beer on the wall');
system.debug('\n');
system.debug(i + ' bottles of beer on the wall');
system.debug(i + ' bottles of beer');
system.debug('take one down, pass it around');
}

## APL

Works with: Dyalog APL
Works with: GNU APL

### Classic version

Translation of: J
     bob  ←  { (⍕⍵), ' bottle', (1=⍵)↓'s of beer'}
bobw ←  {(bob ⍵) , ' on the wall'}
beer ←  { (bobw ⍵) , ', ', (bob ⍵) , '; take one down and pass it around, ', bobw ⍵-1}

     ⍝ Dyalog APL invocation
99↑beer¨ ⌽(1-⎕IO)+⍳99

     ⍝ GNU APL invocation (↑ and ⊃ differ, traditional APL2 meanings)
⊃beer¨ ⌽(1-⎕IO)+⍳99


### One line version

     ⍝ Dyalog and GNU APL
⍪{(⍕⍵),' bottles of beer on the wall, take one down and pass it around, ',(⍕⍵-1),' bottles of beer on the wall'}¨⌽⍳99


## App Inventor

### Using a 'for each <number>' block (simplest)

Note that the output label text is not displayed until the entire lyrics text has been built and there is some delay between button press and display. <CLICK HERE TO VIEW THE BLOCKS AND OUTPUT>

### Using a Clock Timer block (preferrred)

Output can be sent directly to a label with this preferred method as there is no noticeable delay between button press and output. <CLICK HERE TO VIEW THE BLOCKS AND OUTPUT>

## AppleScript

### Iteration

repeat with beerCount from 99 to 1 by -1
set bottles to "bottles"
if beerCount < 99 then
if beerCount = 1 then
set bottles to "bottle"
end
log "" & beerCount & " " & bottles & " of beer on the wall"
log ""
end
log "" & beerCount & " " & bottles & " of beer on the wall"
log "" & beerCount & " " & bottles & " of beer"
log "Take one down, pass it around"
end
log "No more bottles of beer on the wall!"


### Declaration

-- BRIEF -----------------------------------------------------------------------
on run
set localisations to ¬
{"on the wall", ¬
"Take one down, pass it around", ¬
"Better go to the store to buy some more", "bottle"}

intercalate("\n\n", ¬
(map(curry(incantation)'s |λ|(localisations), enumFromTo(99, 0))))
end run

-- DECLARATIVE -----------------------------------------------------------------

-- incantation :: [String] -> Int -> String
on incantation(xs, n)
script asset
on |λ|(n)
unwords({(n as string), item -1 of xs & cond(n ≠ 1, "s", "")})
end |λ|
end script

script store
on |λ|(n)
unwords({asset's |λ|(n), item 1 of xs})
end |λ|
end script

set {distribute, solve} to items 2 thru 3 of xs
if n > 0 then
unlines({store's |λ|(n), asset's |λ|(n), distribute, store's |λ|(n - 1)})
else
solve
end if
end incantation

-- GENERICALLY DYSFUNCTIONAL ---------------------------------------------------

-- cond :: Bool -> a -> a -> a
on cond(bln, f, g)
if bln then
f
else
g
end if
end cond

-- curry :: (Script|Handler) -> Script
on curry(f)
script
on |λ|(a)
script
on |λ|(b)
|λ|(a, b) of mReturn(f)
end |λ|
end script
end |λ|
end script
end curry

-- enumFromTo :: Int -> Int -> [Int]
on enumFromTo(m, n)
if m > n then
set d to -1
else
set d to 1
end if
set lst to {}
repeat with i from m to n by d
set end of lst to i
end repeat
return lst
end enumFromTo

-- intercalate :: Text -> [Text] -> Text
on intercalate(strText, lstText)
set {dlm, my text item delimiters} to {my text item delimiters, strText}
set strJoined to lstText as text
set my text item delimiters to dlm
return strJoined
end intercalate

-- map :: (a -> b) -> [a] -> [b]
on map(f, xs)
tell mReturn(f)
set lng to length of xs
set lst to {}
repeat with i from 1 to lng
set end of lst to |λ|(item i of xs, i, xs)
end repeat
return lst
end tell
end map

-- Lift 2nd class handler function into 1st class script wrapper
-- mReturn :: Handler -> Script
on mReturn(f)
if class of f is script then
f
else
script
property |λ| : f
end script
end if
end mReturn

-- unlines :: [String] -> String
on unlines(xs)
intercalate(linefeed, xs)
end unlines

-- unwords :: [String] -> String
on unwords(xs)
intercalate(space, xs)
end unwords


## Arbre

bottle(x):
template: '
$x bottles of beer on the wall.$x bottles of beer.
Take one down and pass it around,
$y bottles of beer on the wall. ' if x==0 template~{x: 'No more', y: 'No more'} else if x==1 template~{x: x, y: 'No more'} else template~{x: x, y: x-1} bottles(n): for x in [n..0] bottle(x) 99bottles(): bottles(99) -> io ## Argile use std let X be an int for each X from 99 down to 1 prints X bottles of beer on the wall prints X bottles of beer prints "Take one down, pass it" around if X == 1 echo No more "beer." Call da "amber lamps" break X-- prints X bottles of beer on the wall "\n" X++ .:around :. -> text {X>59 ? "around", "to me"} .:bottles:. -> text {X> 5 ? "bottles", (X>1 ? "buttles", "wall")} .:of beer:. -> text {X>11 ? "of beer", "ov beeer"} .:on the wall:. -> text { X>17 ? "on the wall", (X>1 ? "on the bwall", "in the buttle") } ## ARM Assembly ## ArnoldC As ArnoldC does not feature string concatenation, the numbers of bottles and the rest of the parts of the lyrics are printed on separate lines. IT'S SHOWTIME HEY CHRISTMAS TREE is0 YOU SET US UP @NO PROBLEMO HEY CHRISTMAS TREE bottles YOU SET US UP 99 STICK AROUND is0 TALK TO THE HAND bottles TALK TO THE HAND " bottles of beer on the wall" TALK TO THE HAND bottles TALK TO THE HAND " bottles of beer" TALK TO THE HAND "Take one down, pass it around" GET TO THE CHOPPER bottles HERE IS MY INVITATION bottles GET DOWN 1 ENOUGH TALK TALK TO THE HAND bottles TALK TO THE HAND " bottles of beer on the wall" GET TO THE CHOPPER is0 HERE IS MY INVITATION bottles LET OFF SOME STEAM BENNET 0 ENOUGH TALK CHILL YOU HAVE BEEN TERMINATED ## Arturo s: "s" loop 99..1 'i [ print ~"|i| bottle|s| of beer on the wall," print ~"|i| bottle|s| of beer" print ~"Take one down, pass it around!" if 1=i-1 -> s: "" if? i>1 [ print ~"|i-1| bottle|s| of beer on the wall!" print "" ] else -> print "No more bottles of beer on the wall!" ]  ## AsciiDots  /-99#-. />*$_#-$_" bottles of beer on the wall, "-$_#-$" bottles of beer."\ |[-]1#-----" ,dnuora ti ssap dna nwod eno ekaT"_$-----------------/
| |
| | &-".llaw eht no reeb fo selttob 99 ,erom emos yub dna erots eht ot oG"$\ | |/$""-$"No more bottles of beer on the wall, no more bottles of beer."---/ | |\".llaw eht no reeb fo selttob erom on ,dnuora ti ssap dna nwod eno ekaT"$-".reeb fo elttob 1"$\ | | /-$"1 bottle of beer on the wall."-$""-$_"1 bottle of beer on the wall, "------------/
| | /-------\|
| \-*--{=}-\\~$_#-$" bottles of beer on the wall."\
|   \-#1/  \-/                                    |
\----------------------------------------------""$/ ## Astro fun bottles(n): match __args__: (0) => "No more bottles" (1) => "1 bottle" (_) => "$n bottles"

for n in 99..-1..1:
print @format"""
{bottles n} of beer on the wall
{bottles n} of beer
Take one down, pass it around
{bottles n-1} of beer on the wall\n
"""


## Asymptote

// Rosetta Code problem: http://rosettacode.org/wiki/99_bottles_of_beer
// by Jjuanhdez, 05/2022

int bottles = 99;

for (int i = bottles; i > 0; --i) {
write(string(i), " bottles of beer on the wall,");
write(string(i), " bottles of beer.");
write("Take one down and pass it around,");
if (i == 1) {
write("no more bottles of beer on the wall...");
} else {
write(string(i-1), " bottles of beer on the wall...");
}
}

write("No more bottles of beer on the wall,");
write("no more bottles of beer.");
write("Go to the store and buy some more,");
write(" 99 bottles of beer on the wall.");


## ATS

//
#include
"share/atspre_staload.hats"
//
(* ****** ****** *)

fun bottles
(n0: int): void = let
//
fun loop (n: int): void =
(
if n > 0 then
(
if n0 > n then println! ();
println! (n, " bottles of beer on the wall");
println! (n, " bottles of beer");
println! ("Take one down, pass it around");
println! (n-1, " bottles of beer on the wall");
loop (n - 1)
) (* end of [if] *)
)
//
in
loop (n0)
end // end of [bottles]

(* ****** ****** *)

implement main0 () = bottles (99)

## AWK

### Regular version

If you don't want so many beers, here you can specify the starting amount.
For example, just a sixpack:

# usage:  gawk  -v i=6  -f beersong.awk

function bb(n) {
b = " bottles of beer"
if( n==1 ) { sub("s","",b) }
if( n==0 ) { n="No more" }
return n b
}

BEGIN {
if( !i ) { i = 99 }
ow = "on the wall"
td = "Take one down, pass it around."
print "The beersong:\n"
while (i > 0) {
printf( "%s %s,\n%s.\n%s\n%s %s.\n\n",
bb(i), ow, bb(i), td, bb(--i), ow )
if( i==1 ) sub( "one","it", td )
}
print "Go to the store and buy some more!"
}

Output:
The beersong:

99 bottles of beer on the wall,
99 bottles of beer.
Take one down, pass it around.
98 bottles of beer on the wall.

...

3 bottles of beer on the wall,
3 bottles of beer.
Take one down, pass it around.
2 bottles of beer on the wall.

2 bottles of beer on the wall,
2 bottles of beer.
Take one down, pass it around.
1 bottle of beer on the wall.

1 bottle of beer on the wall,
1 bottle of beer.
Take it down, pass it around.
No more bottles of beer on the wall.

Go to the store and buy some more!


## Axe

Pauses are added to accommodate the small calculator screen so all of the text can be read.

99→B
While B
Disp B▶Dec," BOTTLES OF","BEER ON THE WALL"
Disp B▶Dec," BOTTLES OF","BEER",i,i
getKeyʳ
Disp "TAKE ONE DOWN",i,"PASS IT AROUND",i
B--
Disp B▶Dec," BOTTLES OF","BEER ON THE WALL",i
getKeyʳ
End

## Babel

-- beer.sp

{b  " bottles of beer"         <
bi { itoa << }                <
bb { bi ! b << w << "\n" << } <
w  " on the wall"             <
beer
{<-
{ iter 1 + dup
<- bb ! ->
bi ! b << "\n" <<
"Take one down, pass it around\n" <<
iter bb ! "\n" << }
->
times}
< }

-- At the prompt, type 'N beer !' (no quotes), where N is the number of stanzas you desire

## BabyCobol

      * Pointing out some interesting things:
*    - BY 0 subclause of VARYING (illegal in some COBOL dialects)
*    - PERFORM THROUGH with internal/external GO TOs
*    - using non-reserved keywords (END, DATA)
*    - ALTER (works the same way in COBOL)
*    - fall-through from MANY-BOTTLES
*    - the last NEXT SENTENCE does nothing (plays the role of EXIT)
IDENTIFICATION DIVISION.
PROGRAM-ID. 99 BOTTLES.
DATA DIVISION.
01 DATA PICTURE IS 999.
PROCEDURE DIVISION.
LOOP VARYING DATA FROM 99 BY 0
PERFORM COUNT-BOTTLES THROUGH END
DISPLAY DATA "bottles of beer"
DISPLAY "Take one down, pass it around"
SUBTRACT 1 FROM DATA
IF DATA = 1
THEN ALTER COUNT-BOTTLES TO PROCEED TO SINGLE-BOTTLE
END
PERFORM COUNT-BOTTLES THROUGH END
DISPLAY ""
END.
NO-BOTTLES-LEFT.
DISPLAY "No bottles of beer on the wall"
DISPLAY ""
DISPLAY "Go to the store and buy some more"
DISPLAY "99 bottles of beer on the wall".
STOP.
COUNT-BOTTLES.
GO TO MANY-BOTTLES.
SINGLE-BOTTLE.
DISPLAY DATA "bottle of beer on the wall".
GO TO NO-BOTTLES-LEFT.
MANY-BOTTLES.
DISPLAY DATA "bottles of beer on the wall".
END.
NEXT SENTENCE.


## Battlestar

const bottle = " bottle"
const plural = "s"
const ofbeer = " of beer"
const wall = " on the wall"
const sep = ", "
const takedown = "Take one down and pass it around, "
const u_no = "No"
const l_no = "no"
const more = " more bottles of beer"
const store = "Go to the store and buy some more, "
const dotnl = ".\n"
const nl = "\n"

// Reserve 1024 bytes in the .bss section
var x 1024

// Write two digits, based on the value in a
fun printnum
b = a
a >= 10
a /= 10
// modulo is in the d register after idiv
b = d
a += 48 // ASCII value for '0'
print(chr(a))
end
a = b
a += 48 // ASCII value for '0'
print(chr(a))
end

fun main
loop 99
// Save loop counter for later, twice
c -> stack
c -> stack

// Print the loop counter (passed in the a register)
a = c
printnum()

// N, "bottles of beer on the wall, "
x = bottle
x += plural
x += ofbeer
x += wall
x += sep
print(x)

// Retrieve and print the number
stack -> a
printnum()

// N, "bottles of beer.\nTake one down and pass it around,"
x = bottle
x += plural
x += ofbeer
x += dotnl
x += takedown
print(x)

// N-1, "bottles of beer on the wall."
stack -> a
a--

// Store N-1, used just a few lines down
a -> stack
printnum()
print(bottle)

// Retrieve N-1
stack -> a

// Write an "s" if the count is not 1
a != 1
print(plural)
end

// Write the rest + a blank line
x = ofbeer
x += wall
x += dotnl
x += nl
print(x)

// Skip to the top of the loop while the counter is >= 2
continue (c >= 2)

// At the last two

// "1 bottle of beer on the wall,"
a = 1
printnum()
x = bottle
x += ofbeer
x += wall
x += sep
print(x)

// "1"
a = 1
printnum()

// "bottle of beer. Take one down and pass it around,"
// "no more bottles of beer on the wall."
// Blank line
// "No more bottles of beer on the wall,"
// "no more bottles of beer."
// "Go to the store and buy some more,"
x = bottle
x += ofbeer
x += dotnl
x += takedown
x += l_no
x += more
x += wall
x += dotnl
x += nl
x += u_no
x += more
x += wall
x += sep
x += l_no
x += more
x += dotnl
x += store
print(x)

// "99"
a = 99
printnum()

// "bottles of beer on the wall."
x = bottle
x += plural
x += ofbeer
x += wall
x += dotnl
print(x)
end
end

// vim: set syntax=c ts=4 sw=4 et:


## Bc

Works with: GNU bc version 1.06
i = 99;
while ( 1 ) {
print i , " bottles of beer on the wall\n";
print i , " bottles of beer\nTake one down, pass it around\n";
if (i == 2) {
break
}
print --i , " bottles of beer on the wall\n";
}

print --i , " bottle of beer on the wall\n";
print   i , " bottle of beer on the wall\n";
print   i , " bottle of beer\nTake it down, pass it around\nno more bottles of beer on the wall\n";
quit


## BCPL

get "libhdr"

let number(n) be
test n=0
then writes("No more")
else writen(n)

let plural(n) be
test n=1
then writes(" bottle")
else writes(" bottles")

let bottles(n) be
$( number(n) plural(n)$)

let verse(n) be
$( bottles(n) writes(" of beer on the wall,*N") bottles(n) writes(" of beer,*NTake ") test n=1 then writes("it") else writes("one") writes(" down and pass it around,*N") bottles(n-1) writes(" of beer on the wall!*N*N")$)

let start() be
for n = 99 to 1 by -1 do verse(n)

## beeswax

Straightforward implementation, displaying the full lyrics given on [ http://99-bottles-of-beer.net/ ]

  >       NN      p
> d#_8~2~(P~3~.~1~>{ bottles of beer on the wall, { bottles of beer.q
d.llaw eht no reeb fo selttob {pLM ,dnuora ti ssap dna nwod eno ekaTN<
q.llaw eht no reeb fo elttob  {<
>        NN       >{ bottle of beer on the wall, { bottle of beer.N  q
pN .llaw eht no reeb fo selttob erom on ,dnuora ti ssap dna nwod eno ekaT<
>NNo more bottles of beer on the wall, no more bottles of beer.N  q
;.llaw eht no reeb fo selttob 99 ,erom emos yub dna erots eht ot oG<

A much more “economic” version that tries to avoid repetition at the price of complicated conditional jumps and self-modifying code that takes up more place than the actual strings themselves. Output is the same as in the straightforward version.

#D@.9~2~@M.7~P9zE       Np
DMM@.9@.~2~.++~5zE      n>op
>0f1ff#             q   erom <           #h3~1z<           #h3~1z<    #h3~1z<
d_8~2~(P~3~.  ~1~>"b{>X^^^ bottle  of beer@g"pX on the wallg"pX   ,  @p #
> d   <#XL#^^^^^s#            #  ##      #        >    .NN@  X#
b                                             <            <  <
>~L#^^^^s#      #h3~1zX    #h3~1z<#      #  #      # #
d             #h3~1z<#            #> .   g"pXN @"p Take one down and p
>^^^^^^^^^;     .#   b              XgNN                    <       bM ,dnuora ti ssap<
d^^^^^^^^^^^^^^^^X~3~P(~2~8 ,erom emos yub dna erots eht ot oG<

## BlitzMax

local bot:int = 99

repeat
print string(bot)+" bottles of beer on the wall,"
print string(bot)+" bottles of beer."
print "Take one down, pass it around,"
bot:-1
print string(bot)+" bottles of beer on the wall."
print
until bot = 1

print "1 bottle of beer on the wall,"
print "1 bottle of beer."
print "Take it down, pass it around,"
print "No more bottles of beer on the wall!"


## BlooP

Output is always in caps in the interpreter I use, but I typed the input in correct case to spare those whose interpreter might do lowercase and don't want to have this song shouted at them ;D.

DEFINE PROCEDURE ''MINUS'' [A,B]:
BLOCK 0: BEGIN
IF A < B, THEN:
QUIT BLOCK 0;
LOOP AT MOST A TIMES:
BLOCK 1: BEGIN
IF OUTPUT + B = A, THEN:
QUIT BLOCK 0;
OUTPUT <= OUTPUT + 1;
BLOCK 1: END;
BLOCK 0: END.

DEFINE PROCEDURE ''BOTTLES'' [COUNT]:
BLOCK 0: BEGIN
CELL(0) <= COUNT;
LOOP COUNT + 1 TIMES:

BLOCK 1: BEGIN

IF CELL(0) > 1, THEN:
PRINT[CELL(0), ' bottles of beer on the wall, ', CELL(0), ' bottles of beer. Take one down, pass it around, ', MINUS[CELL(0), 1], ' bottles of beer on the wall.'];

IF CELL(0) = 1, THEN:
PRINT['1 botle of beer on the wall, 1 bottle of beer. Take one down, pass it around, No more bottles of beer on the wall.'];

IF CELL(0) = 0, THEN:
PRINT['No more bottles of beer on the wall, no more bottles of beer. Go to the store, buy 99 more, 99 bottles of beer on the wall!'];

CELL(0) <= MINUS[CELL(0), 1];

BLOCK 1: END;
BLOCK 0: END.

BOTTLES[99];

## Bracmat

Copy the code to a file called BottlesOfBeer.bra. Start Bracmat and after the {?} prompt write get$"BottlesOfBeer.bra" <Enter>. Then, after the next prompt, write !r <Enter>. Notice that the lyrics has two more lines at the end: 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. Code to save to BottlesOfBeer.bra: {BottlesOfBeer.bra See http://99-bottles-of-beer.net/} X= new = n upper nbottles lyrics . 99:?n & ( upper = .@(!arg:%@?a ?z)&str$(upp$!a !z) ) & ( nbottles = . str$ ( (   !arg:>0
&   !arg
" bottle"
(!arg:1&|s)
| "no more bottles"
)
" of beer"
)
)
& ( lyrics
=   (upper$(nbottles$!n:?x) " on the wall, " !x ".\n")
(   !n+-1:?n:~<0
&   "Take one down and pass it around, "
nbottles$!n " on the wall. " !lyrics | "Go to the store and buy some more, " nbottles$99
" on the wall.
"
)
)
& put$(str$!lyrics);

r=
get'"BottlesOfBeer.bra"
& rmv$(str$(BottlesOfBeer ".bak"))
& ren$("BottlesOfBeer.bra".str$(BottlesOfBeer ".bak"))
&   put
$( "{BottlesOfBeer.bra See http://99-bottles-of-beer.net/} " , "BottlesOfBeer.bra" , NEW ) & lst'(X,"BottlesOfBeer.bra",APP) & put'(\n,"BottlesOfBeer.bra",APP) & lst'(r,"BottlesOfBeer.bra",APP) & put$(str$("\nnew'" X ";\n"),"BottlesOfBeer.bra",APP); new'X; ## Brainf*** ## Brat 99.to 2 { n | p "#{n} bottles of beer on the wall, #{n} bottles of beer!" p "Take one down, pass it around, #{n - 1} bottle#{true? n > 2 's' ''} of beer on the wall." } p "One bottle of beer on the wall, one bottle of beer!" p "Take one down, pass it around, no more bottles of beer on the wall." ## Bruijn :import std/Combinator . :import std/Number . :import std/String . main [y [[=?0 case-end case-rec]] (+99)] case-rec n ++ t1 ++ n ++ t2 ++ t3 ++ n ++ t1 ++ "\n" ++ (1 --0) n number→string 0 t1 " bottles of beer on the wall\n" t2 " bottles of beer\n" t3 "Take one down, pass it around\n" case-end empty ## BQN Pl ← {(𝕩≠1)/"s"} {𝕨∾(@+10)∾𝕩}´{(•Fmt 𝕨)∾" "∾𝕩}´¨∾{ ⟨ ⟨𝕩,"bottle"∾(Pl 𝕩)∾" of beer on the wall"⟩ ⟨𝕩,"bottle"∾(Pl 𝕩)∾" of beer"⟩ ⟨"Take one down, pass it around"⟩ ⟨𝕩-1,"bottle"∾(Pl 𝕩-1)∾" of beer on the wall"∾@+10⟩ ⟩ }¨⌽1+↕99  •Fmt is used to convert numbers to strings. Pl tells whether the number is singular or plural. Then, the two folds join all the individual lines together. ## C Translation of: C++ ### The simple solution /* * 99 Bottles, C, KISS (i.e. keep it simple and straightforward) version */ #include <stdio.h> int main(void) { int n; for( n = 99; n > 2; n-- ) printf( "%d bottles of beer on the wall, %d bottles of beer.\n" "Take one down and pass it around, %d bottles of beer on the wall.\n\n", n, n, n - 1); printf( "2 bottles of beer on the wall, 2 bottles of beer.\n" "Take one down and pass it around, 1 bottle of beer on the wall.\n\n" "1 bottle of beer on the wall, 1 bottle of beer.\n" "Take one down and pass it around, no more bottles of beer on the wall.\n\n" "No more bottles of beer on the wall, no more bottles of beer.\n" "Go to the store and buy some more, 99 bottles of beer on the wall.\n"); return 0; }  ### A recursive solution #include <stdio.h> int main(int argc, char *argv[]) { if(argc == 99) return 99; if(argv[0] != NULL){ argv[0] = NULL; argc = 0; } argc = main(argc + 1, argv); printf("%d bottle%c of beer on the wall\n", argc, argc == 1?'\0': 's'); printf("%d bottle%c of beer\n", argc, argc == 1?'\0': 's'); printf("Take one down, pass it around\n"); printf("%d bottle%c of beer on the wall\n\n", argc - 1, (argc - 1) == 1?'\0': 's'); return argc - 1; }  ### Code golf #include <stdio.h> main(){_=100;while(--_)printf("%i bottle%s of beer in the wall,\n%i bottle%" "s of beer.\nTake one down, pass it round,\n%s%s\n\n",_,_-1?"s":"",_,_-1?"s" :"",_-1?(char[]){(_-1)/10?(_-1)/10+48:(_-1)%10+48,(_-1)/10?(_-1)%10+48:2+30, (_-1)/10?32:0,0}:"",_-1?"bottles of beer in the wall":"No more beers");}  ### A preprocessor solution Of course, with the template metaprogramming solution, the program has still do the conversion of numbers to strings at runtime, and those function calls also cost unnecessary time. Couldn't we just compose the complete text at compile time, and just output it at run time? Well, with the preprocessor, that's indeed possible: #include <stdlib.h> #include <stdio.h> #define BOTTLE(nstr) nstr " bottles of beer" #define WALL(nstr) BOTTLE(nstr) " on the wall" #define PART1(nstr) WALL(nstr) "\n" BOTTLE(nstr) \ "\nTake one down, pass it around\n" #define PART2(nstr) WALL(nstr) "\n\n" #define MIDDLE(nstr) PART2(nstr) PART1(nstr) #define SONG PART1("100") CD2 PART2("0") #define CD2 CD3("9") CD3("8") CD3("7") CD3("6") CD3("5") \ CD3("4") CD3("3") CD3("2") CD3("1") CD4("") #define CD3(pre) CD4(pre) MIDDLE(pre "0") #define CD4(pre) MIDDLE(pre "9") MIDDLE(pre "8") MIDDLE(pre "7") \ MIDDLE(pre "6") MIDDLE(pre "5") MIDDLE(pre "4") MIDDLE(pre "3") \ MIDDLE(pre "2") MIDDLE(pre "1") int main(void) { (void) printf(SONG); return EXIT_SUCCESS; }  An inspection of the generated executable proves that it indeed contains the complete text of the song in one block. ### The bottled version WYSIWYG (with correct plurals and can buy some more):  int b =99,u =1; #include<stdio.h> char *d[16],y[] = "#:ottle/ of" ":eer_ a_Go<o5" "st>y\x20some6" "_Take8;down4p" "a=1rou7_17 _<" "h;_ m?_nd_ on" "_085wal" "l_ " "b_e _ t_ss it" "_?4bu_ore_9, " "\060.""@, 9$";
# define x  c  ^=
#include <string.h>
#define or(t,z) else\
if(c==t && !(c = 0) &&\
(c =! z)); int p(char *t)
{ char *s = t; int c; for (
d[c = 0] = y; !t && (d[c +1
]= strchr(s = d[c], '_'));*
(d[++c]++) = 0); for(t = s?
s:t;(c= *s++); c && putchar
(c)) { if (!((( x 48)& ~0xf
) && ( x 48)) ) p(d[c]), c=
0 ; or('$', p(b - 99?".\n": "." ) && p(b - 99? t : "")) or ('\x40', c && p( d[!!b-- + 2])) or('/', c && p( b^1? "s": "")) or ('\043', b++ ? p("So6" + --b):!printf("%d" , b ? --b : (b += 99))) or( 'S',!(++u % 3) * 32+ 78) or ('.', puts("."))}return c;} int main() {return p(0);}  ## C# using System; class Program { static void Main(string[] args) { for (int i = 99; i > -1; i--) { if (i == 0) { Console.WriteLine("No more bottles of beer on the wall, no more bottles of beer."); Console.WriteLine("Go to the store and buy some more, 99 bottles of beer on the wall."); break; } if (i == 1) { Console.WriteLine("1 bottle of beer on the wall, 1 bottle of beer."); Console.WriteLine("Take one down and pass it around, no more bottles of beer on the wall."); Console.WriteLine(); } else { Console.WriteLine("{0} bottles of beer on the wall, {0} bottles of beer.", i); Console.WriteLine("Take one down and pass it around, {0} bottles of beer on the wall.", i - 1); Console.WriteLine(); } } } }  ### C#6 Implementation Works with: C# version 6+ using System; class Program { static void Main() { Func<int, bool, string> f = (x, y) =>$"{(x == 0 ? "No more" : x.ToString())} bottle{(x == 1 ? "" : "s")} of beer{(y ? " on the wall" : "")}\r\n";
for (int i = 99; i > 0; i--)
$"Take {(x == 1 ? "it" : "one")} down, pass it around, {(x == 1 ? "no more" : (x - 1).ToString())} bottles of beer on the wall!\n" ).ToList().ForEach(x => Console.WriteLine(x)); } }  ### Flexible Version using System; using System.Globalization; class Program { const string Vessel = "bottle"; const string Beverage = "beer"; const string Location = "on the wall"; private static string DefaultAction(ref int bottles) { bottles--; return "take one down, pass it around,"; } private static string FallbackAction(ref int bottles) { bottles += 99; return "go to the store, buy some more,"; } private static string Act(ref int bottles) { return bottles > 0 ? DefaultAction(ref bottles) : FallbackAction(ref bottles); } static void Main() { Func<int, string> plural = b => b == 1 ? "" : "s"; Func<int, string> describeCount = b => b == 0 ? "no more" : b.ToString(); Func<int, string> describeBottles = b => string.Format("{0} {1}{2} of {3}", describeCount(b), Vessel, plural(b), Beverage); Action<string> write = s => Console.WriteLine(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s)); int bottles = 99; while (true) { write(string.Format("{0} {1}, {0},", describeBottles(bottles), Location)); write(Act(ref bottles)); write(string.Format("{0} {1}.", describeBottles(bottles), Location)); write(string.Empty); } } }  ### Using Formatting Works with: C# version 3+ class songs { static void Main(string[] args) { beer(3); } private static void beer(int bottles) { for (int i = bottles; i > 0; i--) { if (i > 1) { Console.Write("{0}\n{1}\n{2}\n{3}\n\n", i + " bottles of beer on the wall", i + " bottles of beer", "Take one down, pass it around", (i - 1) + " bottles of beer on the wall"); } else Console.Write("{0}\n{1}\n{2}\n{3}\n\n", i + " bottle of beer on the wall", i + " bottle of beer", "Take one down, pass it around", (i - 1) + " bottles of beer on the wall...."); } } }  Output: 3 bottles of beer on the wall 3 bottles of beer Take one down, pass it around 2 bottles of beer on the wall 2 bottles of beer on the wall 2 bottles of beer Take one down, pass it around 1 bottles of beer on the wall 1 bottle of beer on the wall 1 bottle of beer Take one down, pass it around 0 bottles of beer on the wall....  ### Using iterator blocks Works with: C# version 3+ using System; using System.Linq; class Program { static void Main() { BeerBottles().Take(99).ToList().ForEach(Console.WriteLine); } static IEnumerable<String> BeerBottles() { int i = 100; String f = "{0}, {1}. Take one down, pass it around, {2}"; Func<int, bool, String> booze = (c , b) => String.Format("{0} bottle{1} of beer{2}", c>0 ? c.ToString() : "no more", (c==1 ? "" : "s"), b ? " on the wall" : ""); while (--i >= 1) yield return String.Format(f, booze(i, true), booze(i, false), booze(i - 1, true)); } }  ### A Fun One string[] bottles = { "80 Shilling", "Abita Amber", "Adams Broadside Ale", "Altenmünster Premium", "August Schell's SnowStorm", "Bah Humbug! Christmas Ale", "Beck's Oktoberfest", "Belhaven Wee Heavy", "Bison Chocolate Stout", "Blue Star Wheat Beer", "Bridgeport Black Strap Stout", "Brother Thelonius Belgian-Style Abbey Ale", "Capital Blonde Doppelbock", "Carta Blanca", "Celis Raspberry Wheat", "Christian Moerlein Select Lager", "Corona", "Czechvar", "Delirium Tremens", "Diamond Bear Southern Blonde", "Don De Dieu", "Eastside Dark", "Eliot Ness", "Flying Dog K-9 Cruiser Altitude Ale", "Fuller's London Porter", "Gaffel Kölsch", "Golden Horseshoe", "Guinness Pub Draught", "Hacker-Pschorr Weisse", "Hereford & Hops Black Spring Double Stout", "Highland Oatmeal Porter", "Ipswich Ale", "Iron City", "Jack Daniel's Amber Lager", "Jamaica Sunset India Pale Ale", "Killian's Red", "König Ludwig Weiss", "Kronenbourg 1664", "Lagunitas Hairy Eyball Ale", "Left Hand Juju Ginger", "Locktender Lager", "Magic Hat Blind Faith", "Missing Elf Double Bock", "Muskoka Cream Ale ", "New Glarus Cherry Stout", "Nostradamus Bruin", "Old Devil", "Ommegang Three Philosophers", "Paulaner Hefe-Weizen Dunkel", "Perla Chmielowa Pils", "Pete's Wicked Springfest", "Point White Biere", "Prostel Alkoholfrei", "Quilmes", "Rahr's Red", "Rebel Garnet", "Rickard's Red", "Rio Grande Elfego Bock", "Rogue Brutal Bitter", "Roswell Alien Amber Ale", "Russian River Pliny The Elder", "Samuel Adams Blackberry Witbier", "Samuel Smith's Taddy Porter", "Schlafly Pilsner", "Sea Dog Wild Blueberry Wheat Ale", "Sharp's", "Shiner 99", "Sierra Dorada", "Skullsplitter Orkney Ale", "Snake Chaser Irish Style Stout", "St. Arnold Bock", "St. Peter's Cream Stout", "Stag", "Stella Artois", "Stone Russian Imperial Stout", "Sweetwater Happy Ending Imperial Stout", "Taiwan Gold Medal", "Terrapin Big Hoppy Monster", "Thomas Hooker American Pale Ale", "Tie Die Red Ale", "Toohey's Premium", "Tsingtao", "Ugly Pug Black Lager", "Unibroue Qatre-Centieme", "Victoria Bitter", "Voll-Damm Doble Malta", "Wailing Wench Ale", "Warsteiner Dunkel", "Wellhead Crude Oil Stout", "Weyerbacher Blithering Idiot Barley-Wine Style Ale", "Wild Boar Amber", "Würzburger Oktoberfest", "Xingu Black Beer", "Yanjing", "Younger's Tartan Special", "Yuengling Black & Tan", "Zagorka Special", "Zig Zag River Lager", "Zywiec" }; int bottlesLeft = 99; const int FIRST_LINE_SINGULAR = 98; const int FINAL_LINE_SINGULAR = 97; string firstLine = ""; string finalLine = ""; for (int i = 0; i < 99; i++) { firstLine = bottlesLeft.ToString() + " bottle"; if (i != FIRST_LINE_SINGULAR) firstLine += "s"; firstLine += " of beer on the wall, " + bottlesLeft.ToString() + " bottle"; if (i != FIRST_LINE_SINGULAR) firstLine += "s"; firstLine += " of beer"; Console.WriteLine(firstLine); Console.WriteLine("Take the " + bottles[i] + " down, pass it around,"); bottlesLeft--; finalLine = bottlesLeft.ToString() + " bottle"; if (i != FINAL_LINE_SINGULAR) finalLine += "s"; finalLine += " of beer on the wall!"; Console.WriteLine(finalLine); Console.WriteLine(); Console.ReadLine(); }  ### Using recursion public static void BottlesSong(int numberOfBottles) { if (numberOfBottles > 0) { Console.WriteLine("{0} bottles of beer on the wall", numberOfBottles); Console.WriteLine("{0} bottles of beer ", numberOfBottles); Console.WriteLine("Take one down, pass it around"); Console.WriteLine("{0} bottles of beer ", numberOfBottles - 1); Console.WriteLine(); BottlesSong(--numberOfBottles); } }  ### Using a While Loop static void Main(string[] args) { int numBottles = 99; while (numBottles > 0) { if (numBottles > 1) { WriteLine("{0} bottles of beer on the wall, {0} bottles of beer.", numBottles); numBottles -= 1; WriteLine("Take one down, pass it around, {0} bottles of beer on the wall.\n", numBottles); } else { WriteLine("{0} bottle of beer on the wall, {0} bottle of beer.", numBottles); numBottles -= 1; WriteLine("Take one down, pass it around, no more bottles of beer on the wall.\n"); } } WriteLine("No more bottles of beer on the wall, no more bottles of beer."); WriteLine("Go to the store to buy some more, 99 bottles of beer on the wall..."); }  ## C/vFP16 #pragma SCH_64_16_IFP #import <jobsched.c> __attr(@canschedule) volatile constricts async UVOID <__INVAR const T>base_000000 __PCON( impure VFCTX_t^ ct_base, impure MCHR_t^ sched_arg, __LVAR <const T>XVF_fntype_t^ f, <out VF_QSWitch_t>XVF_fn_t^ switchctx ) __ARGFILL { VF_Xsched_ILock(ct_base,$->sched);

captured __VFObj <>VF_KeDbg^ ki = VF_Xg_KeDbg_Instance();

captured deferred <__VF_T_Auto>__VF_Auto^ vfke = copyof VF_KeDbg_GetRstream<MCHR_t^>(captures ki);

VF_Gsched_SOBFree(sched_arg);
VF_Gsched_Alloc_U16(65535);
VF_Msched_MChr_lim(1496);
VF_Osched_Begin();
VF_Fsched_Add2(%beer_000099);

VF_Xsched_IUnlock(ct_base, $->sched);$switchctx(IMPURE_CTX, %beer_000099(%vfke));
}

__attr(@eUsesIo)
impure constricts UVOID synchronized beer_000099(
impure __noinline <MCHR_t^>RIGHTSTREAM_t^ outrs
) __NFILL {
pure UVOID^ uvid = __attr(@purify) $UVOID.; while ( 99 > ((volatile NUM_t)^(NUM_t^)(uvid))++ ) { VF_STM_Out_NUM((NUM_t^)uvid); VF_STM_Out_x(__Dynamic C"bottles on the wall.\nPut one down, pass it around\n"); } return$__;
}


## C++

### The simple solution

Works with: g++ version 4.8.1
#include <iostream>
using std::cout;

int main()
{
for(int bottles(99); bottles > 0; bottles -= 1){
cout << bottles << " bottles of beer on the wall\n"
<< bottles << " bottles of beer\n"
<< "Take one down, pass it around\n"
<< bottles - 1 << " bottles of beer on the wall\n\n";
}
}


### A template metaprogramming solution

Of course, the output of the program always looks the same. One may therefore question why the program has to do all that tedious subtracting during runtime. Couldn't the compiler just generate the code to output the text, with ready-calculated constants? Indeed, it can, and the technique is called template metaprogramming. The following short code gives the text without containing a single variable, let alone a loop:

#include <iostream>

template<int max, int min> struct bottle_countdown
{
static const int middle = (min + max)/2;
static void print()
{
bottle_countdown<max, middle+1>::print();
bottle_countdown<middle, min>::print();
}
};

template<int value> struct bottle_countdown<value, value>
{
static void print()
{
std::cout << value << " bottles of beer on the wall\n"
<< value << " bottles of beer\n"
<< "Take one down, pass it around\n"
<< value-1 << " bottles of beer\n\n";
}
};

int main()
{
bottle_countdown<100, 1>::print();
return 0;
}


### A function template solution

Function templates are a different approach to template metaprogramming:

#include <iostream>

template<unsigned int N> void bottles(){
std::cout << N << " bottles of beer on the wall\n"
<< N << " bottles of beer\n"
<< "Take one down, pass it around\n"
<< N - 1 << " bottles of beer on the wall\n\n";
bottles<N-1>();
}

template<> void bottles<0>(){
std::cout<<"No more bottles of beer on the wall\n"
"No more bottles of beer\n"
"Go to the store and buy some more\n"
"99 bottles of beer on the wall...\n\n";
}

int main(){
bottles<99>();
}


### A Recursive solution

#include <iostream>
using namespace std;
void rec(int bottles)
{
if ( bottles!=0)
{
cout << bottles << " bottles of beer on the wall" << endl;
cout << bottles << " bottles of beer" << endl;
cout << "Take one down, pass it around" << endl;
cout << --bottles << " bottles of beer on the wall\n" << endl;
rec(bottles);
}
}

int main()
{
rec(99);
system("pause");
return 0;
}


### A preprocessor solution

Of course, with the template metaprogramming solution, the program has still do the conversion of numbers to strings at runtime, and those function calls also cost unnecessary time. Couldn't we just compose the complete text at compile time, and just output it at run time? Well, with the preprocessor, that's indeed possible:

#include <iostream>
#include <ostream>

#define BOTTLE(nstr) nstr " bottles of beer"

#define WALL(nstr) BOTTLE(nstr) " on the wall"

#define PART1(nstr) WALL(nstr) "\n" BOTTLE(nstr) \
"\nTake one down, pass it around\n"

#define PART2(nstr) WALL(nstr) "\n\n"

#define MIDDLE(nstr) PART2(nstr) PART1(nstr)

#define SONG PART1("100") CD2 PART2("0")

#define CD2 CD3("9") CD3("8") CD3("7") CD3("6") CD3("5") \
CD3("4") CD3("3") CD3("2") CD3("1") CD4("")

#define CD3(pre) CD4(pre) MIDDLE(pre "0")

#define CD4(pre) MIDDLE(pre "9") MIDDLE(pre "8") MIDDLE(pre "7") \
MIDDLE(pre "6") MIDDLE(pre "5") MIDDLE(pre "4") MIDDLE(pre "3") \
MIDDLE(pre "2") MIDDLE(pre "1")

int main()
{
std::cout << SONG;
return 0;
}


### Bottled Version

                          //>,_
//Beer Song>,_
#include <iostream>
using namespace std;
int main(){ for( int
b=-1; b<99;  cout <<
'\n') for ( int w=0;
w<3; cout << ".\n"){
if (w==2) cout << ((
b--) ?"Take one dow"
"n and pass it arou"
"nd":"Go to the sto"
"re and buy some mo"
"re"); if (b<0) b=99
; do{ if (w) cout <<
", "; if (b) cout <<
b;  else  cout << (
(w) ? 'n' : 'N') <<
"o more"; cout <<
" bottle" ;  if
(b!=1) cout <<
's' ; cout <<
" of beer";
if (w!=1)
cout  <<
" on th"
"e wall"
;} while
(!w++);}
return
0
;
}
//
// by barrym 2011-05-01
// no bottles were harmed in the
// making of this program!!!


## Ceylon

shared void ninetyNineBottles() {

String bottles(Integer count) =>
"count == 0 then "No" else count
bottlecount == 1 then "" else "s"".normalized;

for(i in 99..1) {
print("bottles(i) of beer on the wall
bottles(i) of beer!
Take one down, pass it around
bottles(i - 1) of beer on the wall!\n");
}
}


## Chapel

copied from http://99-bottles-of-beer.net/language-chapel-1215.html, with minor modifications for chapel 1.7

Works with: Chapel version 1.7.0
/***********************************************************************
* Chapel implementation of "99 bottles of beer"
*
* by Brad Chamberlain and Steve Deitz
* 07/13/2006 in Knoxville airport while waiting for flight home from
*            HPLS workshop
* compiles and runs with chpl compiler version 1.7.0
* for more information, contact: chapel_info@cray.com
*
*
* Notes:
* o as in all good parallel computations, boundary conditions
*   constitute the vast bulk of complexity in this code (invite Brad to
*   tell you about his zany boundary condition simplification scheme)
* o uses type inference for variables, arguments
* o relies on integer->string coercions
* o uses named argument passing (for documentation purposes only)
***********************************************************************/

// allow executable command-line specification of number of bottles
// (e.g., ./a.out -snumBottles=999999)
config const numBottles = 99;
const numVerses = numBottles+1;

// a domain to describe the space of lyrics
var LyricsSpace: domain(1) = {1..numVerses};

// array of lyrics
var Lyrics: [LyricsSpace] string;

// parallel computation of lyrics array
[verse in LyricsSpace] Lyrics(verse) = computeLyric(verse);

// as in any good parallel language, I/O to stdout is serialized.
// (Note that I/O to a file could be parallelized using a parallel
// prefix computation on the verse strings' lengths with file seeking)
writeln(Lyrics);

// HELPER FUNCTIONS:

proc computeLyric(verseNum) {
var bottleNum = numBottles - (verseNum - 1);
var nextBottle = (bottleNum + numVerses - 1)%numVerses;
return "\n" // disguise space used to separate elements in array I/O
+ describeBottles(bottleNum, startOfVerse=true) + " on the wall, "
+ describeBottles(bottleNum) + ".\n"
+ computeAction(bottleNum)
+ describeBottles(nextBottle) + " on the wall.\n";
}

proc describeBottles(bottleNum, startOfVerse:bool = false) {
// NOTE: bool should not be necessary here (^^^^); working around bug
var bottleDescription = if (bottleNum) then bottleNum:string
else (if startOfVerse then "N"
else "n")
+ "o more";
return bottleDescription
+ " bottle" + (if (bottleNum == 1) then "" else "s")
+ " of beer";
}

proc computeAction(bottleNum) {
return if (bottleNum == 0) then "Go to the store and buy some more, "
else "Take one down and pass it around, ";
}


## Cind

execute() {

// this class provides synchronization
// to get unique number of the bottle

class monitor giver {
int number = 100;
.get() { return --number; }
}
var g = new giver();

// start 99 concurrently worked threads
// each thread gets own number of the bottle and prints out his own verse
// (notice that the output lines from the threads will be mixed together)

{#[99]
int nr = g.get(); // get own number
host.println(nr," bottles of beer on the wall, "+nr+" bottles of beer");
host.print("Take one down, pass it around,");
if (nr > 1) {
host.println((nr-1)," bottles of beer on the wall.");
}
else {
host.println("no more bottles of beer on the wall.");
}
}
host.println("No more bottles of beer on the wall, no more bottles of beer.");
host.println("Go to the store and buy some more, 99 bottles of beer on the wall.");
return 0;
}

## Clay

/* A few options here: I could give n type Int; or specify that n is of any
numeric type; but here I just let it go -- that way it'll work with anything
that compares with 1 and that printTo knows how to convert to a string. And
all checked at compile time, remember. */
getRound(n) {
var s      = String();
var bottle = if (n == 1) " bottle " else " bottles ";

printTo(s,
n, bottle, "of beer on the wall\n",
n, bottle, "of beer\n",
"take one down, pass it around\n",
n, bottle, "of beer on the wall!\n");

return s;
}

main() {
println(join("\n", mapped(getRound, reversed(range(100)))));
}


## Clio

fn bottle n:
n -> if = 0: 'no more bottles'
elif = 1:    n + ' bottle'
else:    n + ' bottles'

[99:0] -> * (@eager) fn i:
i -> bottle -> print (transform i: sentence-case) 'of beer on the wall,' @ 'of beer.'
if i = 0:
'Go to the store, buy some more, 99 bottles of beer on the wall.' -> print
else:
i - 1 -> bottle -> print 'Take one down and pass it around,' @ 'of beer on the wall.\n'

## CLIPS

(deffacts beer-bottles
(bottles 99))

(deffunction bottle-count
(?count)
(switch ?count
(case 0 then "No more bottles of beer")
(case 1 then "1 more bottle of beer")
(default (str-cat ?count " bottles of beer"))))

(defrule stanza
?bottles <- (bottles ?count)
=>
(retract ?bottles)
(printout t (bottle-count ?count) " on the wall," crlf)
(printout t (bottle-count ?count) "." crlf)
(printout t "Take one down, pass it around," crlf)
(printout t (bottle-count (- ?count 1)) " on the wall." crlf crlf)
(if (> ?count 1) then (assert (bottles (- ?count 1)))))

## Clojure

(defn paragraph [num]
(str num " bottles of beer on the wall\n"
num " bottles of beer\n"
"Take one down, pass it around\n"
(dec num) " bottles of beer on the wall.\n"))

(defn lyrics []
(let [numbers (range 99 0 -1)
paragraphs (map paragraph numbers)]
(clojure.string/join "\n" paragraphs)))

(print (lyrics))


Or, using cl-format:

Translation of: Common Lisp
(clojure.pprint/cl-format
true
"~{~[~^~]~:*~D bottle~:P of beer on the wall~%~:*~D bottle~:P of beer
Take one down, pass it around,~%~D bottle~:P~:* of beer on the wall.~2%~}"
(range 99 0 -1))


## CLU

bottles = proc (n: int) returns (string)
if n<0 then return("99 bottles")
elseif n=0 then return("No more bottles")
elseif n=1 then return("1 bottle")
else return(int$unparse(n) || " bottles") end end bottles thirdline = proc (n: int) returns (string) if n=0 then return("Go to the store and buy some more,\n") else s: string if n=1 then s := "it" else s := "one" end return("Take " || s || " down and pass it around,\n"); end end thirdline verse = proc (n: int) returns (string) v: string := bottles(n) || " bottles of beer on the wall,\n" v := v || bottles(n) || " bottles of beer,\n" v := v || thirdline(n) v := v || bottles(n-1) || " bottles of beer on the wall.\n\n" return(v) end verse start_up = proc () po: stream := stream$primary_output()

for n: int in int$from_to_by(99, 0, -1) do stream$puts(po, verse(n))
end
end start_up

## COBOL

Works with: OpenCOBOL version 1.1

Free form version.

identification division.
program-id. ninety-nine.
environment division.
data division.
working-storage section.
01	counter	pic 99.
88 no-bottles-left value 0.
88 one-bottle-left value 1.

01	parts-of-counter redefines counter.
05	tens		pic 9.
05	digits		pic 9.

01	after-ten-words.
05	filler	pic x(7) value spaces.
05	filler	pic x(7) value "Twenty".
05	filler	pic x(7) value "Thirty".
05	filler	pic x(7) value "Forty".
05	filler	pic x(7) value "Fifty".
05	filler	pic x(7) value "Sixty".
05	filler	pic x(7) value "Seventy".
05	filler	pic x(7) value "Eighty".
05	filler	pic x(7) value "Ninety".
05	filler	pic x(7) value spaces.

01	after-ten-array redefines after-ten-words.
05	atens occurs 10 times pic x(7).

01	digit-words.
05	filler	pic x(9) value "One".
05	filler	pic x(9) value "Two".
05	filler	pic x(9) value "Three".
05	filler	pic x(9) value "Four".
05	filler	pic x(9) value "Five".
05	filler	pic x(9) value "Six".
05	filler	pic x(9) value "Seven".
05	filler	pic x(9) value "Eight".
05	filler	pic x(9) value "Nine".
05	filler	pic x(9) value "Ten".
05	filler	pic x(9) value "Eleven".
05	filler	pic x(9) value "Twelve".
05	filler	pic x(9) value "Thirteen".
05	filler	pic x(9) value "Fourteen".
05	filler	pic x(9) value "Fifteen".
05	filler	pic x(9) value "Sixteen".
05	filler	pic x(9) value "Seventeen".
05	filler	pic x(9) value "Eighteen".
05	filler	pic x(9) value "Nineteen".
05	filler	pic x(9) value spaces.

01	digit-array redefines digit-words.
05	adigits occurs 20 times 	pic x(9).

01	number-name pic x(15).

procedure division.
100-main section.
100-setup.
perform varying counter from 99 by -1 until no-bottles-left
perform 100-show-number
display " of beer on the wall"
perform 100-show-number
display " of beer"
display "Take " with no advancing
if one-bottle-left
display "it " with no advancing
else
display "one " with no advancing
end-if
display "down and pass it round"
subtract 1 from counter giving counter
perform 100-show-number
display " of beer on the wall"
add 1 to counter giving counter
display space
end-perform.
display "No more bottles of beer on the wall"
display "No more bottles of beer"
display "Go to the store and buy some more"
display "Ninety Nine bottles of beer on the wall"
stop run.

100-show-number.
if no-bottles-left
display "No more" with no advancing
else
if counter < 20
display function trim( adigits( counter ) ) with no advancing
else
if counter < 100
move spaces to number-name
string atens( tens ) delimited by space, space delimited by size, adigits( digits ) delimited by space into number-name
display function trim( number-name) with no advancing
end-if
end-if
end-if.
if one-bottle-left
display " bottle" with no advancing
else
display " bottles" with no advancing
end-if.

100-end.
end-program.


Another free-form version, without using DISPLAY NO ADVANCING.

identification division.
program-id. ninety-nine.
environment division.
data division.
working-storage section.
01	counter	pic 99.
88 no-bottles-left value 0.
88 one-bottle-left value 1.

01	parts-of-counter redefines counter.
05	tens		pic 9.
05	digits		pic 9.

01	after-ten-words.
05	filler	pic x(7) value spaces.
05	filler	pic x(7) value "Twenty".
05	filler	pic x(7) value "Thirty".
05	filler	pic x(7) value "Forty".
05	filler	pic x(7) value "Fifty".
05	filler	pic x(7) value "Sixty".
05	filler	pic x(7) value "Seventy".
05	filler	pic x(7) value "Eighty".
05	filler	pic x(7) value "Ninety".
05	filler	pic x(7) value spaces.

01	after-ten-array redefines after-ten-words.
05	atens occurs 10 times pic x(7).

01	digit-words.
05	filler	pic x(9) value "One".
05	filler	pic x(9) value "Two".
05	filler	pic x(9) value "Three".
05	filler	pic x(9) value "Four".
05	filler	pic x(9) value "Five".
05	filler	pic x(9) value "Six".
05	filler	pic x(9) value "Seven".
05	filler	pic x(9) value "Eight".
05	filler	pic x(9) value "Nine".
05	filler	pic x(9) value "Ten".
05	filler	pic x(9) value "Eleven".
05	filler	pic x(9) value "Twelve".
05	filler	pic x(9) value "Thirteen".
05	filler	pic x(9) value "Fourteen".
05	filler	pic x(9) value "Fifteen".
05	filler	pic x(9) value "Sixteen".
05	filler	pic x(9) value "Seventeen".
05	filler	pic x(9) value "Eighteen".
05	filler	pic x(9) value "Nineteen".
05	filler	pic x(9) value spaces.

01	digit-array redefines digit-words.
05	adigits occurs 20 times 	pic x(9).

01	number-name pic x(15).

01	stringified pic x(30).
01	outline		pic x(50).
01  other-numbers.
03	n	pic 999.
03	r	pic 999.

procedure division.
100-main section.
100-setup.
perform varying counter from 99 by -1 until no-bottles-left
move spaces to outline
perform 100-show-number
string stringified delimited by "|", space, "of beer on the wall" into outline end-string
display outline end-display
move spaces to outline
string stringified delimited by "|", space, "of beer" into outline end-string
display outline end-display
move spaces to outline
move "Take" to outline
if one-bottle-left
string outline delimited by space, space, "it" delimited by size, space, "|" into outline end-string
else
string outline delimited by space, space, "one" delimited by size, space, "|" into outline end-string
end-if
string outline delimited by "|", "down and pass it round" delimited by size into outline end-string
display outline end-display
move spaces to outline
subtract 1 from counter giving counter end-subtract
perform 100-show-number
string stringified delimited by "|", space, "of beer on the wall" into outline end-string
display outline end-display
add 1 to counter giving counter end-add
display space end-display
end-perform.
display "No more bottles of beer on the wall"
display "No more bottles of beer"
display "Go to the store and buy some more"
display "Ninety-Nine bottles of beer on the wall"
stop run.

100-show-number.
if no-bottles-left
move "No more|" to stringified
else
if counter < 20
string function trim( adigits( counter ) ), "|" into stringified
else
if counter < 100
move spaces to number-name
string atens( tens ) delimited by space, space delimited by size, adigits( digits ) delimited by space into number-name end-string
move function trim( number-name) to stringified
divide counter by 10 giving n remainder r end-divide
if r not = zero
inspect stringified replacing first space by "-"
end-if
inspect stringified replacing first space by "|"
end-if
end-if
end-if.
if one-bottle-left
string stringified delimited by "|", space, "bottle|" delimited by size into stringified end-string
else
string stringified delimited by "|", space, "bottles|" delimited by size into stringified end-string
end-if.

100-end.
end-program.


A more concise version that adheres to the minimum guidelines. Leading zeros are not suppressed. (OpenCOBOL - 1.1.0)

program-id. ninety-nine.
data division.
working-storage section.
01  cnt       pic 99.

procedure division.

perform varying cnt from 99 by -1 until cnt < 1
display cnt " bottles of beer on the wall"
display cnt " bottles of beer"
display "Take one down, pass it around"
subtract 1 from cnt
display cnt " bottles of beer on the wall"
add 1 to cnt
display space
end-perform.


## CoffeeScript

bottlesOfBeer = (n) ->
"#{n} bottle#{if n is 1 then '' else 's'} of beer"

console.log """
#{bottlesOfBeer n} on the wall
#{bottlesOfBeer n}
Take one down, pass it around
#{bottlesOfBeer n - 1} on the wall
\n""" for n in [99..1]


With completely different approach...

for j in [99..1]
x=''
x += [j,j-1,'\nTake one down, pass it around\n'," bottles of beer",' on the wall\n'][i] for i in [0,3,4,0,3,2,1,3,4]
console.log x.replace /(1.+)s/g, '$1'  or as a one liner... console.log( if (j+2)%4 then (x=Math.round j/4)+" bottle#{if x-1 then 's' else ''} of beer#{if (j+1)%4 then ' on the wall' else ''}" else "Take one down, pass it around" ) for j in [396..1]  or another completely different one liner ((console.log if i is 2 then "Take one down, pass it around" else "#{b-!(i-1%4)} bottle#{if 4*b+i<10 and b-i then '' else 's'} of beer#{if i%3 then ' on the wall' else ''}") for i in [4..1]) for b in [99..1]  ## ColdFusion ### Classic tag based CFML <cfoutput> <cfloop index="x" from="99" to="0" step="-1"> <cfset plur = iif(x is 1,"",DE("s"))> #x# bottle#plur# of beer on the wall<br> #x# bottle#plur# of beer<br> Take one down, pass it around<br> #iif(x is 1,DE("No more"),"x-1")# bottle#iif(x is 2,"",DE("s"))# of beer on the wall<br><br> </cfloop> </cfoutput>  or if you prefer: (identical output, grammatically correct to the last stanza) ### CFScript <cfscript> for (x=99; x gte 1; x--) { plur = iif(x==1,'',DE('s')); WriteOutput("#x# bottle#plur# of beer on the wall<br>#x# bottle#plur# of beer<br>Take one down, pass it around<br>#iif(x is 1,DE('No more'),'x-1')# bottle#iif(x is 2,'',DE('s'))# of beer on the wall<br><br>"); } </cfscript>  ## Comal 0010 DIM itone$(0:1)
0020 itone$(0):="one";itone$(1):="it"
0030 FOR b#:=99 TO 1 STEP -1 DO
0040   bottles(b#)
0050   PRINT "of beer on the wall,"
0060   bottles(b#)
0070   PRINT "of beer,"
0080   PRINT "Take ",itone$(b#=1)," down and pass it around," 0090 bottles(b#-1) 0100 PRINT "of beer on the wall!" 0110 PRINT 0120 ENDFOR b# 0130 PROC bottles(b#) CLOSED 0140 CASE b# OF 0150 WHEN 0 0160 PRINT "No more bottles ", 0170 WHEN 1 0180 PRINT "1 bottle ", 0190 OTHERWISE 0200 PRINT b#," bottles ", 0210 ENDCASE 0220 ENDPROC bottles 0230 END  ## Comefrom0x10 bottles = ' bottles ' remaining = 99 one_less_bottle = remaining depluralize comefrom drinking if one_less_bottle is 1 bottles = ' bottle ' drinking comefrom if remaining is one_less_bottle remaining bottles 'of beer on the wall' remaining bottles 'of beer' 'Take one down, pass it around' one_less_bottle = remaining - 1 one_less_bottle bottles 'of beer on the walln' remaining = remaining - 1 comefrom if one_less_bottle is 0 'No more bottles of beer on the wall' Output: 2 bottles of beer on the wall 2 bottles of beer Take one down, pass it around 1 bottle of beer on the wall 1 bottle of beer on the wall 1 bottle of beer Take one down, pass it around No more bottles of beer on the wall  ## Common Lisp ## Component Pascal ## Cowgol include "cowgol.coh"; sub Bottles(n: uint8) is if n == 0 then print("No more"); else print_i8(n); end if; print(" bottle"); if n != 1 then print("s"); end if; end sub; sub Verse(n: uint8) is Bottles(n); print(" of beer on the wall,\n"); Bottles(n); print(" of beer,\n"); print("Take "); if n == 1 then print("it"); else print("one"); end if; print(" down and pass it around,\n"); Bottles(n-1); print(" of beer on the wall.\n\n"); end sub; var verse: uint8 := 99; while verse > 0 loop Verse(verse); verse := verse - 1; end loop; Output: 99 bottles of beer on the wall, 99 bottles of beer, Take one down and pass it around, 98 bottles of beer on the wall. 98 bottles of beer on the wall, 98 bottles of beer, Take one down and pass it around, 97 bottles of beer on the wall. 97 bottles of beer on the wall, 97 bottles of beer, Take one down and pass it around, 96 bottles of beer on the wall. 96 bottles of beer on the wall, 96 bottles of beer, Take one down and pass it around, 95 bottles of beer on the wall. 95 bottles of beer on the wall, 95 bottles of beer, Take one down and pass it around, 94 bottles of beer on the wall. 94 bottles of beer on the wall, 94 bottles of beer, Take one down and pass it around, 93 bottles of beer on the wall. 93 bottles of beer on the wall, 93 bottles of beer, Take one down and pass it around, 92 bottles of beer on the wall. 92 bottles of beer on the wall, 92 bottles of beer, Take one down and pass it around, 91 bottles of beer on the wall. 91 bottles of beer on the wall, 91 bottles of beer, Take one down and pass it around, 90 bottles of beer on the wall. 90 bottles of beer on the wall, 90 bottles of beer, Take one down and pass it around, 89 bottles of beer on the wall. 89 bottles of beer on the wall, 89 bottles of beer, Take one down and pass it around, 88 bottles of beer on the wall. 88 bottles of beer on the wall, 88 bottles of beer, Take one down and pass it around, 87 bottles of beer on the wall. 87 bottles of beer on the wall, 87 bottles of beer, Take one down and pass it around, 86 bottles of beer on the wall. 86 bottles of beer on the wall, 86 bottles of beer, Take one down and pass it around, 85 bottles of beer on the wall. 85 bottles of beer on the wall, 85 bottles of beer, Take one down and pass it around, 84 bottles of beer on the wall. 84 bottles of beer on the wall, 84 bottles of beer, Take one down and pass it around, 83 bottles of beer on the wall. 83 bottles of beer on the wall, 83 bottles of beer, Take one down and pass it around, 82 bottles of beer on the wall. 82 bottles of beer on the wall, 82 bottles of beer, Take one down and pass it around, 81 bottles of beer on the wall. 81 bottles of beer on the wall, 81 bottles of beer, Take one down and pass it around, 80 bottles of beer on the wall. 80 bottles of beer on the wall, 80 bottles of beer, Take one down and pass it around, 79 bottles of beer on the wall. 79 bottles of beer on the wall, 79 bottles of beer, Take one down and pass it around, 78 bottles of beer on the wall. 78 bottles of beer on the wall, 78 bottles of beer, Take one down and pass it around, 77 bottles of beer on the wall. 77 bottles of beer on the wall, 77 bottles of beer, Take one down and pass it around, 76 bottles of beer on the wall. 76 bottles of beer on the wall, 76 bottles of beer, Take one down and pass it around, 75 bottles of beer on the wall. 75 bottles of beer on the wall, 75 bottles of beer, Take one down and pass it around, 74 bottles of beer on the wall. 74 bottles of beer on the wall, 74 bottles of beer, Take one down and pass it around, 73 bottles of beer on the wall. 73 bottles of beer on the wall, 73 bottles of beer, Take one down and pass it around, 72 bottles of beer on the wall. 72 bottles of beer on the wall, 72 bottles of beer, Take one down and pass it around, 71 bottles of beer on the wall. 71 bottles of beer on the wall, 71 bottles of beer, Take one down and pass it around, 70 bottles of beer on the wall. 70 bottles of beer on the wall, 70 bottles of beer, Take one down and pass it around, 69 bottles of beer on the wall. 69 bottles of beer on the wall, 69 bottles of beer, Take one down and pass it around, 68 bottles of beer on the wall. 68 bottles of beer on the wall, 68 bottles of beer, Take one down and pass it around, 67 bottles of beer on the wall. 67 bottles of beer on the wall, 67 bottles of beer, Take one down and pass it around, 66 bottles of beer on the wall. 66 bottles of beer on the wall, 66 bottles of beer, Take one down and pass it around, 65 bottles of beer on the wall. 65 bottles of beer on the wall, 65 bottles of beer, Take one down and pass it around, 64 bottles of beer on the wall. 64 bottles of beer on the wall, 64 bottles of beer, Take one down and pass it around, 63 bottles of beer on the wall. 63 bottles of beer on the wall, 63 bottles of beer, Take one down and pass it around, 62 bottles of beer on the wall. 62 bottles of beer on the wall, 62 bottles of beer, Take one down and pass it around, 61 bottles of beer on the wall. 61 bottles of beer on the wall, 61 bottles of beer, Take one down and pass it around, 60 bottles of beer on the wall. 60 bottles of beer on the wall, 60 bottles of beer, Take one down and pass it around, 59 bottles of beer on the wall. 59 bottles of beer on the wall, 59 bottles of beer, Take one down and pass it around, 58 bottles of beer on the wall. 58 bottles of beer on the wall, 58 bottles of beer, Take one down and pass it around, 57 bottles of beer on the wall. 57 bottles of beer on the wall, 57 bottles of beer, Take one down and pass it around, 56 bottles of beer on the wall. 56 bottles of beer on the wall, 56 bottles of beer, Take one down and pass it around, 55 bottles of beer on the wall. 55 bottles of beer on the wall, 55 bottles of beer, Take one down and pass it around, 54 bottles of beer on the wall. 54 bottles of beer on the wall, 54 bottles of beer, Take one down and pass it around, 53 bottles of beer on the wall. 53 bottles of beer on the wall, 53 bottles of beer, Take one down and pass it around, 52 bottles of beer on the wall. 52 bottles of beer on the wall, 52 bottles of beer, Take one down and pass it around, 51 bottles of beer on the wall. 51 bottles of beer on the wall, 51 bottles of beer, Take one down and pass it around, 50 bottles of beer on the wall. 50 bottles of beer on the wall, 50 bottles of beer, Take one down and pass it around, 49 bottles of beer on the wall. 49 bottles of beer on the wall, 49 bottles of beer, Take one down and pass it around, 48 bottles of beer on the wall. 48 bottles of beer on the wall, 48 bottles of beer, Take one down and pass it around, 47 bottles of beer on the wall. 47 bottles of beer on the wall, 47 bottles of beer, Take one down and pass it around, 46 bottles of beer on the wall. 46 bottles of beer on the wall, 46 bottles of beer, Take one down and pass it around, 45 bottles of beer on the wall. 45 bottles of beer on the wall, 45 bottles of beer, Take one down and pass it around, 44 bottles of beer on the wall. 44 bottles of beer on the wall, 44 bottles of beer, Take one down and pass it around, 43 bottles of beer on the wall. 43 bottles of beer on the wall, 43 bottles of beer, Take one down and pass it around, 42 bottles of beer on the wall. 42 bottles of beer on the wall, 42 bottles of beer, Take one down and pass it around, 41 bottles of beer on the wall. 41 bottles of beer on the wall, 41 bottles of beer, Take one down and pass it around, 40 bottles of beer on the wall. 40 bottles of beer on the wall, 40 bottles of beer, Take one down and pass it around, 39 bottles of beer on the wall. 39 bottles of beer on the wall, 39 bottles of beer, Take one down and pass it around, 38 bottles of beer on the wall. 38 bottles of beer on the wall, 38 bottles of beer, Take one down and pass it around, 37 bottles of beer on the wall. 37 bottles of beer on the wall, 37 bottles of beer, Take one down and pass it around, 36 bottles of beer on the wall. 36 bottles of beer on the wall, 36 bottles of beer, Take one down and pass it around, 35 bottles of beer on the wall. 35 bottles of beer on the wall, 35 bottles of beer, Take one down and pass it around, 34 bottles of beer on the wall. 34 bottles of beer on the wall, 34 bottles of beer, Take one down and pass it around, 33 bottles of beer on the wall. 33 bottles of beer on the wall, 33 bottles of beer, Take one down and pass it around, 32 bottles of beer on the wall. 32 bottles of beer on the wall, 32 bottles of beer, Take one down and pass it around, 31 bottles of beer on the wall. 31 bottles of beer on the wall, 31 bottles of beer, Take one down and pass it around, 30 bottles of beer on the wall. 30 bottles of beer on the wall, 30 bottles of beer, Take one down and pass it around, 29 bottles of beer on the wall. 29 bottles of beer on the wall, 29 bottles of beer, Take one down and pass it around, 28 bottles of beer on the wall. 28 bottles of beer on the wall, 28 bottles of beer, Take one down and pass it around, 27 bottles of beer on the wall. 27 bottles of beer on the wall, 27 bottles of beer, Take one down and pass it around, 26 bottles of beer on the wall. 26 bottles of beer on the wall, 26 bottles of beer, Take one down and pass it around, 25 bottles of beer on the wall. 25 bottles of beer on the wall, 25 bottles of beer, Take one down and pass it around, 24 bottles of beer on the wall. 24 bottles of beer on the wall, 24 bottles of beer, Take one down and pass it around, 23 bottles of beer on the wall. 23 bottles of beer on the wall, 23 bottles of beer, Take one down and pass it around, 22 bottles of beer on the wall. 22 bottles of beer on the wall, 22 bottles of beer, Take one down and pass it around, 21 bottles of beer on the wall. 21 bottles of beer on the wall, 21 bottles of beer, Take one down and pass it around, 20 bottles of beer on the wall. 20 bottles of beer on the wall, 20 bottles of beer, Take one down and pass it around, 19 bottles of beer on the wall. 19 bottles of beer on the wall, 19 bottles of beer, Take one down and pass it around, 18 bottles of beer on the wall. 18 bottles of beer on the wall, 18 bottles of beer, Take one down and pass it around, 17 bottles of beer on the wall. 17 bottles of beer on the wall, 17 bottles of beer, Take one down and pass it around, 16 bottles of beer on the wall. 16 bottles of beer on the wall, 16 bottles of beer, Take one down and pass it around, 15 bottles of beer on the wall. 15 bottles of beer on the wall, 15 bottles of beer, Take one down and pass it around, 14 bottles of beer on the wall. 14 bottles of beer on the wall, 14 bottles of beer, Take one down and pass it around, 13 bottles of beer on the wall. 13 bottles of beer on the wall, 13 bottles of beer, Take one down and pass it around, 12 bottles of beer on the wall. 12 bottles of beer on the wall, 12 bottles of beer, Take one down and pass it around, 11 bottles of beer on the wall. 11 bottles of beer on the wall, 11 bottles of beer, Take one down and pass it around, 10 bottles of beer on the wall. 10 bottles of beer on the wall, 10 bottles of beer, Take one down and pass it around, 9 bottles of beer on the wall. 9 bottles of beer on the wall, 9 bottles of beer, Take one down and pass it around, 8 bottles of beer on the wall. 8 bottles of beer on the wall, 8 bottles of beer, Take one down and pass it around, 7 bottles of beer on the wall. 7 bottles of beer on the wall, 7 bottles of beer, Take one down and pass it around, 6 bottles of beer on the wall. 6 bottles of beer on the wall, 6 bottles of beer, Take one down and pass it around, 5 bottles of beer on the wall. 5 bottles of beer on the wall, 5 bottles of beer, Take one down and pass it around, 4 bottles of beer on the wall. 4 bottles of beer on the wall, 4 bottles of beer, Take one down and pass it around, 3 bottles of beer on the wall. 3 bottles of beer on the wall, 3 bottles of beer, Take one down and pass it around, 2 bottles of beer on the wall. 2 bottles of beer on the wall, 2 bottles of beer, Take one down and pass it around, 1 bottle of beer on the wall. 1 bottle of beer on the wall, 1 bottle of beer, Take it down and pass it around, No more bottles of beer on the wall. ## Crystal 99.downto(1) do |n| puts "#{n} bottle#{n > 1 ? "s" : ""} of beer on the wall" puts "#{n} bottle#{n > 1 ? "s" : ""} of beer" puts "Take one down, pass it around" puts "#{n-1} bottle#{n > 2 ? "s" : ""} of beer on the wall\n\n" if n > 1 end puts "No more bottles of beer on the wall"  ## D ### Simple Solution Works with: D version 2 Based on Steward Gordon's code at: 99-bottles-of-beer.net. import std.stdio; void main() { int bottles = 99; while (bottles > 1) { writeln(bottles, " bottles of beer on the wall,"); writeln(bottles, " bottles of beer."); writeln("Take one down, pass it around,"); if (--bottles > 1) { writeln(bottles, " bottles of beer on the wall.\n"); } } writeln("1 bottle of beer on the wall.\n"); writeln("No more bottles of beer on the wall,"); writeln("no more bottles of beer."); writeln("Go to the store and buy some more,"); writeln("99 bottles of beer on the wall."); }  ### CTFE Solution CTFE (Compile-Time Function Execution) is a feature of D that allows for pure functions of arbitrary complexity to be completely evaluated at compile time when every parameter is known. Note that this is distinct from the template meta-programming tricks used by some other languages, and this bottles() function could just as easily be executed during run-time. The compiled result of this program simply prints the pre-generated lyrics to the song, using a standard compiler pragma directive. import std.stdio, std.conv; string bottles(in size_t num) pure { static string bottlesRecurse(in size_t num) pure { return num.text ~ " bottles of beer on the wall,\n" ~ num.text ~ " bottles of beer!\n" ~ "Take one down, pass it around,\n" ~ (num - 1).text ~ " bottle" ~ ((num - 1 == 1) ? "" : "s") ~ " of beer on the wall.\n\n" ~ ((num > 2) ? bottlesRecurse(num - 1) : "1 bottle of beer on the wall,\n" ~ "1 bottle of beer!\n" ~ "Take one down, pass it around,\n" ~ "No bottles of beer on the wall!\n\n"); } return bottlesRecurse(num) ~ "Go to the store and buy some more...\n" ~ num.text ~ " bottles of beer on the wall!"; } pragma(msg, 99.bottles); void main() {}  ### Template Meta-Programming Solution Uses D template meta-programming and recursion to pre-generate the song lyrics and prints it at compile via pragma(msg,...) module bottles; template BeerSong(int Bottles) { static if (Bottles == 1) { enum BeerSong = "1 bottle of beer on the wall\n" ~ "1 bottle of beer\ntake it down, pass it around\n" ~ " no more bottles of beer on the wall\n"; } else { enum BeerSong = Bottles.stringof ~ " bottles of beer on the wall\n" ~ Bottles.stringof ~ " bottles of beer\ntake it down, pass it around\n" ~ BeerSong!(Bottles-1); } } pragma(msg,BeerSong!99); void main(){}  ## Dart // Making use of polymorphism main() { BeerSong beerSong = BeerSong(); //pass a 'starting point' and 'end point' as parameters respectively String printTheLyrics = beerSong.recite(99, 1).join('\n'); print(printTheLyrics); } class Song { String bottleOnTheWall(int index) { String bottleOnTheWallText = '$index bottles of beer on the wall, $index bottles of beer,'; return bottleOnTheWallText; } String bottleTakenDown(int index) { String englishGrammar = (index >= 2) ? 'bottle' : 'bottles'; String bottleTakenDownText = 'Take one down and pass it around,${index - 1} $englishGrammar of beer on the wall.'; return bottleTakenDownText; } } class BeerSong extends Song { @override String bottleOnTheWall(int index) { String originalText = super.bottleOnTheWall(index); if (index < 2) { String bottleOnTheWallText = '$index bottle of beer on the wall, $index bottle of beer,'; return bottleOnTheWallText; } return originalText; } @override String bottleTakenDown(int index) { if (index < 2) { String bottleTakenDownText = 'Take it down and pass it around, no more bottles of beer on the wall.'; return bottleTakenDownText; } String originalText = super.bottleTakenDown(index); return originalText; } List<String> recite(int actualBottleOnTheWall, int remainingBottleOnTheWall) { List<String> theLyrics = []; for (int index = actualBottleOnTheWall; index >= remainingBottleOnTheWall; index--) { String onTheWall = bottleOnTheWall(index); String takenDown = bottleTakenDown(index); theLyrics.add(onTheWall); theLyrics.add(takenDown); theLyrics.add(''); } return theLyrics; } } }  ## Dc Works with: GNU dc Works with: OpenBSD dc [ dnrpr dnlBP lCP 1-dnrp rd2r >L ]sL [Take one down, pass it around ]sC [ bottles of beer ]sB [ bottles of beer on the wall] 99 lLx dnrpsA dnlBP lCP 1- dn[ bottle of beer on the wall]p rdnrpsA n[ bottle of beer ]P [Take it down, pass it around ]P [no more bottles of beer on the wall ]P Similar to the program above, but without 'n' and 'r' commands. It prints the numbers on separate lines than the strings. Works with: AT&T dc [ plAP plBP lCP 1-dplAP d2r >L ]sL [Take one down, pass it around ]sC [bottles of beer ]sB [bottles of beer on the wall ]sA 99 lLx plAP plBP lCP 1- p [bottle of beer on the wall ]P p [bottle of beer ]P [Take it down, pass it around ]P [no more bottles of beer on the wall ]P ## DBL ; ;=============================================================================== ; Oringinal Author: Bob Welton (welton@pui.com) ; Language: DIBOL or DBL ; ; Modified to work with DBL version 4 ; by Dario B. ;=============================================================================== RECORD NRBOT,D2,99 ;Default # of bottles to 99 A2, A2 PROC ;------------------------------------------------------------------------------- XCALL FLAGS (0007000000,1) ;Suppress STOP message OPEN (1,O,"TT:") ;Open the terminal/display DO FOREVER BEGIN A2=NRBOT,'ZX' DISPLAY (1,A2," Bottles of Beer on the wall,",10) A2=NRBOT,'ZX' DISPLAY (1,A2," Bottles of Beer,",10) DISPLAY (1," Take one down, pass it around,",10) DECR NRBOT ;Reduce # of bottles by 1 IF (NRBOT.LE.1) EXITLOOP ;If just 1 bottle left, get out A2=NRBOT,'ZX' DISPLAY (1,A2," Bottles of Beer on the wall.",10,10) END A2=NRBOT,'ZX' DISPLAY (1,A2," Bottle of Beer on the wall,",10,10) A2=NRBOT,'ZX' DISPLAY (1,A2," Bottle of Beer,",10) DISPLAY (1," Take one down, pass it around,",10) DISPLAY (1,"0 Bottles of Beer on the wall,",10) DISPLAY (1,"0 Bottles of Beer,",10) DISPLAY (1,"Go to the store and buy some more,",10) DISPLAY (1,"99 Bottles of Beer on the wall,",10,10,10) CLOSE 1 STOP  ## Delphi ## Draco proc nonrec bottles(byte b) void: if b=0 then write("No more") else write(b) fi; write(" bottle"); if b~=1 then write("s") fi corp; proc nonrec verse(byte v) void: bottles(v); writeln(" of beer on the wall,"); bottles(v); writeln(" of beer,"); writeln("Take ", if v=1 then "it" else "one" fi, " down and pass it around"); bottles(v-1); writeln(" of beer on the wall!\n"); corp; proc nonrec main() void: byte v; for v from 99 downto 1 do verse(v) od corp ## Dyalect Translation of: Swift for i in 99^-1..1 { print("\(i) bottles of beer on the wall, \(i) bottles of beer.") let next = i is 1 ? "no" : i - 1 print("Take one down and pass it around, \(next) bottles of beer on the wall.") } ## Dylan Module: bottles define method bottles (n :: <integer>) for (n from 99 to 1 by -1) format-out("%d bottles of beer on the wall,\n" "%d bottles of beer\n" "Take one down, pass it around\n" "%d bottles of beer on the wall\n", n, n, n - 1); end end method  ## Déjà Vu plural i: if = 1 i "" "s" bottles i: local :s plural i !print( to-str i " bottle"s" of beer on the wall, " to-str i " bottle"s" of beer," ) !print\ "You take one down, pass it around, " set :i -- i if i: set :s plural i !print( to-str i " bottle"s" of beer on the wall." ) bottles i else: !print "no more bottles of beer on the wall, no more bottles of beer." !print "Go to the store and buy some more, 99 bottles of beer on the wall." bottles 99 ## DIBOL-11 ; ;=============================================================================== ======================== ; Oringinal Author: Bob Welton (welton@pui.com) ; Language: DIBOL or DBL ; ; Modified to work with DEC DIBOL-11 ; by Bill Gunshannon ;=============================================================================== ======================== RECORD MISC NUMBOTTLES ,D2,99 ;Default # of bottles to 99 RECORD LINE1 ANUMBOTTLES, A2 , A32, " Bottles of Beer on the wall," RECORD LINE2 BNUMBOTTLES, A2 , A32, " Bottles of Beer," RECORD LINE3 CNUMBOTTLES, A2 , A32, " Bottles of Beer on the wall." RECORD LINE4 DNUMBOTTLES, A2 , A32, " Bottle of Beer on the wall," RECORD LINE5 ENUMBOTTLES, A2 , A32, " Bottle of Beer," .PROC XCALL FLAGS (0007000000,1) ;Suppress STOP message OPEN (8,O:C,"TT:") ;Open the terminal/display REPEAT BEGIN ANUMBOTTLES = NUMBOTTLES,'ZX' WRITES (8,LINE1) BNUMBOTTLES = NUMBOTTLES,'ZX' WRITES (8,LINE2) 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 CNUMBOTTLES = NUMBOTTLES,'ZX' WRITES (8,LINE3) WRITES (8," ") END DNUMBOTTLES = NUMBOTTLES,'ZX' WRITES(8,LINE4) WRITES (8," ") ENUMBOTTLES = NUMBOTTLES,'ZX' WRITES(8,LINE5) WRITES (8," Take one down, pass it around,") WRITES(8,"0 Bottles of Beer on the wall,") WRITES(8,"0 Bottles of Beer,") WRITES(8,"Go to the store and buy some more,") WRITES(8,"99 Bottles of Beer on the wall,") WRITES (8," ") WRITES (8," ") SLEEP 2 CLOSE 8 STOP .END ## E def bottles(n) { return switch (n) { match ==0 { "No bottles" } match ==1 { "1 bottle" } match _ { $n bottles }
}
}
for n in (1..99).descending() {
println(${bottles(n)} of beer on the wall,${bottles(n)} of beer.
Take one down, pass it around,
${bottles(n.previous())} of beer on the wall. ) } ## EasyLang func$ bottle num .
if num = 1
return "bottle"
.
return "bottles"
.
#
i = 99
repeat
print i & " " & bottle i & " of beer on the wall"
print i & " " & bottle i & " of beer"
print "Take one down, pass it around"
i -= 1
until i = 0
print i & " " & bottle i & " of beer on the wall"
print ""
.
print "No more bottles of beer on the wall"

## ECL

Layout := RECORD
UNSIGNED1 RecID1;
UNSIGNED1 RecID2;
STRING30  txt;
END;
Beers := DATASET(99,TRANSFORM(Layout,
SELF.RecID1 := COUNTER,SELF.RecID2 := 0,SELF.txt := ''));

Layout XF(Layout L,INTEGER C) := TRANSFORM
IsOneNext := L.RecID1-1 = 1;
IsOne := L.RecID1 = 1;
SELF.txt := CHOOSE(C,
(STRING)(L.RecID1-1) + ' bottle'+IF(IsOneNext,'','s')+' of beer on the wall',
'Take one down, pass it around',
(STRING)(L.RecID1) + ' bottle'+IF(IsOne,'','s')+' of beer',
(STRING)(L.RecID1) + ' bottle'+IF(IsOne,'','s')+' of beer on the wall','');
SELF.RecID2 := C;
SELF := L;
END;

Rev := NORMALIZE(Beers,5,XF(LEFT,COUNTER));
OUTPUT(SORT(Rev,-Recid1,-RecID2),{txt},ALL);


## Ecstasy

module Bottles {
void run() {
function String(Int) num     = i -> i==0 ? "No" : i.toString();
function String(Int) bottles = i -> i==1 ? "bottle" : "bottles";

@Inject Console console;
for (Int remain : 99..1) {
end

## Fe

(= n 99)
(while (< 0 n)
(print n "bottles of beer on the wall")
(print n "bottles of beer")
(print "Take one down, pass it around")
(= n (- n 1))
(print n "bottles of beer on the wall\n"))


## ferite

copied from 99-bottles-of-beer.net.

uses "console";

number bottles = 99;
boolean looping = true;
object counter = closure {
if (--bottles > 0) {
return true;
} else {
return false;
}
};

while (looping) {
Console.println("${bottles} bottles of beer on the wall,"); Console.println("${bottles} bottles of beer,");
Console.println("Take one down, pass it around,");

looping = counter.invoke();

## Golo

module Bottles

augment java.lang.Integer {
function bottles = |self| -> match {
when self == 0 then "No bottles"
when self == 1 then "One bottle"
otherwise self + " bottles"
}
}

function main = |args| {
99: downTo(1, |i| {
println(i: bottles() + " of beer on the wall,")
println(i: bottles() + " of beer!")
println("Take one down, pass it around,")
println((i - 1): bottles() + " of beer on the wall!")
println("--------------------------------------")
})
}


## Gosu

for (i in 99..0) {

print("${i} bottles of beer on the wall") if (i > 0) { print("${i} bottles of beer")
print("Take one down, pass it around")
}
print("");

}


## Groovy

### Basic Solution

With a closure to handle special cardinalities of bottles.

def bottles = { "${it==0 ? 'No more' : it} bottle${it==1 ? '' : 's' }" }

99.downto(1) { i ->
print """
${bottles(i)} of beer on the wall${bottles(i)} of beer
Take one down, pass it around
"${m?' on the wall':'\nTake one down, pass it around'}\n" }  ### Bottomless Beer Solution Using more closures to create a richer lyrical experience. def bottles = { "${it==0 ? 'No more' : it} bottle${it==1 ? '' : 's' }" } def initialState = { """${result(it)}
${resultShort(it)}""" } def act = { it > 0 ? "Take${it==1 ? 'it' : 'one'} down, pass it around" :
"Go to the store, buy some more"
}

def delta = { it > 0 ? -1 : 99 }

def resultShort = { "${bottles(it)} of beer" } def result = { "${resultShort(it)} on the wall" }

// //// uncomment commented lines to create endless drunken binge //// //
// while (true) {
99.downto(0) { i ->
print """
${initialState(i)}${act(i)}
${result(i+delta(i))} """ } // Thread.sleep(1000) // }  ## GUISS We will just use the calculator and keep taking one off. We do not get the full text here, but the number of the calculator shows how many bottles we still have left to drink: Start,Programs,Accessories,Calculator,Button:9,Button:9, Button:[hyphen],Button:1,Button:[equals],Button:[hyphen],Button:1,Button:[equals], Button:[hyphen],Button:1,Button:[equals],Button:[hyphen],Button:1,Button:[equals], Button:[hyphen],Button:1,Button:[equals],Button:[hyphen],Button:1,Button:[equals], Button:[hyphen],Button:1,Button:[equals],Button:[hyphen],Button:1,Button:[equals] We haven't drank all of the bottles at this point, but we can keep going, if we want. ## Halon $plural = "s";
$x = 99; while ($x > 0) {
echo "$x bottle$plural of beer on the wall";
echo "$x bottle$plural of beer";
echo "Take one down, pass it around";
$x -= 1; if ($x == 1)
$plural = ""; if ($x > 0)
echo "$x bottle$plural of beer on the wall\n";
else
echo "No more bottles of beer on the wall!";
}

## Haskell

#### Brevity

A relatively concise solution:

main = mapM_ (putStrLn . beer) [99, 98 .. 0]
beer 1 = "1 bottle of beer on the wall\n1 bottle of beer\nTake one down, pass it around"
beer 0 = "better go to the store and buy some more."
beer v = show v ++ " bottles of beer on the wall\n"
++ show v
++" bottles of beer\nTake one down, pass it around\n"
++ head (lines $beer$ v-1) ++ "\n"


#### List comprehension

As a list comprehension:

import qualified Char

main = putStr $concat [up (bob n) ++ wall ++ ", " ++ bob n ++ ".\n" ++ pass n ++ bob (n - 1) ++ wall ++ ".\n\n" | n <- [99, 98 .. 0]] where bob n = (num n) ++ " bottle" ++ (s n) ++ " of beer" wall = " on the wall" pass 0 = "Go to the store and buy some more, " pass _ = "Take one down and pass it around, " up (x : xs) = Char.toUpper x : xs num (-1) = "99" num 0 = "no more" num n = show n s 1 = "" s _ = "s"  #### Writer monad and Template Haskell Another version, which uses a Writer monad to collect each part of the song. It also uses Template Haskell to generate the song at compile time. {-# LANGUAGE TemplateHaskell #-} -- build with "ghc --make beer.hs" module Main where import Language.Haskell.TH import Control.Monad.Writer -- This is calculated at compile time, and is equivalent to -- songString = "99 bottles of beer on the wall\n99 bottles..." songString =$(let
sing = tell -- we can't sing very well...

someBottles 1 = "1 bottle of beer "
someBottles n = show n ++ " bottles of beer "

bottlesOfBeer n = (someBottles n ++)

verse n = do
sing $n bottlesOfBeer "on the wall\n" sing$ n bottlesOfBeer "\n"
sing $"Take one down, pass it around\n" sing$ (n - 1) bottlesOfBeer "on the wall\n\n"

song = execWriter $mapM_ verse [99,98..1] in return$ LitE $StringL$ song)

main = putStr songString


#### Avoiding append by spelling bottle backwards

Is there something just a little prickly and displeasing about (++) ? Monoid (<>) is less spiky, but neither is needed when 'bottle' is written backwards.

location, distribution, solution :: String
[location, distribution, solution] =
[ "on the wall",
"Take one down, pass it around",
"Better go to the store to buy some more"
]

incantation :: Int -> String
incantation n
| 0 == n = solution
| otherwise =
unlines
[ inventory n,
asset n,
distribution,
inventory $pred n ] inventory :: Int -> String inventory = unwords . (: [location]) . asset asset :: Int -> String asset n = let suffix n | 1 == n = [] | otherwise = ['s'] in unwords [show n, (reverse . concat)$ suffix n : ["elttob"]]

main :: IO ()
main = putStrLn $unlines (incantation <$> [99, 98 .. 0])


## Haxe

### Simple solution

class RosettaDemo
{
static public function main()
{
singBottlesOfBeer(100);
}

static function singBottlesOfBeer(bottles : Int)
{
var plural : String = 's';

while (bottles >= 1)
{
Sys.println(bottles + " bottle" + plural + " of beer on the wall,");
Sys.println(bottles + " bottle" + plural + " of beer!");
Sys.println("Take one down, pass it around,");
if (bottles - 1 == 1)
{
plural = '';
}

if (bottles > 1)
{
Sys.println(bottles-1 + " bottle" + plural + " of beer on the wall!\n");
}
else
{
Sys.println("No more bottles of beer on the wall!");
}
bottles--;
}
}
}


### Macro solution

All those counters, loops and conditinal blocks are pretty expensive in runtime compared to single print of fully inlined text of the song. Let's generate that print with macro.

class Bottles {

static public function main () : Void {
singBottlesOfBeer(100);
}

macro static public function singBottlesOfBeer (bottles:Int) {
var lines = [];
var s : String = 's';

var song : String = '';
while( bottles >= 1 ){
song += '$bottles bottle$s of beer on the wall,\n';
song += '$bottles bottle$s of beer!\n';
song += 'Take one down, pass it around,\n';

bottles --;

if( bottles > 1 ){
song += '$bottles bottles of beer on the wall!\n\n'; }else if( bottles == 1 ){ s = ''; song += '$bottles bottle of beer on the wall!\n\n';
}else{
song += 'No more bottles of beer on the wall!\n';
}
}

return macro Sys.print($v{song}); } }  ## hexiscript fun bottles amount beverage location let bottle " bottles of " if amount = 0; let amount "No more" elif amount = 1; let bottle " bottle of "; endif return amount + bottle + beverage + " " + location endfun fun take amount location return "Take " + amount + " " + location endfun fun pass entity destination return ", pass " + entity + " " + destination endfun let amount 99 while amount > 0 println bottles amount "beer" "on the wall" println bottles amount "beer" "" println take "one" "down" + pass "it" "around" println bottles (--amount) "beer" "on the wall\n" endwhile ## HicEst DO x = 99, 1, -1 WRITE() x , "bottles of beer on the wall" BEEP("T16 be be be bH bH bH be be be 2be ") WRITE() x , "bottles of beer" BEEP("2p f f f c c c 2f ") WRITE() "take one down, pass it around" BEEP("2p 2d d d 2p d d d 2d ") WRITE() x , "bottles of beer on the wall" BEEP("2p #A #A #A c c d #d #d #d 2#d 2p") ENDDO ## HolyC The default is 99 bottles, but it can be modified by the parameter. U0 BottlesOfBeer (I64 initial=99) { // This is made I64 rather than U64 // Because, a U64 would overflow // At the end of the loop, thus it would loop forever (i-- would be 0-1 so it overflows and is always greater than or equal to 0) I64 i = initial; for (; i >= 0; i--) { if (i == 1) { // Just a string on it's own will pass it to an inbuilt HolyC function that puts it to terminal "1 Bottle of Beer on the wall, 1 bottle of beer.\n"; "Take one down and pass it around, no more bottles of beer on the wall.\n"; } else if (i == 0) { "No more bottles of beer on the wall, no more bottles of beer.\n"; "Go to the store and buy some more, 99 bottles of beer on the wall.\n"; } else { "%d bottles of beer on the wall, %d bottles of beer.\n",i,i; "Take one down and pass it around, %d bottle",(i-1); // Only add the s if it's not 1 if ((i-1) != 1) { "s"; } " of beer on the wall.\n"; } } } // Calls the function, which goes to the default parameters BottlesOfBeer; ## Hoon :- %say |= [* * [bottles=_99 ~]] :- %noun ^- wall =/ output (list tape)~ |- ?: =(1 bottles) %- flop :- "1 bottle of beer on the wall" :- "Take one down, pass it around" :- "1 bottle of beer" :- "1 bottle of beer on the wall" output %=$
bottles  (dec bottles)
output
:-  "{<bottles>} bottles of beer on the wall"
:-  "Take one down, pass it around"
:-  "{<bottles>} bottles of beer"
:-  "{<bottles>} bottles of beer on the wall"
output
==

## Hope

El código es de 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;

## Huginn

#! /bin/sh
exec huginn --no-argv -E "${0}" "${@}"
#! huginn

import Algorithms as algo;

main() {
x = "{} bottle{} of beer on the wall,\n"
"{} bottle{} of beer.\n"
"Take one down, pass it around,\n"
"{} bottle{} of beer on the wall.\n\n";
for ( n : algo.range( 99, 0, -1 ) ) {
bot = n > 0 ? n : "No";
plu = n != 1 ? "s" : "";
print( x.format( bot, plu, bot, plu, n > 1 ? n - 1 : "No", n != 2 ? "s" : "" ) );
}
print(
"No bottles of beer on the wall,\n"
"No bottles of beer.\n"
"Go to the store, buy some more,\n"
"99 bottles of beer on the wall.\n"
);
return ( 0 );
}

## HyperTalk

El código es de Eric Carlson eric@bungdabba.com

on BeerSong99
BottlesOfBeer 99
end BeerSong99

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

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

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

## Icon and Unicon

The default is 99 bottles, but you can change this on the command line for really long trips...

procedure main(args)
numBeers := integer(args[1]) | 99
drinkUp(numBeers)
end

procedure drinkUp(beerMax)
static beerMap
initial {
beerMap := table(" bottles")
beerMap[1] := " bottle"
}

every beerCount := beerMax to 1 by -1 do {
writes( beerCount,beerMap[beerCount]," of beer on the wall, ")
write(  beerCount,beerMap[beerCount]," of beer.")

writes("Take one down and pass it around, ")
write(case x := beerCount-1 of {
0       : "no more bottles"
default : x||beerMap[x]
}," of beer on the wall.\n")
}

write("No more bottles of beer on the wall, no more bottles of beer.")
write("Go to the store and buy some more, ",
beerMax," bottles of beer on the wall.")
end


## IDL

Pro bottles

for i=1,99 do begin
print, 100-i, " bottles of beer on the wall.", 100-i, $" bottles of beer.", " Take one down, pass it around," ,$
99-i, " bottles of beer on the wall."
endfor
End


Since in IDL "FOR"-loops are the embodiment of pure evil (see http://www.idlcoyote.com/tips/forloops.html and http://www.idlcoyote.com/tips/forloops2.html) there is also a loop free IDL way:

Pro bottles_noloop
b=(reverse(shift(sindgen(100),-1)))[1:99]
b2=reverse(sindgen(99))
wallT=replicate(' bottles of beer on the wall.', 100)
wallT2=replicate(' bottles of beer.', 100)
takeT=replicate('Take one down, pass it around,', 100)
print, b+wallT+string(10B)+b+wallT2+string(10B)+takeT+string(10B)+b2+wallT+string(10B)
End


I found the above example very helpful but overdone. This is a more simple version:

Pro bottles_noloop2
n_bottles=99
b1 = reverse(SINDGEN(n_bottles,START=1))
b2= reverse(SINDGEN(n_bottles))
wallT=replicate(' bottles of beer on the wall.', n_bottles)
wallT2=replicate(' bottles of beer.', n_bottles)
takeT=replicate('Take one down, pass it around,', n_bottles)
print, b1+wallT+string(10B)+b1+wallT2+string(10B)+takeT+string(10B)+b2+wallT+string(10B)
End


## Idris

beerSong : Fin 100 -> String
beerSong x = verses x where

bottlesOfBeer : Fin n -> String
bottlesOfBeer fZ      = "No more bottles of beer"
bottlesOfBeer (fS fZ) = "1 bottle of beer"
bottlesOfBeer k       = (show (finToInteger k)) ++ " bottles of beer"

verse : Fin n -> String
verse fZ     = ""
verse (fS n) =
(bottlesOfBeer (fS n)) ++ " on the wall,\n" ++
(bottlesOfBeer (fS n)) ++ "\n" ++
"Take one down, pass it around\n" ++
(bottlesOfBeer n) ++ " on the wall\n"

verses : Fin n -> String
verses fZ     = ""
verses (fS n) = (verse (fS n)) ++ (verses n)

## Inform 6

[ Bottles i;
if(i == 1) return "bottle";

return "bottles";
];

[ Beer i;
print i, " ", (string) Bottles(i), " of beer on the wall^";
print i, " ", (string) Bottles(i), " of beer^";
print "Take one down, pass it around^";
i--;
print i, " ", (string) Bottles(i), " of beer on the wall^^";

if(i ~= 0) Beer(i);
];

[ Main;
Beer(99);
];

## Inform 7

### Programmatic solution

Beer Hall is a room.

When play begins:
repeat with iteration running from 1 to 99:
let N be 100 - iteration;
say "[N] bottle[s] of beer on the wall[line break]";
say "[N] bottle[s] of beer[line break]";
say "Take one down, pass it around[line break]";
say "[N - 1] bottle[s] of beer on the wall[paragraph break]";
end the story.

### World model solution

This solution uses in-game objects to represent the wall and the bottles.

Beer Hall is a room.

The plural of bottle of beer is bottles of beer. A bottle of beer is a kind of thing.

The wall is a scenery supporter in Beer Hall. 99 bottles of beer are on the wall.

When play begins:
while something is on the wall:
say "[what's on the wall] on the wall[line break]";
say "[what's on the wall][line break]";
say "Take one down, pass it around[line break]";
remove a random thing on the wall from play;
say "[what's on the wall] on the wall[paragraph break]";
end the story.

To say what's on the wall:
if more than one thing is on the wall, say list of things on the wall;
otherwise say "[number of things on the wall in words] bottle[s] of beer".

## Io

bottles := method(i,
if(i==0, return "no more bottles of beer")
if(i==1, return "1 bottle of beer")
"" .. i .. " bottles of beer"
)
for(i, 99, 1, -1,
write(
bottles(i), " on the wall, ",
bottles(i), ",\n",
"take one down, pass it around,\n",
bottles(i - 1), " on the wall.\n\n"
)
)

## Intercal

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 ## Ioke bottle = method(i, case(i, 0, "no more bottles of beer", 1, "1 bottle of beer", "#{i} bottles of beer")) (99..1) each(i, "#{bottle(i)} on the wall, " println "take one down, pass it around," println "#{bottle(i - 1)} on the wall.\n" println ) ## J As posted at the J wiki bob =: ": , ' bottle' , (1 = ]) }. 's of beer'"_ bobw=: bob , ' on the wall'"_ beer=: bobw , ', ' , bob , '; take one down and pass it around, ' , bobw@<: beer"0 >:i.-99 Output: 99 bottles of beer on the wall, 99 bottles of beer; take one down and pass it around, 98 bottles of beer on the wall 98 bottles of beer on the wall, 98 bottles of beer; take one down and pass it around, 97 bottles of beer on the wall ... 3 bottles of beer on the wall, 3 bottles of beer; take one down and pass it around, 2 bottles of beer on the wall 2 bottles of beer on the wall, 2 bottles of beer; take one down and pass it around, 1 bottle of beer on the wall 1 bottle of beer on the wall, 1 bottle of beer; take one down and pass it around, 0 bottles of beer on the wall  ## Jakt fn bottle_string(bottle_count: i64) throws -> String => match bottle_count { 0 => "No more bottles" 1 => "1 bottle" else => format("{} bottles", bottle_count) } fn main() { mut bottle_count = 99 while bottle_count > 0 { println("{} of beer on the wall", bottle_string(bottle_count)) println("{} of beer", bottle_string(bottle_count)) println("Take one down, pass it around") bottle_count-- println("{} of beer on the wall", bottle_string(bottle_count)) if bottle_count > 0 { println("") } } } ## Janet (defn bottles [n] (match n 0 "No more bottles" 1 "1 bottle" _ (string n " bottles"))) (loop [i :down [99 0]] (print (bottles i) " of beer on the wall\n" (bottles i) " of beer\nTake one down, pass it around\n" (bottles (- i 1)) " of beer on the wall\n\n")) ## Java ### Console MessageFormat's choice operator is used to properly format plurals. import java.text.MessageFormat; public class Beer { static String bottles(int n) { return MessageFormat.format("{0,choice,0#No more bottles|1#One bottle|2#{0} bottles} of beer", n); } public static void main(String[] args) { String bottles = bottles(99); for (int n = 99; n > 0; ) { System.out.println(bottles + " on the wall"); System.out.println(bottles); System.out.println("Take one down, pass it around"); bottles = bottles(--n); System.out.println(bottles + " on the wall"); System.out.println(); } } } Optimized for speed and few I/O operations public class Beer { public static void main(String[] args) { int bottles = 99; StringBuilder sb = new StringBuilder(); String verse1 = " bottles of beer on the wall\n"; String verse2 = " bottles of beer.\nTake one down, pass it around,\n"; String verse3 = "Better go to the store and buy some more."; while (bottles > 0) sb.append(bottles).append(verse1).append(bottles).append(verse2).append(--bottles).append(verse1).append("\n"); System.out.println(sb.append(verse3)); } } Recursive public class Beer { public static void main(String args[]) { song(99); } public static void song(int bottles) { if (bottles >= 0) { if (bottles > 1) System.out.println(bottles + " bottles of beer on the wall\n" + bottles + " bottles of beer\nTake one down, pass it around\n" + (bottles - 1) + " bottles of beer on the wall.\n"); else if (bottles == 1) System.out.println(bottles + " bottle of beer on the wall\n" + bottles + " bottle of beer\nTake one down, pass it around\n" + (bottles - 1) + " bottles of beer on the wall.\n"); else System.out.println(bottles + " bottles of beer on the wall\n" + bottles + " bottles of beer\nBetter go to the store and buy some more!"); song(bottles - 1); } } } ### An object-oriented solution Translation of: C++ ### GUI Library: Swing Library: AWT This version requires user interaction. The first two lines are shown in a text area on a window. The third line is shown on a button which you need to click to see the fourth line in a message box. The numbers update and the process repeats until "0 bottles of beer on the wall" is shown in a message box, when the program ends. import java.awt.BorderLayout; import java.awt.event.ActionEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextArea; public class Beer extends JFrame { private int x; private JTextArea text; public static void main(String[] args) { new Beer().setVisible(true); } public Beer() { x = 99; JButton take = new JButton("Take one down, pass it around"); take.addActionListener(this::onTakeClick); text = new JTextArea(4, 30); text.setText(x + " bottles of beer on the wall\n" + x + " bottles of beer"); text.setEditable(false); setLayout(new BorderLayout()); add(text, BorderLayout.CENTER); add(take, BorderLayout.PAGE_END); pack(); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } private void onTakeClick(ActionEvent event) { JOptionPane.showMessageDialog(null, --x + " bottles of beer on the wall"); text.setText(x + " bottles of beer on the wall\n" + x + " bottles of beer"); if (x == 0) { dispose(); } } } ## JavaScript ### ES3-5 var beer = 99; while (beer > 0) { var verse = [ beer + " bottles of beer on the wall,", beer + " bottles of beer!", "Take one down, pass it around", (beer - 1) + " bottles of beer on the wall!" ].join("\n"); console.log(verse); beer--; } ### ES6 let beer = 99; while (beer > 0) { let verse = ${beer} bottles of beer on the wall,
${beer} bottles of beer! Take one down, pass it around${beer-1} bottles of beer on the wall;

console.log(verse);
beer--;
}

### Functional / Recursive

var bottles = 99;
var songTemplate  = "{X} bottles of beer on the wall \n" +
"{X} bottles of beer \n"+
"Take one down, pass it around \n"+
"{X-1} bottles of beer on the wall \n";

function song(x, txt) {
return txt.replace(/\{X\}/gi, x).replace(/\{X-1\}/gi, x-1) + (x > 1 ? song(x-1, txt) : "");
}

console.log(song(bottles, songTemplate));

### Other Examples

More skilled solution "one-liner" with grammar check

Comment: This being a "one-liner" is arguable. The author has chosen not to put a line break after the declaration of the beer variable. By using the authors definition, most of the other solutions could pass as a "one-liner".

// Line breaks are in HTML
var beer; while ((beer = typeof beer === "undefined" ? 99 : beer) > 0) document.write( beer + " bottle" + (beer != 1 ? "s" : "") + " of beer on the wall<br>" + beer + " bottle" + (beer != 1 ? "s" : "") + " of beer<br>Take one down, pass it around<br>" + (--beer) + " bottle" + (beer != 1 ? "s" : "") + " of beer on the wall<br>" );

Legitimate "one-liner" with grammar check, using declarative methods.

Array.from(Array(100).keys()).splice(1).reverse().forEach(n => console.log(${n} bottle${n !== 1 ? 's' : ''} of beer on the wall\n${n} bottle${n !== 1 ? 's' : ''} of beer\nTake one down, pass it around\n${n - 1} bottle${n - 1 !== 1 ? 's' : ''} of beer on the wall\n\n));

Object Oriented

function Bottles(count) {
this.count = count || 99;
}

Bottles.prototype.take = function() {
var verse = [
this.count + " bottles of beer on the wall,",
this.count + " bottles of beer!",
"Take one down, pass it around",
(this.count - 1) + " bottles of beer on the wall!"
].join("\n");

console.log(verse);

this.count--;
};

Bottles.prototype.sing = function() {
while (this.count) {
this.take();
}
};

var bar = new Bottles(99);
bar.sing();

An alternative version:

function bottleSong(n) {
if (!isFinite(Number(n)) || n == 0) n = 100;
var a  = '%% bottles of beer',
b  = ' on the wall',
c  = 'Take one down, pass it around',
r  = '<br>'
p  = document.createElement('p'),
s  = [],
re = /%%/g;

while(n) {
s.push((a+b+r+a+r+c+r).replace(re, n) + (a+b).replace(re, --n));
}
p.innerHTML = s.join(r+r);
document.body.appendChild(p);
}

window.onload = bottleSong;

## Joy

LIBRA

_beerlib == true;

HIDE
beer == "of beer " putchars;
wall == "on the wall" putchars;
take1 == "Take one down and pass it around, " putchars;
dup3 == dup dup dup;
comma == ", " putchars;
period == ". " putchars;
bottles == [small]
[[null] [pop "no more bottles " putchars] [put "bottle " putchars] ifte]
[put "bottles " putchars] ifte;
sing-verse == dup3 bottles beer wall comma
bottles beer ".\n" putchars
take1 pred bottles beer wall period newline newline;
sing-verse-0 == "No more bottles of beer on the wall, no more bottles of beer\n" putchars
"Go to the store and buy some more, " putchars
99 bottles pop beer wall period newline

IN
(* n -- *)
sing-verses == [null]
[sing-verse-0]
[sing-verse pred] tailrec
END.

99 sing-verses.

## jq

Minimalist:

99
| (. - range(0;.+1) )
| "
\(.) bottles of beer on the wall
\(.) bottles of beer
Take one down, pass it around
\(.) bottles of beer on the wall"
Output:
$jq -n -r -f 99_bottles.jq ... 2 bottles of beer on the wall 2 bottles of beer Take one down, pass it around 2 bottles of beer on the wall 1 bottles of beer on the wall 1 bottles of beer Take one down, pass it around 1 bottles of beer on the wall 0 bottles of beer on the wall 0 bottles of beer Take one down, pass it around 0 bottles of beer on the wall Variant: def sing: def s: if . == 1 then "" else "s" end; def bottles: if . == 0 then "No more" else "\(.)" end + " bottle\(s)"; (. - range(0;.+1) ) | " \(bottles) of beer on the wall \(bottles) of beer Take one down, pass it around \(bottles) of beer on the wall." ;$bottles | tonumber | sing
Output:
$jq -r --arg bottles 99 -f 99_bottles_variant.jq ... 2 bottles of beer on the wall 2 bottles of beer Take one down, pass it around 2 bottles of beer on the wall. 1 bottle of beer on the wall 1 bottle of beer Take one down, pass it around 1 bottle of beer on the wall. No more bottles of beer on the wall No more bottles of beer Take one down, pass it around No more bottles of beer on the wall. ## Jsish /* 99 Bottles, in Jsish */ function plural(n:number):string { return (bottles == 1) ? "" : "s"; } function no(n:number):string { return (bottles == 0) ? "No" : n.toString(); } var bottles = 99; do { printf("%d bottle%s of beer on the wall\n", bottles, plural(bottles)); printf("%d bottle%s of beer\n", bottles, plural(bottles)); puts("Take one down, pass it around"); bottles--; printf("%s bottle%s of beer on the wall\n\n", no(bottles), plural(bottles)); } while (bottles > 0); ## Julia one-liner for i = 99:-1:1 print("\n$i bottles of beer on the wall\n$i bottles of beer\nTake one down, pass it around\n$(i-1) bottles of beer on the wall\n") end

another solution, handling grammar cases "No more bottles", "1 bottle", "<n> bottles"

bottles(n) = n==0 ? "No more bottles" :
n==1 ? "1 bottle" :
"$n bottles" for n = 99:-1:1 println("""$(bottles(n)) of beer on the wall
$(bottles(n)) of beer Take one down, pass it around$(bottles(n-1)) of beer on the wall
""")
end

shorter, but more cryptic, version of the previous bottles function

bottles(n) = "$(n==0 ? "No more" : n) bottle$(n==1 ? "" : "s")"

0:\:{x[z],y,a,x[z],a,"Take one down, pass it around",a,x[z-1],y,a,a:"\n"}[{($x)," bottle",:[x=1;"";"s"]," of beer"};" on the wall"]'|1_!100 ## Kabap // Loop that spits lyrics to "99 Bottles of Beer"$n = 99;
$out = ""; :loop;$out = $out <<$n << " bottles of beer on the wall, " << $n << " bottles of beer. Take one down, pass it around, " <<$n - 1 << " bottles of beer on the wall…  ";
$n =$n - 1;
if $n > 0; goto loop; return =$out;

## Kitten

99 bottles_of_beer_on_the_wall

define bottles_of_beer_on_the_wall (Int32 -> +IO):
-> n;
n th_verse
if (n > 1): (n - 1) bottles_of_beer_on_the_wall

define th_verse (Int32 -> +IO):
-> n;
n bottles_of_beer on_the_wall       say
n bottles_of_beer                   say
take_one_down_pass_it_around        say
(n - 1) bottles_of_beer on_the_wall say
newline

define bottles_of_beer (Int32 -> List<Char>):
bottles " of beer" cat

define on_the_wall (List<Char> -> List<Char>):
" on the wall" cat

define take_one_down_pass_it_around (-> List<Char>):
"take one down, pass it around"

define bottles (Int32 -> List<Char>):
-> n;
if (n = 0):
"no more bottles"
elif (n = 1):
"one bottle"
else:
n show " bottles" cat

## Klingphix

include ..\Utilitys.tlhy

:bottles
dup 0 ==
(
["no more bottles of beer"]
[ dup 1 ==
(
["1 bottle of beer"]
[dup tostr " bottles of beer" chain]
) if
]
) if
;

( 99 1 -1 )
[ bottles print " on the wall," ?
bottles "," chain ?
"take one down, pass it around," ?
1 - bottles print " on the wall." ? nl
drop] for

" " input

## Klong

bottles::{:[x=1;"bottle";"bottles"]}
itone::{:[x=1;"it";"one"]}
numno::{:[x=0;"no";x]}
drink::{.d(numno(x));
.d(" ");
.d(bottles(x));
.p(" of beer on the wall");
.d(numno(x));
.d(" ");
.d(bottles(x));
.p(" of beer");
.d("take ");
.d(itone(x));
.p(" down and pass it round");
.d(numno(x-1));
.d(" ");
.d(bottles(x-1));
.p(" of beer on the wall");.p("")}
drink'1+|!99

## Kotlin

fun main(args: Array<String>) {
for (i in 99.downTo(1)) {
println("$i bottles of beer on the wall") println("$i bottles of beer")
println("Take one down, pass it around")
}
println("No more bottles of beer on the wall!")
}

## Lambda Prolog

The signature file:

sig bottles.

type println      string -> o.
type round        int    -> o.
type bottles_song int    -> o.

The module file:

module bottles.

println Str :- print Str, print "\n".

round N :- M is N - 1,
NStr is int_to_string N,
MStr is int_to_string M,
BOB = " bottles of beer ",
Line1 is NStr ^ BOB ^ "on the wall",
Line2 is NStr ^ BOB,
Line3 is "take one down, pass it around",
Line4 is MStr ^ BOB ^ "on the wall",
println Line1,
println Line2,
println Line3,
println Line4.

bottles_song 0.
bottles_song N :- N > 0,
round N,
M is N - 1,
bottles_song M.

Then we produce the desired output by setting the system to solve for this goal:

[bottles] ?- bottles_song 99.

## Lambdatalk

{def beer
{lambda {:i}
{br}:i bottles of beer on the wall
{br}:i bottles of beer
{br}Take one down, pass it around
{br}{- :i 1} bottles of beer on the wall
{br}
}}

{S.map beer {S.serie 99 98 -1}}
...
{S.map beer {S.serie 2 1 -1}}
->
99 bottles of beer on the wall
99 bottles of beer
Take one down, pass it around
98 bottles of beer on the wall

98 bottles of beer on the wall
98 bottles of beer
Take one down, pass it around
97 bottles of beer on the wall
...

2 bottles of beer on the wall
2 bottles of beer
Take one down, pass it around
1 bottles of beer on the wall

1 bottles of beer on the wall
1 bottles of beer
Take one down, pass it around
0 bottles of beer on the wall

## Lang

$i = 99 until($i == 0) {
fn.println($i bottles of beer on the wall) fn.println($i bottles of beer)
fn.println(Take one down, pass it around)

$i -= 1 if($i > 0) {
fn.println($i bottles of beer) fn.println() }else { fn.println(No more bottles of beer on the wall) } } ## lang5 : ~ 2 compress "" join ; : verses(*) dup " bottles of beer on the wall\n" ~ . dup " bottles of beer\n" ~ . "Take one down, pass it around\n" . 1 - " bottles of beer on the wall\n\n" ~ . ; 99 iota 1 + reverse verses ## Lasso ### Simple loop local( beer = 99, song = '' ) while(#beer > 0) => { #song->append( #beer + ' bottles of beer on the wall\n' + #beer + ' bottles of beer\n' + 'Take one down, pass it around\n' + (#beer-1) + ' bottles of beer on the wall\n\n' ) #beer-- } #song ### Query Expression (with beer in 99 to 1 by -1 select #beer + ' bottles of beer on the wall' + #beer + ' bottles of beer\n' + 'Take one down, pass it around\n' + --#beer + ' bottles of beer on the wall\n' )->join('\n') ### Query Expression with Autocollect // this example adds an "s" to bottle until there is only 1 bottle left on the wall local(s = 's') with n in 99 to 1 by -1 do {^ #n + ' bottle' + #s + ' of beer on the wall,<br>' #n + ' bottle' + #s + ' of beer,<br>' #n = #n - 1 #s = (#n != 1 ? 's' | '') 'Take one down, pass it around,<br>' #n + ' bottle' + #s + ' of beer on the wall.<br><br>' ^} ## LaTeX ### Recursive \documentclass{minimal} \newcounter{beer} \newcommand{\verses}[1]{ \setcounter{beer}{#1} \par\noindent \arabic{beer} bottles of beer on the wall,\\ \arabic{beer} bottles of beer!\\ Take one down, pass it around---\\ \addtocounter{beer}{-1} \arabic{beer} bottles of beer on the wall!\\ \ifnum#1>0 \verses{\value{beer}} \fi } \begin{document} \verses{99} \end{document} ### Iterative The \loop macro is tail-recursive (Knuth 1984, page 219). Just for fun, this version uses Roman numerals. \documentclass{minimal} \newcounter{beer} \newcounter{showC} \newcommand{\verses}[1]{ \setcounter{beer}{#1} \loop \par\noindent \Roman{beer} bottles of beer on the wall,\\ \Roman{beer} bottles of beer!\\ Take one down, pass it around---\\ \addtocounter{beer}{-1} % Romans didn't know how to write zero ;-) \ifnum\value{beer}=0 ZERO \else\Roman{beer} \fi bottles of beer on the wall!\\ \ifnum\value{beer}>0 \repeat } \begin{document} \verses{99} \end{document} ### References • Knuth, Donald E. (1984). The TeXbook, Addison Wesley. ## LDPL DATA: bottles-in-the-wall is number plural is text PROCEDURE: store 99 in bottles-in-the-wall sub-procedure check-plural if bottles-in-the-wall is not equal to 1 then store "s" in plural else store "" in plural end if end sub-procedure while bottles-in-the-wall is greater than 0 do call sub-procedure check-plural display bottles-in-the-wall " bottle" plural " of beer on the wall," crlf display bottles-in-the-wall " bottle" plural " of beer." crlf display "Take one down, pass it around," crlf subtract 1 from bottles-in-the-wall in bottles-in-the-wall call sub-procedure check-plural if bottles-in-the-wall is greater than 0 then display bottles-in-the-wall " bottle" plural " of beer on the wall." crlf crlf else display "No bottles of beer on the wall." crlf end if repeat ## Lhogho to bottle :i if :i = 0 [output "|No more bottles of beer|] if :i = 1 [output "|One bottle of beer|] output word :i "| bottles of beer| end to it_one :n if :n = 1 [output "it][output "one] end to verse :i (print bottle :i "| on the wall,|) (print word bottle :i ".) (print "Take it_one :i "|down, pass it round|) (print bottle :i - 1 "| on the wall.|) print end to sing :i if :i = 0 [ print "|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.| stop ] verse :i sing :i - 1 end ;Using it: sing 99 ## Limbo implement Beer; include "sys.m"; include "draw.m"; sys: Sys; Beer : module { init : fn(ctxt : ref Draw->Context, args : list of string); }; init (ctxt: ref Draw->Context, args: list of string) { sys = load Sys Sys->PATH; beers := 99; for (; beers > 1; --beers) { sys->print("%d bottles of beer on the wall\n", beers); sys->print("%d bottles of beer\n", beers); sys->print("Take one down, pass it around,\n"); sys->print("%d bottles of beer on the wall\n\n", beers-1); }; sys->print("1 bottle of beer on the wall\n1 bottle of beer\n"); sys->print("Take it down, pass it around\nand nothing is left!\n\n"); } ## Lingo repeat with i = 99 down to 2 put i & " bottles of beer on the wall" put i & " bottles of beer" put "Take one down, pass it around" put (i-1) & " bottles of beer on the wall" put end repeat put "1 bottle of beer on the wall" put "1 bottle of beer" put "Take one down, pass it around" put "No more bottles of beer on the wall" put put "No more bottles of beer on the wall" put "No more bottles of beer" put "Go to the store and buy some more" put "99 bottles of beer on the wall" ## Lisp ## LLVM ## Logo to bottles :n if :n = 0 [output [No more bottles]] if :n = 1 [output [1 bottle]] output sentence :n "bottles end to verse :n print sentence bottles :n [of beer on the wall] print sentence bottles :n [of beer] print [Take one down, pass it around] print sentence bottles :n-1 [of beer on the wall] end for [n 99 1] [verse :n (print)] ## Logtalk :- object(bottles). :- initialization(sing(99)). sing(0) :- write('No more bottles of beer on the wall, no more bottles of beer.'), nl, write('Go to the store and buy some more, 99 bottles of beer on the wall.'), nl, nl. sing(N) :- N > 0, N2 is N -1, beers(N), write(' of beer on the wall, '), beers(N), write(' of beer.'), nl, write('Take one down and pass it around, '), beers(N2), write(' of beer on the wall.'), nl, nl, sing(N2). beers(0) :- write('no more bottles'). beers(1) :- write('1 bottle'). beers(N) :- N > 1, write(N), write(' bottles'). :- end_object. ## LOLCODE ## Lua local bottles = 99 local function plural (bottles) if bottles == 1 then return '' end return 's' end while bottles > 0 do print (bottles..' bottle'..plural(bottles)..' of beer on the wall') print (bottles..' bottle'..plural(bottles)..' of beer') print ('Take one down, pass it around') bottles = bottles - 1 print (bottles..' bottle'..plural(bottles)..' of beer on the wall') print () end With a numeric for-loop and string formatting: verse = [[%i bottle%s of beer on the wall %i bottle%s of beer Take one down, pass it around %i bottle%s of beer on the wall ]] function suffix(i) return i ~= 1 and 's' or '' end for i = 99, 1, -1 do print(verse:format(i, suffix(i), i, suffix(i), i-1, suffix(i-1))) end Using Lua relational operators and multiple return values: function bottles(i) local s = i == 1 and "1 bottle of beer" or i == 0 and "no more bottles of beer" or tostring(i) .. " bottles of beer" return s, s end for i = 99, 1, -1 do print( string.format("%s on the wall,\n%s,\ntake one down, pass it around,", bottles(i)), string.format("\n%s on the wall.\n", bottles(i-1)) ) end ## Lucid // Run luval with -s inside the lucid shell script // The print out is a list of lines. So the output is not separated by new lines, rather // by '[' and ']' -- I cant figure out how to do string concatenation with numbers in lucid. // beer(N) ^ bottle(N) ^ wall ^ beer(N) ^ bottle(N) ^ pass ^ beer(N-1) ^ bottle(N-1) ^ wall // should have worked but doesn't [%beer(N),bottle(N),wall,beer(N),bottle(N),pass,beer(N-1),bottle(N-1),wall%] where N = 100 fby N - 1; wall = if N > 0 then  On the wall ' else eod fi; pass = Take one down and pass it around.'; beer(A) = if A > 0 then A else No more' fi; bottle(A) = if A eq 1 then bottle of beer' else bottles of beer' fi; end ## NATURAL El código es de Chris Bednara DEFINE DATA LOCAL 01 #BOTTLES (I2) END-DEFINE * FOR #BOTTLES 99 TO 2 STEP -1 IF #BOTTLES < 98 WRITE #BOTTLES ' BOTTLES OF BEER ON THE WALL' WRITE ' ' END-IF * WRITE #BOTTLES ' BOTTLES OF BEER ON THE WALL' WRITE #BOTTLES ' BOTTLES OF BEER' WRITE 'TAKE ONE DOWN, PASS IT AROUND' END-FOR * WRITE '1 BOTTLE OF BEER ON THE WALL' WRITE ' ' WRITE '1 BOTTLE OF BEER ON THE WALL' WRITE '1 BOTTLE OF BEER' WRITE 'TAKE IT DOWN, PASS IT AROUND' WRITE 'NO MORE BOTTLES OF BEER ON THE WALL' WRITE ' ' WRITE 'NO MORE BOTTLES OF BEER ON THE WALL' WRITE 'NO MORE BOTTLES OF BEER' WRITE 'GO TO THE STORE AND BUY SOME MORE' WRITE '99 BOTTLES OF BEER' END WRITE 'TAKE ONE DOWN, PASS IT AROUND' * END ## M4 define(BOTTLES', bottles of beer')dnl define(BOTTLE', bottle of beer')dnl define(WALL', on the wall')dnl define(TAKE', take one down, pass it around')dnl define(NINETEEN', $1 ifelse($1',1',BOTTLE,BOTTLES) WALL$1 ifelse($1',1',BOTTLE,BOTTLES) ifelse($1',0',,TAKE')
ifelse($1',0',,NINETEEN(eval($1-1))')')dnl
NINETEEN(99)

## MACRO-11

;
;          99 BOTTLES OF BEER
;          WRITTEN  BY:  BILL GUNSHANNON
;

.MCALL  .PRINT .EXIT
.RADIX  10

MESG1:
CNUM1:     .ASCII  "  "
.ASCII  " BOTTLES OF BEER ON THE WALL, "
CNUM2:     .ASCII  "  "
.ASCII  " BOTTLES OF BEER."<13><10>
.ASCII  "TAKE ONE DOWN AND PASS IT AROUND, "
CNUM3:     .ASCII  "  "
.ASCIZ  " BOTTLES OF BEER ON THE WALL."<13><10><10>

MESG2:     .ASCII  " 2 BOTTLES OF BEER ON THE WALL, "
.ASCII  " 2 BOTTLES OF BEER."<13><10>
.ASCII  "TAKE ONE DOWN AND PASS IT AROUND, "
.ASCIZ  " 1 BOTTLE OF BEER ON THE WALL."<13><10><10>

MESG3:     .ASCII  " 1 BOTTLE OF BEER ON THE WALL, "
.ASCII  " 1 BOTTLE OF BEER."<13><10>
.ASCII  "TAKE ONE DOWN AND PASS IT AROUND, "
.ASCIZ  "NO MORE BOTTLES OF BEER ON THE WALL."<13><10><10>

MESG4:     .ASCII  "NO MORE BOTTLES OF BEER ON THE WALL, "
.ASCII  "NO MORE BOTTLES OF BEER."<13><10>
.ASCII  "GO TO THE STORE AND BUY SOME MORE, "
.ASCIZ  "99 BOTTLES OF BEER ON THE WALL."<13><10><10>

.EVEN

COUNT1:    .WORD   99      ;  STARTING NUMBER OF BOTTLES
PV:        .WORD   10.,1,  ;  POSITION VALUES FOR 2 DIGITS

START:
MOV     COUNT1, R0
MOV     R0, R5
DEC     R5
AGAIN:

MOV     #CNUM1, R1

;       CONVERT NUMBER OF BOTTLES TO ASCII FOR THE FIRST FIELD

MOV     R0,-(SP)
MOV     R1,-(SP)
MOV     R2,-(SP)
MOV     R3,-(SP)
MOV     R4,-(SP)
MOV     R5,-(SP)

MOV     #PV, R3
MOV     #2, R2
A1$: MOV #-1,R4 A2$:       INC     R4
SUB     (R3), R0
BCC     A2$ADD (R3)+, R0 ADD #48, R4 MOVB R4, (R1)+ A21$:      SOB     R2, A1$; REMOVE LEADING ZERO - JUST LOOKS BETTER THAT WAY MOV #CNUM1, R1 CMPB (R1), #48 BNE CONT1 MOVB #32, (R1) CONT1: MOV #CNUM2, R0 ; MOVE THE ASCII NUMBER TO FIELD TWO RATHER THAN COMPUTING IT AGAIN MOVB (R1)+, (R0)+ MOVB (R1), (R0) MOV R5, R0 MOV #CNUM3, R1 ; CONVERT NUMBER OF BOTTLES TO ASCII FOR THE THIRD FIELD MOV #PV, R3 MOV #2, R2 B1$:       MOV     #-1,R4
B2$: INC R4 SUB (R3), R0 BCC B2$
ADD     (R3)+, R0
ADD     #48, R4
MOVB    R4, (R1)+
B21$: SOB R2, B1$

;   REMOVE LEADING ZERO - JUST LOOKS BETTER THAT WAY

MOV     #CNUM3, R1
CMPB    (R1), #48
BNE     CONT2
MOVB    #32, (R1)
CONT2:

MOV     (SP)+,R5
MOV     (SP)+,R4
MOV     (SP)+,R3
MOV     (SP)+,R2
MOV     (SP)+,R1
MOV     (SP)+,R0

;       HANDLE SPECIAL GRAMMER CASES

CMP     R0, #2
BNE     ONE
.PRINT  #MESG2
BR      DONE
ONE:       CMP     R0, #1
BNE     GREATER
.PRINT  #MESG3
BR      DONE
GREATER:
.PRINT  #MESG1

DONE:

;        DECREMENT THE COUNT AND START AGAIN

MOV     R5, R0
DEC     R5
TST     R0
BNE     AGAIN

;    OUT OF BEER, SEND THEM TO THE STORE

.PRINT  #MESG4

;   CLEAN UP AND GO BACK TO KMON

.EXIT

.END     START

## MAD

            NORMAL MODE IS INTEGER

BOTLES = 99
VERSE       WALL.(BOTLES)
BOTL.(BOTLES)
PRINT FORMAT TKDWN
BOTLES = BOTLES - 1
WALL.(BOTLES)
PRINT FORMAT EMPTY
WHENEVER BOTLES .G. 0, TRANSFER TO VERSE

INTERNAL FUNCTION(B)
ENTRY TO BOTL.
WHENEVER B .E. 1
PRINT FORMAT ONEBTL
OTHERWISE
PRINT FORMAT BBTL,B
END OF CONDITIONAL
FUNCTION RETURN
END OF FUNCTION

INTERNAL FUNCTION(B)
ENTRY TO WALL.
WHENEVER B .E. 0
PRINT FORMAT NOMORE
OR WHENEVER B .E. 1
PRINT FORMAT ONEOTW
OTHERWISE
PRINT FORMAT BBOTW,B
END OF CONDITIONAL
FUNCTION RETURN
END OF FUNCTION

VECTOR VALUES BBOTW  = $I2,S1,27HBOTTLES OF BEER ON THE WALL*$
VECTOR VALUES BBTL   = $I2,S1,15HBOTTLES OF BEER*$
VECTOR VALUES TKDWN  = $32HTAKE ONE DOWN AND PASS IT AROUND*$
VECTOR VALUES ONEOTW = $S1,29H 1 BOTTLE OF BEER ON THE WALL*$
VECTOR VALUES ONEBTL = $S1,17H 1 BOTTLE OF BEER*$
VECTOR VALUES NOMORE = $35HNO MORE BOTTLES OF BEER ON THE WALL*$
VECTOR VALUES EMPTY  = $*$
END OF PROGRAM

## make

### BSD make

Library: jot
Works with: BSD make
START = 99
UP != jot - 2 expr $(START) - 1 1 0-bottles-of-beer: 1-bottle-of-beer @echo No more bottles of beer on the wall! 1-bottle-of-beer: 2-bottles-of-beer @echo One last bottle of beer on the wall! @echo @echo One last bottle of beer on the wall, @echo One last bottle of beer, @echo Take it down, pass it around. .for COUNT in$(UP)
ONE_MORE != expr 1 + $(COUNT)$(COUNT)-bottles-of-beer: $(ONE_MORE)-bottles-of-beer @echo$(COUNT) bottles of beer on the wall!
@echo
@echo $(COUNT) bottles of beer on the wall, @echo$(COUNT) bottles of beer,
@echo Take one down, pass it around.
.endfor

$(START)-bottles-of-beer: @echo$(START) bottles of beer on the wall,
@echo $(START) bottles of beer. @echo Take one down, pass it around. Usage: make or make START=99 ### GNU make Works with: GNU make version 3.81 PRED=expr$* - 1

1-bottles: 1-beer pass
@echo "No more bottles of beer on the wall"

%-bottles: %-beer pass
@echo "$(PRED) bottles of beer on the wall\n" @-$(MAKE) $(PRED)-bottles 1-beer: @echo "One bottle of beer on the wall, One bottle of beer" %-beer: @echo "$* bottles of beer on the wall, $* bottles of beer" pass: @echo "Take one down and pass it around," Usage: make 99-bottles This will fork 99 make processes. You might need to raise your process limit (ulimit -p). ### GNU make ##### Without using a shell command to decrement the counter Works with: GNU make version 3.81 digits:=9 8 7 6 5 4 3 2 1 0 numbers:=$(foreach x,$(filter-out 0,$(digits)),$(foreach y,$(digits),$x$y))
numbers+=$(digits) bottles=bottle$(if $(findstring /1/,$@),,s)
num=$(if$(findstring /0/,$@),$(empty),$(@F)) action=$(if $(findstring /0/,$@),$(buy),$(pass))

beer:=of beer
wall:=on the wall
empty:=No more
pass:=Take one down and pass it around.
buy:=Go to the store and buy some more.

# Function to generate targets for each verse of the song.
define verse
.PHONY: $1$1: verse/$1/$1 prelude/$2/$2 $2 .PHONY:$1-bottles
$1-bottles:$1

most?=$1 endef # Recursive function that loops through the 100 numbers. define verses $$(eval$$(call verse,$$(word 1,1),$$(word 2,$1)))
$$(if$$(word 2,$1),$$(eval$$(call verses,$$(filter-out$$(word 1,$1),$1)))) endef # Generate the targets for the 100 numbers.$(eval $(call verses,$(numbers)))

# Main lines in the verse.
.PHONY: verse/%
verse/%:
@echo "$(num)$(bottles) $(beer)$(wall)."
@echo "$(num)$(bottles) $(beer)." @echo "$(action)"

# Last line of a verse, which is a prelude to the next verse.
.PHONY: prelude/%
prelude/%:
@echo "$(num)$(bottles) $(beer)$(wall)."
@echo ""

# Special target for the last line of the song.
.PHONY: prelude/
prelude/:
@echo "$(most)$(bottles) $(beer)$(wall)!"
@echo ""

Usage: make or make N-bottles or make N

A version of this script with more comments and an automated test can be found on github.com.

## Malbolge

Long version (a real loop version made by Hisashi Iizawa):

b';$9!=IlXFiVwwvtPO0)pon%IHGFDV|dd@Q=+^:('&Y$#m!1S|.QOO=v('98$65aCB}0i.Tw+QPU'7qK#I20jiDVgG S(bt<%@#!7~|4{y1xv.us+rp(om%lj"ig}fd"cxuz]rwvYnslkTonPfOjiKgJeG]\EC_X]@[Z<R;VU7S6QP2N1LK-I ,GF(D'BA#?>7~;:9y16w43s10)p-,l*#(i&%e#d!~{tyxZpuXsrTTongOkdMhgHd]ba_^W@[ZYXW9UNSRQPOHMLK J-++FE''<A$?>=<;:387xw43s10/(-&m*)('&}${d!~}|^zyxwvutmVqpiRQlkjiKafedc\E_^@\[ZYX;V9NMRQ42NG LK.IH*F?DCBA$#>7~;{{8xx5uu2rr/oo,ll)ii&f|e"!aw{z\r[vXnmVTpongPkNihgJ_dcFaB^]\UZ=RWV8TSLQ4O
N0LE.IHA)E>'BA:?!7~5|38y6/v321q).-&m*)i'&%|{d!~}_{zs\wvutsUqTonPlOjiKgJedFbE_A]@[Z<X;VU7S6Q
P22GL/JIB+FEDC%;@?>7~;:987w5v32r0)p-,+k)('~g$#"b~w|uz]xwvutsrqTinQlOjLhgfeH]bECB]\>ZSXWVUTS RQPON1LE.I,+*((&&$$""~~||zzxxv4u210/(-n+l)(i&gddy~}u^]\ZvutVlUjSQQOOdMKgfeG]F[DBB@@>><<:VU T6L5JO200EJ-HG*E>'B%9>=<|4{2y05v321r).o,mlj(igg|#d!~}uz]x[ZotWUUjoRmlkNibKJIGGEEZ_B]\?Z=XW PU876442NM/KD-B+))''%%##!!}}{{yyw5v32s0q.-&+l)j'hff{"caav{^yxwZutslUpSnQOOdiLgfHHcbaY^A\?Z= ;;PU8SRQ4ONMLEJ-,+))''%%##!=<;{3z1xvvttrrppnnll#j!&g#d!b}|{zyr[vYtsrTjShQfkNihgJedcbaY^A\? Z=;WV9TSRQPOHM0K.-++)ED&B;9"~<;:z2y0wuussqqoom+ljj!&%dzcx}{zy\wvutsrqjSnQPNNLhgIedG\EZCA] \[=S<Q:886644220L/JIHA*)(&&@?!=6}4{yywwuus10/o'n%lj('&f|ezcaa__]][wvuWmVkTRnQlkNLLaJIHFbE_ B]@U>Y<;P9775533H1/KJ,HA*?(&&$$">=<|4{2ywwu321q)p'nl*k('gg${"c~a^z]xwvYtmrUpSRPlOMMbKIGGEE
Z_^]?U>S<::8866442200.JIH*@)>C&A@?"=<5|{8y65vtt10/(-n+lk"'&%e{dyb^^\\ZvutVlUjSQmlkMcLaJHHF
bECCX]\[=S<Q:886R5PON1LKJCH+F)(=BA@"8!6}{{2y0543s+r)pnnlljjhhffddbb|_zyx[vutslUTSQQOOMihgI_
H]FDDBB@@>><XWV8N7L5331MLK-C,A*(D'BA$""=<;:927xwvt2s0/p-n+*)('~%f#dcaa__]y\ZZotsrTjShQOkjiKa J_HFFDDBB@@>><X;99NS6QPO2MLKJIHA*E('%%:#8=~;:9z7654321*/p-,m*k(hh}$#dyb}{zy[qZoXVVTTRnmlNdM
bKIIGGEECCAA?[>YXWP9T76K42200.JI+G@)>'%A@?!7~5|zzx654t,s*qo-n+*jj!h%fec!b}|{^s\[vYWWlqTonQlO
jchKfIHFFDDB^]\>T=R;P9NS6QPO2MLE.-,*FED&<%:#!!}}{{yyw543s+r)pnnl*kii~%f#"caa|{zsx[ZutVrkTinQ
lkNiLgfe^cFEDYBW\[=YR;P977553O200EJIH*@)>C&$$9>!<;|9z7654-tsrppnnll#('&f|ezca}|{]s\qZXtsrTjS hQOOMihgI_H]FDDB^A\[><<WVUTSLQ43NM/KD-BG*ED'B%@?>=<5:{zy0wuussqqoommki'hff{"c~}{t]\wvuWmVk pSnmPNNcLKfIGG\aD_^A\?T=<;99775QPO1G0E.,HG)E>'<%#?"~~5:98x0w.ussq/pnn%*k('hff#z!ba|{z\r[puXs rUpSnglONihgI_H]FDDYBW\[Z<R;P977553311//--++))'CBA#9"7<}:9z7x54-t1rq(ommkkiiggeecca}|{]s\qZX tsrTjShQOkjiKaJ_HFFDDB^A\[==XWVOT7R542N1LKJ-HGF?D'B%""7~5|zzxxv43s1*q(ommk)jhh}e"!~a|{zyr[ vYXVVTTRRPPNNLLJJHH]FD_A]V?TY<WVU8SRQPOHM0K.-++))''%%#?"~~5:9y70w.us1r/.-n+*)('~%fedbbwu^\ xwvXnWlUSSQQOOMMKKIIGGEa_AW@UZ=XW:U8SRQPONG0/.C,*FED&<%:#!!}}{{yywwuussqqo-n+*k(!h%f#"!awu ^\\ZZoXVrqpRhQfOMMKgfeG]F[DBB@\[Z<R;P97S6QP22GL/J-,*F)DCB%:?"!~||zz1x/432r*q(ommkkiiggeeccaa _{^yx[vYtmVqTSQQOOMMKKIeHFF[_A]V?T=;;9977553O2MLK.IHAF)('%%##!=~||3876v.u,sq/pnn%*)(h~g|ecc aa__]][[YuXsrUSSnmleNMhgfH^G\aD_^A\?ZYXQ:98M644220LK-IB+@)''%%#?>=}5|3zxxv4u21r/p-,+*#(i&g# c!~av_t][[YutsUkTiRPPNNLLJJHHFFDDB^A\[Z=XWVUTM6Q43HM0..CH+FE''BA@?>=6;|9z765u-t+0q.-,m*)('&% |#dcbuzy[wpYnWUUSonmOeNcLJJHHFFDDBB@\?ZY<W:UTSRQPOH1L/.,,**(D'%%:?>=}5|3zxxvvttrrppn,m*)ii &%#"!~}v{^y\wvuWmVkpSnmlOjihgfedc\aD_BAV[Z<XQ:OT7RQPI2M0/--++)EDC%;9"~~||zz1xvv-trrppn,m*) (!hg#c!xav_]yxwYoXmVTTRRPPNjihJI^GEECCAA??=Y<::OT7RQ4O2G0K.-BGFE'=&;9"7<}:98y6/4ut10/o'n% *kii~%f#"c~a|{t]x[ZXXVrqpRhQfOMMKKIIGGEECCA]@[Z<<WVUNS6Q431M0KJI,GFE>C&%""7~|:9y70w.us10/o' n%ljjhhffddb~a|{^\\wvutmVUTRnQlkNiLgfed]FE_A]V?TY<WV977RQPONMF/.I,**?D'BA?"=<;:981x5vussq/ .-m%l#jh&%dzcxa_{zy[qZoXVrqpRhQfOMMKgJHH]baBXAV?=Y<WV88SRQPONMFK.I,+)E(CBA?>=<;:927x5vuss qqo-,+k#j!hffddbb^^s\qZXXVVTpSQQfkNihgIHcbaCYBW\?==RW:UT755J321FK.IH+F)>'B%9"~~||zzxxvvt 210p(o&mkki'&%e{dyb^z]xwvYtmrUTSQmlkMcLaJHdcbDZCXA?[><<QVUT6L5J31MLK-C,A*((&&$$""~<}:9zxx5
4-tsrp.o,+l)j'&}f#d!~}_u^s\ZZXXVrqpRhQfOMihJf_H]FDDB^]\>T=R;99775Q4ON00KJIBG*E('%A$?>=~;:927 xwvttr0/.n,m$)('g}f{"c~}{^yxwvoXsVUSShQOkjLhaJ_HFbaBXAV?=YX:VO8M644220L/JI++FEDCB;@#>!<;:z
2y05v321r/.-,+$)j'hgeeccaa__]][wZXXmVkTiRPPNjMhgfIdcba_XA@?==;;9977L5J31MLK-C,A*((&BA@"8!6} {{y765u-t+rppn,m*)j'h%$#"!~}v{^y\[YutsUkTiRPPNNLhgfH^G\ECCAA??==;;9UTS5K4IN1LKJC,G*)''%%#?>=
}5|3zxxvvttrrppnnl*k('gg|e"c~a__ty\wvuXmVUTinmlNdMbKIedFb[DYB@\?==RWVU7M6K42N1LK.,,G@E('&$@# >=~;|927xw4uss*/.n,%l#(i&%f#d!~w{^][[YYWWlUjonmOeNcLJJHHFFDDB^A\[==XWVOT7R542N1LKJ-HGF?D'&% :?"=<}:3z7xwuussqqo-,+k#j!h}fddb~}_{t]r[YYWWUqpoQgPeNLLJJHHFFDDBB@@>Z=XWV9N7R54I2GLKJ,B+@)'' %%#?>=}5|3zx654t,s*qoommkkiig%f#"bb}v{^y\wvuWmVkpSnmlOjchKJIGGEaD_^A\?ZYR;V986RQP2H1F/--++)) ''%%##!=~;:zz765.3t1rq(-,+k#j!&g$#"c~}|uz]x[ZXtsrTjShQOOMMKKIIGGEECCAA?[><<QV9TSR5PONMF/.-+G
FE'=&;$""~~||zzxxvvttrrp.o,+ljj'&%$#z!ba|_]]rwZutWrUponmlejMLKIIGGEECCX]\[=S<Q:8TSR4J3H1F/DI
,GF)D'BA@?>=6}|9zxx/432r*q(o&mk)j'&g$e"!~}|{zsx[vYXVVTponPfOdMbKIIGG\ECCAA??=YXW9O8MR5PONG0K .I,**?D'BA@9"=~}4{yywwuussqqoommkki'h%$ddyb}_ty\ZZotsrTjShmPkjiLaJIHFbaBXAV?==;;9977553311
//-IHG)?(=B%@?"=~;49z7x543s+r)pnnl*)(h~g|ec!buzyxZpYnWUqpoQgPeNLLJJHHFFDC^]??ZYR;V986R5PO
N1LKD-,+))''%%##!=<;{3z1xvvttrrppn,mkk"'&f${dy~a|{^\\wvunsVUpSQQfkNihKfIdcb[C^A\[Z<R;PUT6RQ 4I2GL/JIH+FEDC<%@#"~~|:98x0w.ussqqoommkkiigge#"!awuz]xwYYtsrqpinQlOjMKKeHcbaD_^]\[TY<;:O86 R5PO2MF/J-,A*((&BA@"8!6}{{yywwu3trr).-,l$k"igge#dbbw|{z\r[pYWsVqpRRgPkNMKgJedcF[D_B]\>ZS<QV9
TS55POH1L/J-++@E(CBA$?>7~;|{y76v4-t+rp.-,l$k"iggeecca}{z\\wvunsVqTonPleNchKfedGbaY^A@?==;W
VU7M6K42N1//DIHG)?(=&$$""~~||zzxxv4u21rpp-,+*#ji&geez!b}|_z]xwvunWrUpSQQfkjiKaJ_HFbE_AA\[ZY XQV9T764P3NML/JIHGF?D'&%##!=<;{3z1x/v-2s0/p-n+*)('&}f#d!buz][[pYnsrqSiRgPNNLLJfedF\EZCA]\[ =S<Q:886644220L/JI++FEDCBA@9>!<}:{yy05v321r/.-,+*)"'hge"!b{zyxwvutmVqToRPlkNihgfedcb[DCBW @>><<::8TSR4J3H1//--++))''%A@?!7~5:{87x5.u2s0/o-&m)j'&ff{"c~a|_]]rwZutsVkpSnQPeNchgfH^G\ECC AA??==;;997S6QPO2MF/J-,A*((&&$$""~~||zzxx/4u210q.-&+l)jig%$d"ybw|_zyx[vunsVUTRnmlNdMbKIIGGEa B^W@U><<::88664PON0F/DI,GF)D'BA@9"=~}4{yy0wuus10/o'n%ljjh&%$dzcxa__]][wvXtmVkTRRPPNjMhgIIdc
baZ_B]@[ZY;Q:OT7RQP3NMLKDI,+FED&<%:#!=<|:3z1xvvttrrppnnlljjh&g$#d!b}|{zyr[vYXVrqpRhQfOMMKKII GGEECCAA??=Y<WV88SRQPONGL/J-HGF(>'<A$?>=~;:9876/4utsq/pnn%*)i'~g|ec!b}|_z]xwvutsrkToRQOkjiKa
J_HFFDDBB@\?==RWV8TM6K42NML.D-B+))'C&A@""=<;:9876/4u2s0/o-&m$)j'&%f#"!~}|{zsx[vuXsVqSShmlOdM hKJ_HFFDDBB@\[Z<R;P977553311//--++)E(CBA:#"!6}{{yyww.us10/o'n%ljjhhf$#"bxav_]yxwYoXmVTTRRPPN
NLhKfeHFF[DC^]\>T=RW:UT7R5J32M0KJ-++F?D'&A@">7~5:{87xvv32+rq.omm$)j'&g$e"!xa|_^\xwYunWlUSonm
OeNcLJJHHFFDDBB@@>Z=XW99TSRKP3N10.J-HGF)DCB;@#"!6}{{y765u-t+rppn,+*j"i~geeccaa__]][wZutWUUpo
nmfONihgI_H]bE_B]@[ZYXQ:9T755JO200E.CHGF(>'<A$?>!<}:9876/4utsq/.-m%l#jhhf$#c!xav_]][[YuXsrU
pSnmlkjchKJIGGEa_AW@U><<::8TS5QJ3H1/KJI+A*?(&&$@#>=~||9876543,1rq.-m+$k"'h%$e"c~}|{zyxqvYXs VTTinmlNdMbgJedGbE_^]\[ZYR;:9775QPO1M0EJ-HG*E>'B%$9"~~||zzxxvvttrrppn,m*)ii~%f#d!buz]xwvY
nsVqTSQQOkjiKaJ_HFFDDBB@@>><<::886R5PON1LE.-H+))>'<A@?!7~5|z8y65v3t10).onmkkiiggeec!~}_u^s\Z
ZXXVrqSohQfOMMKKIeHcbEC^]V[>Y<;P977553311//--++)EDC%;$9"7~5:{876w432+rqpnn%lj('g%|ezcaa__]y \wvYtWrqpohmPkNMKKIIGGEECCAA??==;W:88MR5PON1LKJIHA*)(=&$$">!<;|zz765432+0qpo&+*)i!h}fd"!~v_ t][[YutsUkTiRPPNNLLJJHdGbaD_B]\[ZYXQV9T76KP3NM//JIHGFED=&A#8=~||3876v.u,1r/.-n+*)('&%|edcx} |^zs\qZXXVrqSohQfkNihKf_HGF[_^@V?TY<::OT7RQ4OH10K.IH+F)>'B%@#!=<}4{z765u-t+r).o,+l)j'~%fedb ~a__ty\wvYtWrkpSRQfkNLLafIdcFaD_^W@?Z=;;PU8SR533NMLEJ-,G*((=B%@?"=~;:927xw43s10q(-,+k#j!hffd db~}_{t]r[YYWWUUSSQQOkNihKfIdcbaZCBA?[><<QVU7SL5J311//--++))''%%#?"=<}{{87654-2srqo-n+*k(i&% #"y~a|_^sxwYunWlUSSQQOkjiKaJ_HFFDDBB@@>><<:V9TSR5PONMLKD-,+@)>C&$$9>!<;|92yx543s+r)p'n%lj(i &%f#zc~au^\\ZZXXVVTTRRPPNNLLafIdcbEZ_B]@?=Y<::OT7RQP3HM0K.-BG*((=B%@?>!<5|{z1xvvt2sqq(-,+k# j!hffddbb^^\\ZvuWslUjoRmlOMMhgeHGbECCX]@[Z=X;VUNS6Q4O200EJ-++@E(CBA$?>=6}:{8yww.3t10pp-,+
*#(i&g$eccx}{zy\wvutmrUpSnQOOdiLJJ_dGbaC^]\[ZS<W:U866KP3NM//JIHGFE>C&A$?"~~5:{876w43210/(-
n+l)jhh}$eccx}{zy\wvutsrqjSnQlOMMbgJedFFa_^]\[ZSX;V9T755JO2MLK.IHGFEDCB;@#"!6}{{y765u3t+0q .-n+$k(i&geez!buz]xwvYnWrUpSQQfkNihJJe^cFaD_B@@UZ=XWV9TMR5P3200..,,**((&&$$""~<;:z2y0w.3t1 0/p-,%l)jiggeecca}|{]s\qZXXVVTponPfOdMKgfeG]F[DBB@@>><<:V9TS55PONGL/J-H+))>C&A@?"=<;49zy6w43 tr*qp-n+*kii~ge"ca}|_t]x[vuWslUjoRmlNNibgJeHcFDDY^A\[Z=XQV9T76K4INML.D-B+))''%%##!!}}{9z765 v32+rqp'nllj('&f|ezca}|{]s\qZXtsrTjShmPkjMKKfed]bEDCA]@[Z=X;VUTMR5P320LKJ,B+@)''%%##!!}}{{yy wwu321q)p',m*)(i&%#zc~a|{]yr[pYWsVqpohQlOjMKKI^cbDYBW\?ZYX;PU8S653311//--+GFE'=&;""~~|:9 y70w.ussqqo-n+*)j!&ge"!~v{zyx[voXWrUpoRmPkdMhKJHdGEEZ_^]?U>S<:VUT6L5J311//--++))''%A?>~~; :38y6wvt2s0/.o,+)j'hgeeccaa_{zy[qZoXmVTTRRPPeNLLJJHdGbaC^]\U>=X;VU86L5P32GLKJ,B+@)''%%##!= ~||3876v.u,sqqo-,+k#j!&g#ccx}{^y\ZZotWrqpShmPkNMKKedFb[DYB@@>><<::88664PON0F/D-BG*EDC&A:# "!}}{{yyw543s+r)p'n%*k('h%f#"y~a|_^\\ZZXXmrqpRhQfOMiLJJ_dcEaZCXA?[ZY;Q:O8664PO1MF/DI,GFE(CBA :#"=~||38y65v3,srq(-n+*k(i~%f#dcaav_t][wvuWmVkTRRPPNNLLJJHHFFDCAAV[>YXW:UN7R542N1//D-BG*((= B%@?>!<;49z7x5vtt+r).-,lk"'h%#d!~w|_z]\ZZoXVrqSohQfOMMKgfeG]F[DBB@@>ZYX:P9N75QPO1G0E.,,**( (&B%@?!!<;:3z7xwu3t10/p-,+kj'h%ecc~}|{ty\wZutVrkTinQlkMMhgfed]FaD_B@@UZ=XWV9TSRQPI21LKJ,B+ @)''%%##!!}}{{yyw5v32sqq.-,+*)"'hg#"bxav{^yx[vYtsrqpohmPONchKII^cFaC^W@?Z=;;PU8SR5PI2M0/D- ++)EDC%;9"~~||z876v.u,sqqoommk)j'&ff{d!ba_{^yxwZoXWVkTinmlNdMbgJedGbEY^A@?=YXW9O8M6442NM/K D-B+))''%A?>!<}:38y6wv-21q/(o&mk)(h&}f{dbb^^\\ZZXXVVTpSnmOOjihafIdGFDC^]\?ZYXQV9T7R533HM LK-C,AF)DCB%@?>=6}|{2ywwuuss*q(om+*)i!h}fddbb^^\\ZvYtsVTTonmlkdiLKJHdGbaD_B]\[ZYRW:U87L5J3 H1/KJI+A*?D'BA@9"!<}{{2765u-t+0q.-n+l#jih}f{dy~a|{^y\qZuXWlUjonmOeNcLJfIdcbEY^A\?><<::88664 PON0F/D-++))'CB@9"7~||zzx6w432s0).onmk)(h&}f{db~}|^t]r[YYWWUUSSQQOOMMKgJHH]bE_B]@[ZS<W:977 L53ON0LE.C,**((&B%@?>!<;:38y6w432r*/.-,m*)('~gf#d!~a|_zyxwpYXWUqpoQgPeNLLJJHHFFDDBB@@UZ=XW:U 8SRQPOHM0/.,HG)E>'<%#?"~~5:98x0w.ussq/p-,m*k('&%{"c~au^\\qZotWrqSSnmlkjibKfIdcbDZCX]@[ZY<W VUTSRK4O21//--++)E(&&;@?!=6}4{yywwuussq/p-,+kjiggeec!~}_u^s\ZZXtsUqjShQOkNihKII^cFEDY^]\>T= RW:UT7R5JO21L/JI,G*E>'&A?>!<}:3z7xwu321q)p'nlljjhhffddbb^zyxZpYnsVqpRRmlejMhKfIGG\aD_^]@[ ZSX;:977553311//--++)E(&&;@?>~6}49z76w4u210)po,mkk"'h%ecc~}|{ty\[vuWslUjoRmlOjMhgfe^cFaDCXA ?[><<Q:O8MRQP2H1F/--++))''%%##!!};|987x54321*qp-n+*ki!hgfd"!~|_ty\wvYtmVqTSQmPkjiLafIHG\ECC AA??==RWVU7M6K42NML.D-B+))'CBA#9"7~||zzxxvvttr0q.-nll)"ih%fddy~a|{^y\wpYXWUUSonmOeNcLJJHHFba BXAV?==;;997S6QP311LKDI,+*(D'BA?"=<5:{z7x54uss0/.'n+l)jh&%f#"!xa{z\xqZotWrqTRRmlkjchKJeHF F[C^]@[>YXWVOT7R542200..,HGF(>'<%:#8!}}{987w/v-2sqq(-n+*)j'&%#zcb}{z]x[vutsrqjoRQlOjiLgJe dcbaY^A@?=YXW9O8M6K4I20L/--BGFE'=&;@#>=~;|9876543,s0qpnnlljjhhffddbb|_]]rwZutVVqponmlkjchK fIdcbDZCX]@[ZY<WVUTSRQPIN1L/.,HGF(>'<%:#!!}}{{2ywwuussq/pnn%*k('&}f#d!buz]xwvoXsVUjonPlkNc LafedF\EZCAA??==;;997SRQ3I2G0..,H+FED'<%#!!};:9y1x/vttrrppnnlljjh&g#dbb}v{^]\ZvYtsVqTohmPO NchgIe^G\EC_^]?U>SX;VU8S6QPI210..,,*FED&<%:#!!}}{{yywwu3t10qoo,+*#(ihge#d!~a|_zyxqvYtWVTTinm OkdMbKIedFbaDY^]\>T=R;997SR4PI2G0..,HG)E>'<A?>~~;:981x5vus1r/.-n+*)(!hge"!b{zyxwpuXsVqTR nmPkjihgeHcFaB^W@UZ=XW99TSRQPOH1L/J-++@E(CBA?>=<;:3zy654t,s*/p-,m*#jih}#"b~av{^yx[voXWVT TRRPPNNLhgfH^G\ECCA]\[=S<QV9TS644IN10K.,,AF)DC&A9>!~;|98y6w4-ts0q.-n+l)"i&gfd"!~v_t]r[pYWs VqpoRmlejMLKIIGGEECCAA??==;W:88MRQP2H1FK.IH+F)DCB;?"!6;|zz16w43ss0/.-&+l)j'hff{"c~}|_zyxwpu XWVTpSQQfOdMbgfeG]F[DBB@@>><<::88664P311FKJI+A*?D'BA?"=<;:92yx54t2+r).o,+l)"i&gfd"!~|_ty\w vuXmrUTShQOOMMKKIIGGEECCAA?[ZY;Q:OT7RQ4O2MF/.-B+@EDC%;9>!<;|9z76/4uts*qoommkki'&f{dyb|{]y r[pYWsVqpSnQlkdiLKJ_dcbDZCXA??==;;99775QPO1G0E.,,*F)''<A@?!7~5|z8y65vtt10/(onmk)j'&ge"!~w_ zyxZpYnWUUSonmOeNcLJfedF\EZCXA??=Y<WV977RQPOHM0/J-++@E(CB%@#>=<;49zyxvvttrrp.-,lk"iggeeccaa __]][wvuWmVkpSnmPkNihgfe^GbEDYBW\[Z<R;P97S6QPO2MLKJIHAF)D'&$$""~~||z876v.u,sqqoom+*j(!h}fddb
b|_zyx[vutsrqjoRQlOMMbgfeG]F[C^]@[T=<WV8TS6K4IN1LK.IB+*)'CBA#9"7~||zzx654t,s*qoommkkiigge#
d!~a__t]\wvXtmVkpSnmPkNcLKJHHFFD_^@V?T=;WVU7M6K42200..,,**(D'BA$""=6;|{zx6w43t1r/(-nmljjhhf fd"caav{zy[qZoXVrqpRhQfOMMKgJHH]baBXAV?=Y<WV977RQJ321/K.IH+F)DC<%@#"7~||zzxxvvtt+0qoo&+l)(' h%$#z!b}_]][[YYWWUqTRRglkMibKIGcFa_B]\[TY<W:9N7L533HMLK-C,A*((&&$$""~~||zzx6wuu,1r/.nn+*) (!h%f#"!awuz]xwvYtsrqjSRQOkjiKaJ_H]F[DBB@@>Z=XW:U8SRQPOHM0/.,,**((&&@?>~6}4{yyw5vtt+0/.n&m kiig%#cybw|_]]rwZutWrUponmlkdMhgJeHcEEZ_^AV?Z=XW9UN7LQ422GL/JIHA*E('%%##!!}}{987w/v-trrppn nlljjh&g#ccx}{^yxZvoXmrUponQfkNMLaJHHFbaBXAV?==;WVU7M6K4220L/--BGFE'=&;@#>=~;|92y6wvttrrp .-,l*k"'h%#d!~w|_^yxZvoXmrUSShmPkjMhKfed]FaD_^]?U>S<::8866442200..,H+FE''BA@?8=~;|{y7x543t1 0/.',m*kjh&geez!b}|{t]\wZXXmrqpRhQfOdMKgfeG]F[DBB@\[Z<R;P977553311//-I,**?D'BA""7~}:98x0w.3 t10q.o&m*kjhhf#"bxav_]][[YYWWUUSSQmPkjLLgeHcFaDBBW\?ZYX;VOT7R54I2GLKJ,B+@)''%A""7<;:z2y0w uus1r/.-n+*#jihfe"!b{zyrwZYXmrUSShmlkMcLaJHHFFDDBB@\?==RW:UT7R5PONGL/J-,**(DCB:#8!};:9y1 x/vttrrppnnlljjh&geez!b}|^^yxwvoXsVqpoQgPejMhgfIdcbaZCB]@[Z=;;VUTSRKP3N1LK-IB+@E(CB$$?>=<;:3
z7x5vtt+0q.-,m*)('&%|e"!b}{]]rwvYnWVUSSQQOOMihJf_H]bE_B]V?Z=<Q:8T755JON0LE.C,*F)DC%%:?"=~;
:9y1x/4u210q(-nml#jh&g$#dbb}|uz]\wvuWmVkpSnmPkNihafIdGFDDBB@\?==R;PUTS5K4I200.JIH*@)>'%%##!= <|:3z1xvvttr0q.-mm*)(!h%f#"!awuz]xwvYtsrkTSRPPNNLhgfH^G\ECCAA??==;;997S6QP311LKJIBG*)DCB$:#
8=~;:{8y6543,1rqp'nl*)i'~g|ec!~}_u^s\ZZXXVVTTRRPPNNLhKfeHcFa_^]V?>Y<WV97M6542NML.J-BG*ED'B;
$?"!}}{{y76v43t+0/o-&m$kiig%fddy~}_{t]rwZutVVkpSnQPNjMhgfI^cFECAAV[ZY;Q:OT755JO2ML/J-HA*)D'
BA$""=<5:{8y654t,10/.o,+$)jihffddbb^^\\ZZXXVrqpRhQfkNLLafIdcFaD_^]V?>YXW9O8M6442200.JIH*@)
>'%A$?>!}}:98705vutr0q.-n+l)('&}$e"cbw^zyxZpYnWUUSonmOeNcLJJHdcEaZCXA??==;W:UT66QPONMF/J-HG
F(>'<A$?>=~;:9870w4ut+0/o-&m$kiiggeeccaa__]yxwYoXmrUponQlkjihgeHcFECCX]@>>SX;VUT7RQPONMFK.I
,+@E(&&;@?>~6}49zxx/4u210)p-n+ljj!&g$#"yb}_t][wvuWmVkTRRPPNNLLJJHHFFDDB^A\[Z=R;:97SRQ3I2G0. .,,**((&&;$">=};4{2yw5v32s0q.',m*k('g%|ezcaa__]][[YYWWUUSSQmPNNchKfeGGbaZC^A\[Z<R;PU8SRQ4ONG
0/JIH*@)>'%%:?>=}5|3zx654t,s*qo-n+*k(i&%${"cb}|{]s\qZXXmrqSohQfkNihKfIdcb[CBAV?=YXW9O8MR5PO 200KJIHA*)(=B%@?"=~;:981xwvt210p(o&+l)(i&}f#dcaa__]][[pYWWUqpRngPeNLLJfedF\EZCAA??==R;9U8SRQ 4IN10/--++)E(CB%##>7~}|3876v.u,sqqoommkkiig%$#cybw|_zy\wZunWVUSoRPPejiKgI^GEECCAA??=YXW9O8M
64P3NM0..IHAF)('%A$?>!<}:927x5vussqqoom+*j(!h}fddb~}|^t]r[pYnWUqTonPPkjibKfIdcbDZCX]@[ZY<WVU N7653ONM/K.CH+FE(C&A@?>7<}|{yywwu321q)p'nlljjhhf$#"bxav_]][wZXXmrqpRhQfOMMKgJedGbE_^]\U>=X;
VU86L5P32GL/JIHA*E('<%:#8=~;:9z16wvus10p.-n%*)i'~g|ecca}^^sxwYunWlUSoRmlOjMhaJIHFbaBXAV?==
;WV8TM6K4220LKJ,B+@)''%%##!!};|98yww43,1rq.omm$)j'&g$e"!x}{^yxwYoXmVTTRRPlkjLbKIGcbaCYBW@>
><<::88664P3NM//JIHA*E(C&$$9>!<;:{876/vutrrppn,m*)jhh%#"y~a_tyxwYoXmVTTRnmlNdMbKIIGGEECCA] @[Z=X;VUTSLQ4O21//-IHG)?(=&@?>~6}4{yywwuussqqo-n+*jj'&%#zc~a^z]xwvYtsrqpiRmPkjiKaJ_HFF[DY B@\[=YR;PU8SRQJ321/K.,,AFED&<%:#!!}}{{yywwuussq/p-,mkk"'hgfd"c~}{^sx[ZYWsrqSiRgPNNLLJJHHFFD _^@V?T=;;9U8SR5P3NMLKJC,+*((&&$$""~~5:9y70w.3t10q.o,+*)('~%fe"caav_ty\ZZotWrqToRmlkjihafIdG
F[DBB@@U><XWV8N7L53311//--++))'C&$$9>!<;:{8765432+rqpnnl*)(h~g|eccaa__]][[YutsUkTinQlkNibKJe HFF[C^]@[T=X;:88M64PON0F/D-++))''%%##!!};|98xx/4u2s0qoo&+l)('h}edcx}|^zy\qvYtsVqTohQlOjMKK eHcbDD_^W\?Z=X;99NS6QPO2MLEJ-,G*((=BA#?8!6;|98y6w432+r/p-nll#(i&%ee"!~}v{^y\wZXXmrUponQlkji bgJIdGbaD_B]\[ZYR;VU8S6Q332MLKJIB+F)D'%%:?"=<||987654-2s0q.omm)j'&%f#"!~}|uz]x[vYWWlqpoQgPe NLLJJHHFFDDBB@@>><X;VUTM65PON0F/D-+GFE'=&;">=};4{2ywwuussqqoommk)('g}f{"c~}{^s\wZYWsrTpiRg lOjiKKf_dGbECAAV[>YXW:UNS65P311FKJ,HA*?D'BA?"=<5|9z7xvv-2s0/oo,+*#(i&geccx}{zy\wvunsVUpS QQfkjiKaJ_dGbaD_B]\[ZS<W:U866KP3NM//JIHGF?D'B%@#!!6;|987x54321*/po,+*j"i~ge#"b~wu^\\ZZXXVVT TRRPPNNLhKfeHcFa_^]\U>Y<W:88MR5PO11LKJIHGF?D'B%@#!!6;|987x543210/(-nm*kii~%fddybw|{z\r[puXs rUpiRmPOMMbgfHd]F[DBB@\[Z<R;P977553311//--++)E(CBA9"!~5|zzxxvv-21q/(o&mkkiiggeeccaa_{^yx[YY tmrUTonmOeNchKfeHcFaZ_B]@[><<QVUT6L5JO2MLK.IHA*)(&BA@"8!6}{{yywwuussqqoommk)j'&gee"!~w|_^y\Z ZotWrqToRmlkdiLgJIGGEa_AW@U><<::8866442200.JIH*@)>C&A@?"=<;:3z7xwuussqqoommkk"iggeec!buzy xZpYnsVqpoRmlkjibgJIH]FDDY^]\>T=R;9977553311//--++)EDC%;9>!<;|9z765432+rq.o,+l)j'&%#"!x}_ ^s\ZZXXVVkTRRPlkMibKIGGEECCAA??=Y<::OT7RQ4O2MLKJIHGF?(CB%@#>~~5:9z1x5vussqqoommk)('g}f{dbb ^^\\ZvYWWlqTonmfONiLgfIdG\aDC^A\[>Y<QV9875QPO1G0E.,,**((&&$$""~~||z876v.u,1r/.o,m*#j'h%fddy
~a__t]r[puXsrqTonglONiLJJ_dGEEZ_B]\?Z=XWVO8S6Q422GL/--BG*EDC&A@?>7<}|{yywwuussqqoom+ljj!h}$e "!b}{zyxwpYtWrUSShmPNNchKfedGba_^]V[>=<:VUT6L5J311//-IHG)?(=&$$""~~||z8yww.321q)p',m*)j'h% #"!~}v_z]x[YYnsVTTinQlkjMhgfedcbaZ_BA@U>S<QVUT6L5JO2ML/JC,G*)>'%%:?>=}5|3zxxv4uss*/.n,%l#jh hffddbb^^\x[YYnsVqpoRgPONLLJfedF\EZCAA?[Z<XQ:O86644220L/JI,**E>C&%@#!!6;|98y6w4-2sr/.-m%l# jhhffddbb^^\\ZZXXmrUSShmlkMcLafIdcFaD_^W@?><<::88664422G0..,,*F)''<A@?!7~5:{87x5v321*/p-n+ ljj!&%dzcxav_ty\wvuXsrqpiRQlOMMbgJHH]bE_B]@[ZYXWPU8S65331MLK-C,A*(DCB:#8!}}{{yywwuussq/p- ,+l)('&%{dc~a__ty\ZZotWrqToRmlkjihgeHcFECCXAV[ZY;Q:OT755JO2MLK.IHGFEDCB;#>!}}49z76w4-ts0q oo&+l)(i&g|#d!ba__]][[YYWWUUSSQQOkNLLafedF\EZ_B]\[>YR;:U8SR5P3NMFK.I,+@)''%%:?>=}5|3zxxvvttr rppnnllj('&f|ez!b}|{^yxwpYtWVkTinQlkjcLKfIGG\aDBBW\?ZY<W:OT7R542200EJIH*@)>'%%##!!}}{{yywwu3 21q)p',m*)(i&}fe"caav{^\\qvYtsVqTonglOjMLJJHHFFDDB^]?[T=R;997755331MLK-C,A*(D'BA@#>=<5|{8yww .3trr).o,+l)j'&%{"cba__]yxwYoXmVTponPfOdMKKIIGGEECCA]@[Z=;;VUTSRQJO210.J-HG*E(CBA@?>7<}:{zx xv43s1*q(om+*)i!h}fddbb^^\\ZZXXVrUponQlkjihgf_HGFD_A]V?T=;;9UTS5K4I200..,,**((&&@#>=~;4{ z7xvv-2s0/p-&m*kjhhffddbb^^s\ZZXXVrUSShmlkMcLafIdcbEZ_BA\[Z<R;P977553311//--++))'C&$$9"7<} :9z7x5.u2s0qoo&+ljj!&g$#"c~}v{^]xwvXnWlUSonmOeNcLJJHHFFDDBB@@>><<:V9TS6Q4ONMF/J-H+))>C&$$9>! <;:{8765.3tsr)pnn%*)(h~g|#dbbw|_zy\wZutsrqjSnQlOMMbgJHH]bE_^A\[ZYXWPU87644220LKJ,B+@)''<%## !!}}{{yy05v32s0)p-nmkki'&f{dyb|{]yx[putVrkTiRPlkMibKIGGEECCAA??=Y<WVU8M6Q4311//--B+)ED&B; 9"~~||zzxxv432r*q(-n+*)j'~%fedbbuzyxZpYnWUUSSQQOOMMKKIIGcbaCYBW\?ZY<W:UTM65P3NM0K.IHG@E(' &@#!!6;:9y1x/vttrrppnnlljjhhffd"c~}{^yxwvoXsVqTRRglOMMbgJedcFa_^]V[>=XWV8N7L53ONM/K.CHGF( >'<A?>!<}:98765.u2s0qoo&+ljj!&g#"c~}|{zyxqvYtWrqpRhQfkNihgIdGF[DBBW\[=YR;P977553311//--+G FE'=&;@#>=<}4{8yxvvttrrppn,+*j"i~ge#"!awu^s\qZXtWrqpSnglONMKKIIGGEECCAA??==;WV8TM6KP311FK.I H+F)DC<%?"=<}:{876/4ut10/o'n%ljjhhffddbb^^sx[vuXsVqpongPkNiLJJ_dGEEZ_B]\[>YXWVUNS65P311FK .,,AF)DC&A?>=<;:3z7x5vtt+0qoo&+l)('h%#"!~}v{^y\[YYnWUUSonPleNcLJJHdGbaYB]@[ZY;Q:O866K4IN1 LKJC,+F)''<A""7~5:98x0w.3t10qoo&+lk(igg|#d!~a|_ty\[ZXXVVkponPfOdMKKIIGGEECCAA??==;WVU7M6KP3 NM0K.IB+F)(&&@?!=6}4{yywwuussqqoom+*)i!h}e"!~a|{ty\[ZoXVVTTinQlkNiLgfe^GbECAAV[><<QV9TSR5 PONMFK.I,+))'CBA#9"7~|:98x0w.ussqqoommkki'h%dd!~}|{zsx[vYXVrUponQlkjihgeHcFECCAA??TYXW9O8M 6442200..,,**(DCB:#8!};|987x543210/(o,ml#jh&%e#zcxa__]][[YYWWUUSSQmlkMcLaJ_dGbaC^]\[ZYXWPU 8S6QP2NG0E.,H+FED=&%@#!!6;|zz16w43t1r)p-nmkkiiggeeccaa__]][wvuWmVkpSnmlOjchKJeHFF[CAAV[>YX; V9TSL5P3N1//DI,**?D'BA@#>=<5:{8yxvv-trrp.-m+k"igge#d!~{zyxwpuXsVqpoQgPejMhgfIdcbaY^A@[ZY ;Q:O86R533HML.JC,A*((&&$$""~~||zzx654t,s*/p-,m*k('&%$#zc~a^^\\ZvuWslUjSQQOOMMKKIIGGEaDBBW\? ZYX;VUTSRQPIN10/D-++))>C&A@#>!<;:98765.u2srp.-,l$k"iggeeccaa__]][[YutsUkTinQlkjcLgJI^cbDYBW
@>Z=XWV9NS6Q4311F/--+GF(D=&;$">=<|4{2ywwuussqqo-n+*)j'~g$e"!a}v_t][[YutsUkTiRPPNNLLJJHH]FDDB
B@\?ZYX;VUNS6Q4311FKJI+A*?(&&$$""~~||zzxxvvt2sqq(-n+*)j'&%|ed!b}|_z]xwvunsVqTSQQOOMMKgJHH]ba C_^AV[Z<XQ:O866442200..,H+FED'BA@?>7~}:{87x5v3210/.',ml)('g}f{dbb^^\\ZZXXVVTponPfOdiLgfIdG ba_^]\U>Y<W:88MR533H1FK.IHG*EDCBA@?>7<}:9z7x5uu,10q(onmki'&%e{dyb^^\\ZvutVlUjSQQOOMMKKIe HFF[C^]@[T=X;VUT6L5J31M0..C,AFED&<%:?"~~5:{876w.utsqq(ommkkii~%#cybw^^\\ZZXXVVTpSnmPkNibg JeHGEECCAA?[Z<XQ:O866442200..,HGF(>'<A?>=~;:3zy6wuu,1rpp',m*)j'h%#z!b}{zy[qZoXVrqpRhQfOMM KKIIGGEECCAA??=Y<WVU8SRQPI21L/--BG*((=B%@?"=~;:98705v3tsqqo-,+k#j!hf#"bxav_]][[YYWWUUSSQmPk jiLgfedcb[DC^A??TY<::OT7RQ4O2MLKJIHG@E(C&A@?!7~5|z876v4u,10/o'n%*k('&g#"!~}|{t]\[pYWsrqSoRg lOjiLgIdGFDDBB@@>><<::O866442N1//DIHG)?(=B%@?>!6;|9zyww.3trr).-,lk"ig%#cybw^^\\ZZXXVVTTR RPlOMMbgJedcFaZCBAV?TY<WV9T7RQJO2M0/--++)ED&B;9"~<;:z2y0wuussqqoo&mkk"'h%#d!~}v_^y\wvYWmVU pSQQfkNLLafIdcFaDY^A@?==;;997SRQ3I2G0..,,**(D'%%:#8=~||3876v.u,1r/.o,m*#jihffddbb^zyxZpYnW UqpoQgPeNcLaJHdGbaD_B]\UZ=X;VUT6L5J31MLK-C,A*((&&$$""~~||zzxxv4u210q.-,%lk(igg|#dbbw|_zy\wZu
tsrkpSnQPNjihJI^GEaDBBW\[=YR;P9775QPO1G0E.,,**((&&$$">!<;:{87654-ts0qoo&+ljj!&g#d!b}|{zyxq vYtWVkTRRPPNNcLafedF\EZCAA??==;;997755331M0KJIB+*EDC%;9"~<}{{2y0543s+r).omm)j'&gezc~a^^\ \ZZXtsrTjShQOOMMKKIIGGEaD_^]@[TY<;:8866442NM/KD-B+))''%%##!!};:z81x/4u21r/p-,%l)j'hff{"caav{ ^yxwZutslqToRQOOdihgI_H]FDDBB@@>><<::88664P311FK.IHG*EDCB;#>!<;|9z76543,1rq.o,+lj"i&g#"b~a v{^yxwpYXWUqpoQgPeNLLJJHHFFDDBB@@>><X;99NS6QP3N1F/.-++))''<%#?>~<5|3zxxvvttrrp.-,lk"'h%e"c ~w|_^][[putsUkTiRPlkjLbKIGcbDYBW@>><<::8866442N1//DI,GF)D'BA:#"!}}{{yy0wu32r0)p'nlljjhhffd "!~v_ty\wvYtWrqpinQPkjiKaJ_HFbECCXAV[ZY;Q:OT755JO2ML/J-HGFE>'&%##!!}}{{yyww.ussqqo-nll#('&f |ez!b}|_z]xwvutmrUTSQQOkjLhaJ_HFbaC_^AV[Z<XQ:O86RQP2H1F/--++))''%A?>!<}:98765.ut10p.'n%*kii ~g|#d!~a|_zyxwvutmrUpoRmPkMMbgfI^GFEC_^]?U>S<::8866442200..,H+FE(C<%@#"7~5:98x0w.us10/o'n%lj jh&%e#zcxa__]][[YYWWUqpoQgPejMhgfI^GFEC_B@@UZ=XW:U8SLQ4O21F/--BG*((=BA@"8!6;|987x54-ts0qoo&+ ljj!&g#d!b}|{ty\wZYWWUUSSQQOOMMKKIIGcbDYBW\?==RW:UTS6QPONG0/J-HG*E(CBA@?8=~;|987w5v-2s0/.' nmljj!&%dzcxa_{zy[qZoXVrqSohQfOMMKKIIGGEECCA]\[=S<QV9TS6Q4I2M0KJI+A*?(&&@?>~6}4{yyw543s+r) pnnlljjhhffd"c~}|_zsx[ZuXVVkpSQQfOdMbgJedGbE_XA\?Z=;;PU866KP3NML/JIHAF)D'&$$">=<|4{2ywwu321
q)p'nlljjhhff{"c~}|_zyxwpYtWVTTRRPPNNLLJJ_dcbDZCXA??==;;99775Q4ONM0KJIHG@E('BA@"8!6}{987w/v-
trrppnnlljjhhffddb~a|{^y\wvutsrkToRQOkNLLaJ_H]baBXAV?==;;9977553311//-I,GFE>'B%$""~~||z876v .u,sqqoommkkiig%f#"!bw|_z]\ZZoXVrqpRhQfOMMKKIIGGEECCAA?[><<QV9TSR5PI2M0/-IH*F?(=&$$""~~||zzx 6wuu,s*qoommk)j'&%f#"y~a_]yxwYoXmVTpSQQfkjLhaJ_HFFD_^@V?T=;;997755331M0KJ-H+FED=&A?"~~5:{ yy05v321r/.-,%*kji~geeccx}{z]x[vutsrkToRmPNNchKII^cFa_B]\[ZYXQV9TS6Q4O11FKJ-B+F)(&&$$">=<| 4{2yw543s+r)pnnlljjhhf$e"!~w_z][[puXVVkTinQlkNLLafIHcbDYBW\?ZY<W:OT7R5P311FKJ,HG*?D'BA@#>7
~;|{yywwuussqq(-,+k#j!hffddbb^^\x[vutWrqjoRmPOMihgI_H]FDDB^]\>T=R;9977553311//--BG*EDC&A@?
8!~}4{2ywwuus10p.'n%ljjhhffddbb^zyxZpYnsVqpSnQlkjibgJIdcbDZCXA?[><<Q:OTSR4J3HM0..CH+FE(C&A
@?>=6}|{yywwuussqqoo&mkkiig%fddy~}|^t]rwZutWrUponmlkdiLgJedFb[DYB@\[Z<R;P977553311//--++))'C
&A@?"=<;:9870wv32r0)p'nl*kii~%f#"c~w_^\\ZZXXVVTTRRPPNNLhKII^cbaCYBW\?ZY<W:OT7R54220LK-IB+@)
''%A@?!7~5|zzxxvvttr0q.-,m*#ji&geez!buz]xwZuXsrkpSnQPNjihJI^GEECCAA??==;;99775Q422GL/JIH+
FED=&A$#8!6;|9870wv3trr).omm$)j'&g$ez!b}_]]rwvuWmVkTRRPPNjihJI^GEECCAA??=Y<::OTSR4J3HM0KJI ,G@)(C&$$9>!}}49z76w4u21*/ponlljjh&geez!~}_u^s\ZvutVlUjSQQOOMMKKIeHcbECC^]\[TY<;:8T7RQ4O2MLK JCH+FE(C&A##8=<}4{8y65u3,10/.'nml#jhhff{"!~v_t][[YutsUkTiRPPNNLLJJHHFFDC^]@[>S<;V977LQ4ON1 //JCHGF)D&&;@#>=~;|92765vussq/.-m%l#jhhf#"bxav_]y\ZZoXW2qjiR.-e=)KgJ%^]F!~C}W@[ZY;WPbTSqK#m 2k}ih,gTF)bPO%:"K7I54zW7gvv-sr*N.'JI[6FE&fUeAR>P+u:9[[pYW3lkS/.QyON*bKJ%dcF!m_^W@>-<;W:sN6%4 ]n[MjEWz,GFd'&s#L]~6;|WW7UBeuc1qNpLJIk6FEgD1{zyQ=|*:([775WVrUSoAQ,Od*KJJ%HFF!!}}|?.Z=;QPtTq %4o31kj/WIyfSRbC<MLo\<|k{2V0fv-Qb=q.o&JH#G4~VBdy>P_;](x8vH5"3UpSh.fe=ib(J%7cF!2B{i.Z<wuPt 'qLQn"2~YK-hBG)ccC<NM]K7}|Y{i1U/Ad2sO/LoJIkZFEhfTA!~>+{]]88Y6XslT0B.zl,=<;(J%d]F!}BW@yyY+d tO8Mq5PINkjih-BTecQCaqp>J~5XzW165eR,bO/L^m8[6j'D%UBdc>}N^9x&vonF2qCSRmf>M*;J&8^]\n~}}@?[xY +:Pt8S6o]3l~Y..,,*@RQ Short version (a just printing out the lyrics version made by Johannes E. Schindelin): DCBA@?>!}}{{yywwuussqqL-,+*)('&%#c!a>v{z99wv5Ws3DpoA-lON*hg_dc#a~_^Az>Z<;;uUN7 R5nO2~L/JzHe@ED'N?\7<;:W87C54us1N.-nm*GF43gU#dRx=_N)sK&vo4Vrqji.z,Odvh'&e7Fb" DlkAVhZS+Q9(7M_o"110EhzgxFccbBNqLo\}}Y9z7gT4us1*/LKn87G(!&VeT/c?w|_M(xwY5XmVTjo QP-O*LLt9rHGF4C}k@@y-YXut(87p5oON1Li.zf*)?DaO%@^]~~5X9zh05eu?sO/.oJlHGi'~ff0z?? |{tL\[YYnWVkjihP,ON<L'r^]F!~_^|V>y,<utbNSR5Pn[kY|.h+eFccCs@?"!}|:WW7gT4t210/.o K+kkihWf|B"bx};tyK86uGWU~S|{g-edihK9_76o[~_X0?>yweW:sNSRo#31GLi.CB+*?u&Or@]]=~} {9zy6Setc1r/o-JII)jh~%B#dyb=|_tsxJZYnV2kSSRQ,k+<ugf_d]Fn~Y1|z[>x<Q:sT6%Qo"Nk/.-- fG))bPB__9\!Z}{ziy6BvtQsq)M',l7)(!3%f{/y-a<_)]\[Y5#WUDjRnz,Od)btfe^cb!3~1{@?=xvu cUr7p5oIl0FKJI,Gd)b';#?\[~}{3y705vuc+0q_L]Il#"i~Ce{A@?Pv{MyK7It3V1Co{-Pxjiu'_ G]"E3B1jV>-fwQtU7qL4]2HMLEW,gGdcbta$$]\~~5Y9W70vu@csONLnm8*)iX&De#@cxav_]]\qpYnW !~SinmPkMi(K&eHp"E~CA0\.Zf+:PsrqLK33N10.h,yGSEDPO$$98=mZ|XWD6S43cOqq_:,+lk(E&C|{ A!bav_]y'[vHnFrTjS.Q,+N)KK9edc#!~~^0V>gwvd)98rqp3mN1L|Jz+G@?(ar@9"!~5{{2hxwAdsr q<p-JJl#i'hDBd!-}{z\rJvYXW3T10R@,+N*;(f_76E4Z}^A{?g,wu)88Spp3nNGYKi-U+@(ua:" K7ZZY3EVxBedcbNq_:n+*ZiiWg|Tc!ba^tyK[6Y4F2qTi.Pfxj)LJs%q]Fn3}X]?zT,;;:9N7qQ]nN0 }KhIUedcu=&_:#][<H:XiyxTA-,Orq.K&8l)ih~}eezc~>=*:\\JI64WlTSS{Q?e=iLJJecF!D_X@?> y=vW9sTSRQ#ON0FKWgU+F)bC<$$?\\IYGWz7x5uut1*q;nKI*Z5'Wg${cb?}<;:y\qY6nmVUToQQ?k+i
KKs_$c5D~2}@/.>=+::9N&RQ#I!l}ihCHe*E''B_$9"!}HY{Eyx5.3ts0/_-KmlZY'EVCB/b~}^zLKq
voGm!qjRQQy,NLbKJ&Hc5EmB|{{?g<Xdu9N&RQ#32~LEWC,xS(D'&;M#>\<Z|{zVwTv@2srL:,+l)jF
~fUBd?Q=_^^L9qZons3qpo.@lewiKJ'ed#bE~CX{?>-x;utb7Mp$4"l1}i{,yG))Da:]"n<;{{EUx/ 4-QOrq;n,+*jjF3gBT"!Q,*)sKJv5XFr~TRnQ,xj<bJJ_qcEDm~k|/[Tw<ut(rS55J2!k0i{CHf))(' B_:]]=65:{W10T43c1*q_LnIl)F!h}|#dc>av^:yr[7onF31poh@lNdi;as%7cEE~BXA{UxY<:t8NSqQ 4n!1F..-,GFEDC&Nq?!7~Zk9WygTAt2baM.Kn8*kj'EV$eA.><ML[JZYWFlk0R.@f>*)ha'I7c#!!l
^A@.-x<dVO7764P3!1jE.,BTF)(&%%M">!}HkFiyxTS3Qbr<L-Km7)YX~%$Tz!~a<^]]9J%u5W31S0RQ lxdMuaIrH#\!!2^]zzTwXd:98rR5JmHkjjJIHfev(aNML!=<Y:9iyx/4@2rNponnI7ZYhhV$T/RxwvN
^99wZX4s2D}/AmlNMvh''eH]"!D~XA?hTf;W:s87p5PO!1LXJg+G*((a&#9K![l|zz7xv4-P1rN_K]m
*ZY'~ffezRbav*]9r[ZuGWUqj/A@l,NMu:'ed6#4~|]?UZfe::8s6p4JO21Lii-H**E'=&_^\~}ZYX
y7wv4uQbO/L-,mkkj'EV|B@!bw;^y\ZYoX"EqT/{mlxj*)gfrqG"[~~}{{y-x;ucUNS5^o3N~Li.-ff
*)cPa%@?Kn}}kX8ywv4uQb0/Ln,mlkjiEVUB@!bw;z99ZYYX"rqT/h-lxN*):'rqc"a~~^{{[-x;QcU
NS6^o3N~ki.,fA*)c'a%M^Kn6YkXVV6v4utO=<o-J\kH5'Wff#"?a}*)y8ZYY4V!qTB{m?ej*u:f_^6
En~~|{{ygYXuVtTM6Q3I!ZFKhzBeFcbt<;:?"[<l:zzUxwuts1rMM-,mlG"!~%$0@!b,v_]\rJZ55FrT }0RzPN*c)'98dc5"~_|A?U>=XW:UNSp4PI[l}KiCffwEbPBA^]>=Z}GFW105vuQr0/;:Klkj('h}${z!
~w+u]9xq%YX43q0o/Q,xNM)KfHG#5ECC|j\hZSeu)8TSp53nNGYihgB+*Eu'B%#9>7<Z|3EVwBetcbrq
_:9lHHiiDg|A/b>aO;^y[[I5t"2qpi.PlkjiLJseGpEaZ}^j\y>YvQ)UN7qQ]nN0}KJIUGFE(C&_:?>~
}5:9z7x/Rt21*q.^m+lZ"'EC$Adb~}<zy[qpo5sUk1oQg-Nd*hJ&G]\"BX|VUy<Rv9ONr5KJIm0Fj -Cg*@d'=<:98\}543W10T43s+Op(L&%Ij"!Ef|Bcyx>_u;sr8Yon4lkj0Qgf,dc)a_%]\"ZY}WVz=S RvV8Nr5Ko2HGkEi,Bf)?>=a$:^!76Z43Wx0T.-Q+Op(Lm%Ij"Fg}|Bzyx>_u;yrqp6Wml2pi/Pf,Mc)J
_%F\[!YX|?UTx;QPtNMqQ3Im0FEiIH*@d'=<#98\}54Xy1Uv.-Q+*N.n&Jk#"Fg}|{A!~=^ts9wp6
tm3Tjih.Oed*Ka'H^]#aCY}WVzZSRvPOs6Lp3Im0Fj-CBAe(>bB;:^!76Z432Vw/S3s+Op(Lm%Ij"F&f
|Bcy?}_ut:[q7Xnm3Tji/gfe+Lb(_%cE[!BX|\>TxX:PtTS5Ko2HGkEiCBf@d'=a$:^>~[54Xy10Tu- Qr*N.-m%Ij(!E}|B"!aw=^t:[qp6tVl2ji/Pf,dc)J&G]#DZ~XW{UTSwW9Os6LKJnNM/EiCBf)?>b%; :^!76Z{3Wx0Tu-Qr*No'K%$Hi!~De{z@aw=^ts9Zp6Wm3Tjih.Oed*hgI_%F\"CY}@VzZY;Qu8NMLp3I
m0FEiIBf)?>b<;_"8\<|43Wx0Tu-,+Op(Lm%I#G!~D|{z@aw=^t:xZpo5m3Tjih.lNd*hJ&G]#DZY}]
?Uy<RQuONr5KoImGFEi,Bf@?c=<@?!\}5Yz2V6v.Rs+O)(L&Jk#"Fg}C#"bx>vu;sr8Yo5Vlkj0Qg-N
d*Ka'H^]#DZY}@Vz=SRv9Os6LKoIHlFEi,BAe?>b<;_9]=65Yz21Uv.Rs+*N(L,l$#Gh~}Cdz@aw=^ts 9Zpon4rTj0Qg-kMc)a&G]\"ZYX|?UySRvPOs6Lp3ImGFEi,Bf@?>b%;_"87[;{X21Uv.Rs+O)M'&%Ij "!E}|B"bx>v<]s9wYo5sUkj0hg-Nd*hJ_%F\[!BX|VzZ<Rv9ONMqQ3IHlFEi,Bf@?c=<#98\<|4X81 0Tu-Qr*No'Kl$Hi!~D|{Abx>_u;\r8Yonm3Tji/Pfe+iKa&d]#DZY}]?UTxXQuOs6LpJIm0FEiCBf)?
>bB;_?!7[|43Wx0T.-Qr*No'&J$#"Fg}|B"bxw=ut:r8po5ml2poQg-kMc)J&d]#[Z~^]?zTSwQuOsS R4o2HlLK-Cg*@dD&<#98\<;{3Wx0/S3s+*N.nK%$H"!Ef|{Ayx>_u;\r8vXnm3kj0hg-Nd*hJ&G]#D
ZY}]VUy<RvVONr5KJn1GFj-CgA@d>=aA#9]~65Y32Vw/.R,+Op('K%$H"!Ef|Bcy?v<]s9Z7on4Ukj0 Qgf,jLb(I_%]\"CYX|VUySRv9ONMq4Jn1GFj-Cg*@?c&<;_"8\}54X21U/.R,P*)Mn&%IjGh~}Cdz@x> _ut:[q7Xn4Ukj0hg-ed*Ka'eG]#DZY}@Vz=SRv9ONr5KJnHGkK-Cg*@?>b<;_"87[|43W10/St,+OpM- m%Ij"F~D|{Abxw=^t:xZp6Wm3kj0Qgf,Mcb(I_^$E[Z~AW{>TSw:PtT6Lp3IHlLEiCg*@d'=aA#9]~65
Y9y10T4-Qr*No'&J*j"Fg}|Bcyx>vu;sr8pon4rTj0Qgf,dc)a&G]#[!BXW{UTx;QPt7Mq4JIHl/EiC
Bf)?>b%;:^87[|43Wx0/S-Qr*No'&Jk#G'g}|Bzy?v<]sr8Yon4Ukj0nPfe+Lb(_%F\"CY}]?UyY;v
POsMq4JnHGk.Dh+Ae(>=a$:9]76Z{32Vw/.R2r*No'Kl$H"!Ef|{Ayx>|^t:xZp6tVlk1oQ.fed*Ka'e
G]#DZY}@VUySw:PtT6LpJIHl/jDCg*@dD=a$:^!7[|43W10T.-Qr*)M'&Jk#"F~}C#cy?v<]s9Zpo5m lk1Rhg-ed*Ka&G]\"CY}WVz=SRvV8NrRKo2HGk.DCg*@?cC%;_"8\}543Wx0Tu-,P*)M-m%$Hi!E}|B
cy?=^zs9Zp6Wml2ji/gfe+Lba'_^$bD!YX|VUy<RvV8NrLKo2HGk.DCgA@d>=aA#9]~65Y9y1Uv.Rs+ Op(Lm%$H"!E}|Bcy?v<]sr8Yon4rqSi/Pf,jLb(feG$E[!_AW{UySRv9Os6LKoIm0Fj-CgG)d>=a$_9
87[|4X8x0T4t,P0p(Lm%$H"!E}|Bcy?v<]sr8Yon4rqSi/Pf,jLb(feG$E[!_AW{UySRv9Os6LKoIm0
Fj-CgG)d>=a$_987[|4X8x0T4t,P0/oLm%$Hi!E}|{Ay?v<zy[q7uWm3qSi/gfe+Lba'H^$E[Z~XW{> Tx;Qu8NMqQ3nHlFEi,BAe?>bB$:^!7[|43W10Tu-,Pq)Mn&%I#"!E%e{z@xw={]sr8po5Vlk1Rhg-kMc
)J_%cE[!YX|?Uy<RQu8NrLKo2HGk.DCgG)?cC<#98\65Yz2V6v.-Qr*)M'&Jk#G!~De{z@~v<]sr8
po5ml2ji/Pfe+Lb(I_^$E[Z~AWVz=SRvPt7MqQ3IHlFEi,Bf@?c&<;_?>~[;:3W10Tu-Qr*No'Kl$Hi!
~DeB"bx>_u;\rq7onm3qSih.fe+iKa&d]#DZY}@VUy<RvPtNMqKJIm0FEiCBf)?>bB;_"87[|43W7w/
.R,+Op('&J*j"Fg}Cdzy?wv<tsr8vXnWlk1oQgfe+iba_^$ba_AWVzZY;WVUTSRKJnNGFEDhHGFE'= aA:^!765Y9210T43,+*No-&Jk#"!E%${A!~|{zsr8po5srqpoQg-kjihgfH%cE[ZY}@\[ZYRvV8NMq4
POHGFEiCBfFE'C<@987[|43Wx0/.-Q10/.-,+kH('&%|{A!~wvu;yxwYonm3qSihgfe+iK(_^]\[Z~
AWVUTxXWPOsS5KJIHlLKJI+Ae(DC<@?>=<;{3210T43s1*)M-,l$#"!Ef$#"yx>|ut:[qpo5slkj0nm
lkjLb(fedcba_AWVUyYRQPt7MLKJnHGkKJ,BAeEDCBA@?!765Y9y10T.-,+*N.-,+*jG'&}|Bcy?}|{
zyxZpo5Vrqj0hgfed*Kgfe^$E[ZYX|VUTSwQPtT6LKJnNM/EiIHGFE>=<@?>=<;:98x0/.-Q10/o'&J *j"!~De#zyxwvu;yxwvutsUk1onPfedc)a&d]\[!B^WVz=SRvPONrRQJnHGkK-CBA@?cCBA#987[543 2V65432r*N.-,+*jG'~}C#cyxwv<]srq7uWml2Sihgf,jihJ'H^]\"CY}W{UTSRQuUTS5KJn1MLKDhBA @d'=aA@98\}54X210/S-,+O/('K%$H"!~D$#"b?v<tsrqp6tsUqj0nmlN+iKa'edF\[Z~^WVUyYXWVU TSRQJImMFEDCBfFE>=a$:98\<;{321U5.-Q10/o'&%$H(!~}|B"!~|ut:xwvutsUqji/mlkjiha'edc bDZ~^]?[TSRvV8NMqQPO1GkK-CBf@?cC<;_987[;:z2Vw/.R21*)Mn&%$H(h~}|Bc!~wv<zyr8vXnm3T
pi/mlNd*hgfedcbaC_^WVzZY;QPONr5Ko2HGFj-IHA@?cC<;:987[;:z810/.R2r*)M'&J*j"!~D$dzy xw=^tsrqp6Wm3kj0hgfe+ihgfedcEaY}@\Uy<RQPOsSLKo2HGFjJ,BA@?cC<;:9]=<;:z21U/.-Q1q) M'&%I)('g}|{A!~v<zyxwvX5srqSihgf,jiba'_^]#DZY}]?Uy<RvV8TMq4JIHGk.Dh+A@dDCB;_?>= <|43W70/.R,+Op(L,l$#"!E%$dAyx>vu;yr8vun4rk1oh.Oe+ihgfeG]\"ZYXW{[=SRvVUTS5KoO1GFE DhH*@?>=aA@?!=6543Wx0T4321q)(L,l*#"!E}|{z@~|ut:xwvXnm3qjih.fe+iKg&dcbDYX|\>TS RvV8NMq4POHGFEiIHG)?>=aA@?!765Y9210TuR210/.n&%$H"!~}C#z@~}v<t:xwvuWmlk1oQgfed*hJ
fed]#a_^]\>Tx;WVUNMqQPO1GFEDhH*@?c&<;:98\65Y921U54321*)Mn&%I)(h~}|{z@a}vuts9wYo
n4rqSihg-kjLhg&dcbaBXWVzZYXWPOs6LKJnNM/EDCg*@?cC<;_?!76Z:z870/S3s10/('K+k#"Fg%
|{A!~w=uts9wvXtmlkji/mlNdcba'e^]#aBXW{>ZYXQuUNrRKoOHGFjJCBfFED&B;:9]=654321U543
210/.-,+k#"!E}|{Ab~}|{t:xwvXn4lk1ongfe+Lha'edF\"C_XWVUyYRQPOsS5KJnHGkKJCBf)?>=aA
#?87[;{9810T43s1*)M-,+*)i!~D$dA!~}|^;yxwvutsrT1ohg-kMcb(_^]#DZ~AWVUTxRQPtTS5KJI HlFEi,BA@dD&B;_?>765Yz21U54t,+*N.-&%I)('&%$dz@~}|{z\9Zpon4lkj0nmOe+iKa'edcba_^@
VzZ<w:PONrRQPImM/EDhBA@dD=<#?>=<;432V65432r0/.'&J*j"!~}|{z@~}|^;y[qpo5srqS0Qmf,
jL)gf_^]#D_^]VUTxXQPtNMLpPIHGk.DhHGFE>bBA#9876Z:9810T43210/o'K+k#"!~D$#"!a}vut: xwvo5srqpih.Oedcba'Hd]\"BX|VUy<RvVUT6qQJIHlLEiI+A@?>=aA@"8\654X87w5.R21*N.-,+k# "F&%e{zyx>|{zsr8vXtslkji/Pfe+ihgI_^$E[Z~^]?UTxX:VUNMq4oONMLKJIHG)?>=aA@"876Z{3W7
w/.Rs1*)('&J*j"F&f|B"!~|ut:xZvonm3qji/mlkMc)gf_%cE[!_^]\[=SwWV8NMqQ3IHGkK-CBA@d
DCBA@">=<54X8x0T4321q)M-,+k#"F&f$#zyx>|{]s9wvonmlk1ongfedcb(feG]\[Z~^]?UyY;QuONr RQPO1GFEDh+A@dDCBA@98\65Y9y1Uv.-,+*N.-,%Ij(!~}C#zyxw=^zsrqp6nm3qpoQmlkd*Ka&G]\[ Z~^]\UyYX:VOs6qQJIm0k.DhHG)?cCBA#98\<|432V65.-Q+*No-&%I)('g}Cdzyxw=^zyxq7on4rTji h.ledcba'_^$o

## Maple

seq( printf( "%d %s of beer on the wall,\n%d %s of beer.\nTake one down, pass it around,\n%d %s of beer on the wall.\n\n",
i, if( i<>1, "bottles", "bottle" ),
i, if( i<>1, "bottles", "bottle" ),
i-1, if( i-1<>1, "bottles", "bottle") ),
i = 99..1, -1 );

## Mathematica / Wolfram Language

Bottle[n_] := ToString[n] <> If[n==1," bottle"," bottles"] <> " of beer"

BottleSong[n_] := Speak[
Bottle[n] <> " on the wall," <>
Bottle[n] <>
", take one down, pass it around," <>
Bottle[n-1] <> " on the wall."
]

BottleSong /@ Range[99,1,-1]

## MATLAB

function ninetyNineBottlesOfBeer()

disp( [ sprintf(['%d bottles of beer on the wall, %d bottles of beer.\n'...
'Take one down, pass it around...\n'],[(99:-1:2);(99:-1:2)])...
sprintf(['1 bottle of beer on the wall, 1 bottle of beer.\nTake'...
'one down, pass it around;\nNo more bottles of beer on the wall.']) ] );

%The end of this song makes me sad. The shelf should always have more
%beer...like college.

end

## Maxima

bottles(n) := for i from n thru 1 step -1 do (
printf(true, "~d bottle~p of beer on the wall~%", i, i),
printf(true, "~d bottle~p of beer~%", i, i),
printf(true, "Take one down, pass it around~%"),
printf(true, "~d bottle~p of beer on the wall~%", i - 1, i - 1),
disp(""))$bottles(3); /* 3 bottles of beer on the wall 3 bottles of beer Take one down, pass it around 2 bottles of beer on the wall 2 bottles of beer on the wall 2 bottles of beer Take one down, pass it around 1 bottle of beer on the wall 1 bottle of beer on the wall 1 bottle of beer Take one down, pass it around 0 bottles of beer on the wall */ ## MAXScript escapeEnable = true resetMaxFile #noPrompt viewport.setType #view_top max tool maximize viewport.SetRenderLevel #smoothhighlights delay = 1.6 a = text size:30 a.wirecolor = white theMod = extrude() addModifier a theMod for i in 99 to 1 by -1 do -- this will iterate through 99 times use the escape key to terminate. ( a.text = (i as string + " bottles of beer on the wall") redrawViews() sleep delay a.text = (i as string + " bottles of beer") redrawViews() sleep delay a.text = "Take one down, pass it around" redrawViews() sleep delay a.text = ((i-1) as string + " bottles of beer on the wall") redrawViews() sleep delay ) ### A one-line version Since MAXscript is an expression based language (everything returns a value), it is relatively easy to write long expressions that are only one line long. the following single-line snippet (broken for clarity on the webpage) produces a grammatically correct printout of the song. for i = 99 to 1 by -1 do (print (i as string + (if i == 1 then " bottle" else " bottles") + " of beer on the wall\n" + i as string +\ (if i == 1 then " bottle" else " bottles") + " of beer\nTake one down, pass it around\n" + (i - 1) as string + (if i - 1 == 1 then "\ bottle" else " bottles") + " of beer on the wall\n" + (if i - 1 == 0 then "\nno more beer" else ""))) ## MEL // Rosetta Code problem: https://rosettacode.org/wiki/99_bottles_of_beer // by Jjuanhdez, 10/2022 string$temp0[] , $temp1[] ,$text0 , $text1; string$theGrp = group -em;
for ($i = 99 ;$i > -1 ; $i--) {$text0 = string($i) + " bottles of beer on the wall, " + string($i) +" bottles of beer.";
$text1 = "Take one down and pass it around, " + string($i-1) +" bottles of beer on the wall.";
if ($i == 1) {$text0 = string($i) + " bottle of beer on the wall, " + string($i) +" bottle of beer.";
$text1 = "Take one down and pass it around, no more bottles of beer on the wall."; } if ($i == 0)
{
$text0 = "No more bottles of beer on the wall, no more bottles of beer. ";$text1 = "Go to the store and buy some more, 99 bottles of beer on the wall.";
}
$temp0 = textCurves -ch 0 -f "Times New Roman|h-13|w400|c0" -t ($text0);
$temp1 = textCurves -ch 0 -f "Times New Roman|h-13|w400|c0" -t ($text1);
setAttr ($temp0[0] + ".ty") (($i * 8) + 3);
setAttr ($temp1[0] + ".ty") ($i * 8);
parent $temp0[0]$theGrp ;
parent $temp1[0]$theGrp ;
}

## Mercury

% file: beer.m
% author:
%   Fergus Henderson <fjh@cs.mu.oz.au> Thursday 9th November 1995
% Re-written with new syntax standard library calls:
%   Paul Bone <paul@mercurylang.org> 2015-11-20
%
% This beer song is more idiomatic Mercury than the original, I feel bad
% saying that since Fergus is a founder of the language.

:- module beer.
:- interface.
:- import_module io.

:- pred main(io::di, io::uo) is det.

:- implementation.

:- import_module int.
:- import_module list.
:- import_module string.

main(!IO) :-
beer(99, !IO).

:- pred beer(int::in, io::di, io::uo) is det.

beer(N, !IO) :-
io.write_string(beer_stanza(N), !IO),
( N > 0 ->
io.nl(!IO),
beer(N - 1, !IO)
;
true
).

:- func beer_stanza(int) = string.

beer_stanza(N) = Stanza :-
( N = 0 ->
Stanza = "Go to the store and buy some more!\n"
;
NBottles = bottles_line(N),
N1Bottles = bottles_line(N - 1),
Stanza =
NBottles ++ " on the wall.\n" ++
NBottles ++ ".\n" ++
"Take one down, pass it around,\n" ++
N1Bottles ++ " on the wall.\n"
).

:- func bottles_line(int) = string.

bottles_line(N) =
( N = 0 ->
"No more bottles of beer"
; N = 1 ->
"1 bottle of beer"
;
string.format("%d bottles of beer", [i(N)])
).

## min

Works with: min version 0.19.3
(swap quote interpolate puts!) :line

(
(
("$1 bottles of beer on the wall" line) ("$1 bottles of beer" line)
(pop "Take one down, pass it around" puts!)
(pred dup "$1 bottles of beer on the wall" line newline) ) cleave ) :verse 99 'verse over times ## MiniScript Going for the simple/obvious solution here... bottles = function(n) if n == 0 then return "no bottles" if n == 1 then return "1 bottle" return n + " bottles" end function verse = function(n) print bottles(n) + " of beer on the wall" print bottles(n) + " of beer" print "Take one down, pass it around" print bottles(n-1) + " of beer on the wall" print end function for i in range(99, 1) verse i end for Output: 99 bottles of beer on the wall 99 bottles of beer Take one down, pass it around 98 bottles of beer on the wall 98 bottles of beer on the wall 98 bottles of beer Take one down, pass it around 97 bottles of beer on the wall ... 2 bottles of beer on the wall 2 bottles of beer Take one down, pass it around 1 bottle of beer on the wall 1 bottle of beer on the wall 1 bottle of beer Take one down, pass it around no bottles of beer on the wall ## MIPS Assembly ################################## # 99 bottles of beer on the wall # # MIPS Assembly targeting MARS # # By Keith Stellyes # # August 24, 2016 # ################################## #It is simple, a loop that goes as follows: #if accumulator is not 1: #PRINT INTEGER: accumulator #PRINT lyrica #PRINT INTEGER: accumulator #PRINT lyricb #PRINT INTEGER: accumulator #PRINT lyricc #DECREMENT accumulator #else: #PRINT FINAL LYRICS .data lyrica: .asciiz " bottles of beer on the wall, " lyricb: " bottles of beer.\nTake one down and pass it around, " lyricc: " bottles of beer on the wall. \n\n" #normally, I don't like going past 80 columns, but that was done here. # there's an argument to be had for breaking this up. I chose not to # for simpler instructions. final_lyrics: "1 bottle of beer on the wall, 1 bottle of beer.\nTake one down and pass it around, no more bottles of beer on the wall.\n\nNo more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall." .text #lw$a0,accumulator #load address of accumulator into $a0 (or is it getting val?) li$a1,99 #set the inital value of the counter to 99

loop:
###99
li $v0, 1 #specify print integer system service move$a0,$a1 syscall #print that integer ### bottles of beer on the wall, la$a0,lyrica
li $v0,4 syscall ###99 li$v0, 1 #specify print integer system service
move $a0,$a1
syscall #print that integer

### bottles of beer.\n Take one down and pass it around,
la $a0,lyricb li$v0,4
syscall

###99
li $v0, 1 #specify print integer system service move$a0,$a1 syscall #print that integer ### "bottles of beer on the wall. \n\n" la$a0,lyricc
li $v0,4 syscall #decrement counter, if at 1, print the final and exit. subi$a1,$a1,1 bne$a1,1,loop

### PRINT FINAL LYRIC, THEN TERMINATE.
final:  la $a0,final_lyrics li$v0,4
syscall

Write !,n," bottle",$Select(n=1:"",1:"s")," of beer." Write !,"Take one down, pass it around." Quit For ii=99:-1:0 Do beer(ii) ### Brain-damaging bottles set template1="i_n_""of beer on the wall. ""_i_n_"" of beer. """ set template2="""Take""_n2_""down, pass it around. """ set template3="j_n3_""of beer on the wall.""" for i=99:-1:1 do write ! hang 1 . set:i>1 n=" bottles ",n2=" one " set:i=1 n=" bottle ",n2=" it " . set n3=" bottle " set j=i-1 set:(j>1)!(j=0) n3=" bottles " set:j=0 j="No" . write @template1,@template2,@template3 repeat write "One more time!",! hang 5 goto bottles ## MyDef Compile with: mydef_page -mgeneral bottles.def It outputs bottles.txt, which contains the lyrics. bottles$(for:i in 99-1)
$(i) bottles of beer on the wall$(i) bottles of beer
Take one down, pass it around
$(set:i-=1)$(i) bottles of beer on the wall
NEWLINE

## N/t/roff

### Classical version (compatible with classical Bell Lab's TROFF)

Subroutine L1 calls upon itself recursively.

Works with: All TROFF
.nr BS 99 1
.de L1
.ie \\n(BS>1 \{ \
\\n(BS bottles of beer on the wall,
\\n(BS bottles of beer.\c
\}
.el \{ \
\\n(BS bottle of beer on the wall,
\\n(BS bottle of beer.\c
\}
Take one down, pass it around,
\\n-(BS bottles of beer on the wall.

.if \\n(BS>0 .L1
..
.nf
.L1
.fi

### New version (compatible only with GNU TROFF)

Instead of recursion, a while construct can be used instead, to achieve the same results. Technically, the program runs differently.

Works with: GNU TROFF version 1.22.2
.nr beers 99 1
.nf
.while \n[beers]>0 \{ \
.ie \n[beers]>1 \{ \
\n[beers] bottles of beer on the wall,
\n[beers] bottles of beer.\c
\} \" ie \n[beers]>1
.el \{ \
\n[beers] bottle of beer on the wall,
\n[beers] bottle of beer.\c
\} \" el
Take one down, pass it around,
\n-[beers] bottles of beer on the wall.
\} \" while \n[beers]>0
.fi

## Nanoquery

Translation of: Ursa
//
// 99 bottles of beer
//

for bottles in range(99, 1, -1)
bottlestr = ""

if bottles = 1
bottlestr = "bottle"
else
bottlestr = "bottles"
end if

println (bottles + " " + bottlestr + " of beer on the wall")
println (bottles + " " + bottlestr + " of beer")
println "Take one down, pass it around."

if !(bottles = 2)
println (bottles - 1 + " bottles of beer on the wall.\n")
else
println "1 bottle of beer on the wall.\n"
end if
end for

## NASL

bottles = 99;
repeat {
display(bottles, ' bottles of beer on the wall\n');
display(bottles, ' bottles of beer\n');
display('Take one down, pass it around\n');
display(--bottles, ' bottles of beer on the wall\n\n');
} until bottles < 1;

## Neko

/**
<doc>
<h3>Rosetta Code, 99 bottles of beer on the wall, in Neko</h3>

<pre>
Tectonics:
nekoc 99bottles.neko
neko 99bottles
</pre>
</doc>
**/

var message = " of beer on the wall\n";
var beers = 99;

var plural = function(n) {
return if (n == 1) " bottle" else " bottles";
}

var nonesome = function(n) {
return if (n > 0) n else "No more";
}

while (beers > 0) {
$print(nonesome(beers), plural(beers), message);$print(nonesome(beers), plural(beers), " of beer\n");
$print("Take one down, pass it around\n"); beers -= 1;$print(nonesome(beers), plural(beers), message);
if (beers > 0) $print("\n"); } Output: prompt$ nekoc 99bottles.neko
prompt$neko 99bottles | { head -n 4; echo "..."; tail -n 4; } 99 bottles of beer on the wall 99 bottles of beer Take one down, pass it around 98 bottles of beer on the wall ... 1 bottle of beer on the wall 1 bottle of beer Take one down, pass it around No more bottles of beer on the wall ## Nemerle using System; using System.Console; module Bottles { Sing(x : int, bev = "beer", surface = "wall") : void { match(x) { |0 => WriteLine($"No more bottles of $bev on the$surface, no more bottles of $bev"); WriteLine($"Go to the store and get some more $bev, 99 bottles of$bev on the $surface") |1 => WriteLine($"One bottle of $bev on the$surface, one bottle of $bev"); WriteLine($"Take it down, pass it around, no more bottles of $bev on the$surface")
|_ => WriteLine($"$x bottles of $bev on the$surface, $x bottles of$bev");
WriteLine($"Take one down and pass it around,$(x-1) bottles of $bev on the$surface")
}
}

Main() : void
{
foreach (i in [99, 98 .. 0])
Sing(i)
}
}

## NetRexx

beer = "bottles of beer on the wall"
removeOne = "Take one down, pass it arround,"
say 99 beer","
say 99 beer.subword(1,3)","
loop i = 98 to 2 by -1
say removeOne
say i beer"."
say
say i beer","
say i beer.subword(1,3)","
end
lastCall = "bottle" beer.delword(1,1)
say removeOne
say i lastCall"."
say
say i lastCall","
say i lastCall.subword(1,3)","
say removeOne
say "No more" beer

## Nial

line is fork [
0=, 'No more bottles of beer' first,
1=, 'One bottle of beer' first,
link [string,' bottles of beer' first]
]

verse is link [
line, ' on the wall, ' first,line,
'. Take it down and pass it around, ' first,
line (-1+),'on the wall. ' first
]

bottles is iterate (write verse) reverse count

## Night

null bottles(int x) {
if(x == 1) {
print("1 bottle of beer on the wall,\n");
print("1 bottle of beer,\n");
print("Take it down, pass it around,\n");
print("No more bottles of beer.\n");
}
else {
print(x);
print(" bottles of beer on the wall,\n");
print(x);
print(" bottles of beer,\n");
print("Take one down, pass it around,\n");
print(x - 1);
print(" bottles of beer on the wall,");
bottles(x-1);
}
}
bottles(1);

This code should work according to the docs, but due to a few bugs in the current implementation it doesn't.

## Nim

proc getBottleNumber(n: int): string =
case n
of 0:
result = "No more bottles"
of 1:
result = "1 bottle"
else:
result = $n & " bottles" result &= " of beer" for bn in countdown(99, 1): let cur = getBottleNumber(bn) echo(cur, " on the wall, ", cur, ".") echo("Take one down and pass it around, ", getBottleNumber(bn-1), " on the wall.\n") echo "No more bottles of beer on the wall, no more bottles of beer." echo "Go to the store and buy some more, 99 bottles of beer on the wall." other: from strutils import format for i in countdown(99, 1): case i of 3..99: echo format("""$1 bottles of beer on the wall
$1 bottles of beer Take one down, pass it around$2 bottles of beer on the wall""", i, i-1)
of 2:
echo format("""$1 bottles of beer on the wall$1 bottles of beer
Take one down, pass it around
$2 bottle of beer on the wall""", i, i-1) of 1: echo format("""$1 bottle of beer on the wall
$1 bottle of beer Take one down, pass it around No more bottles of beer on the wall""", i) else: discard compact: from strutils import format proc pluralize(a: int): string = if a > 1 or a == 0: "s" else: "" for i in countdown(99, 1): echo format("""$1 bottle$3 of beer on the wall$1 bottle$3 of beer Take one down, pass it around$2 bottle$4 of beer on the wall""", i, i-1, pluralize(i), pluralize(i-1)) organized: from strutils import format var verse = """$1 bottle$3 of beer on the wall$1 bottle$3 of beer Take one down, pass it around$2 bottle$4 of beer on the wall""" proc pluralize(a: int): string = if a > 1 or a == 0: "s" else: "" for i in countdown(99, 1): echo format(verse, i, i-1, pluralize(i), pluralize(i-1)) ## Nix with builtins; let bottle = x: "${toString x} bottle${if (x == 1) then "" else "s"} of beer"; beer = { x ? 99 }: if (x == 0) then "" else ''${bottle x} on the wall
${bottle x} Take one down, pass it around${bottle (x - 1)} on the wall

${beer { x = x - 1; }}''; in beer { } ## NS-HUBASIC With grammatical support for "1 bottle of beer" 10 WALL$=" ON THE WALL"
20 FOR BOTTLES=99 TO 1 STEP -1
30 BOTTLES$=" BOTTLES OF BEER" 40 IF BOTTLES=1 THEN BOTTLE$=" BOTTLE OF BEER"
50 PRINT BOTTLES BOTTLES$WALL$
60 PRINT BOTTLES BOTTLES$70 PRINT "TAKE ONE DOWN, PASS IT AROUND" 80 IF BOTTLES-1=1 THEN BOTTLE$=" BOTTLE OF BEER"
90 IF BOTTLES-1=0 THEN BOTTLE$=" BOTTLES OF BEER" 100 PRINT BOTTLES-1 BOTTLES$ WALL$110 NEXT Without grammatical support for "1 bottle of beer" 10 BOTTLES$=" BOTTLES OF BEER"
20 WALL$=" ON THE WALL" 30 FOR BOTTLES=99 TO 1 STEP -1 40 PRINT BOTTLES BOTTLES$ WALL$50 PRINT BOTTLES BOTTLES$
60 PRINT "TAKE ONE DOWN, PASS IT AROUND"
70 PRINT BOTTLES-1 BOTTLES$WALL$
80 NEXT

## Nutt

module main imports native.io.output.say

for i|->{1,2..99;<|>) do
say(""+i+" bottles of beer on the wall, "+i+" bottles of beer")
say("Take one down and pass it around, "+(i-1)+" bottles of beer on the wall.")
done

end

## OASYS

class player {}

int count

property int dummy

method quit verbs {{quit}} {
quit
}

method beer verbs {{beer}} {
count = 99
while count {
print count
print " bottles of beer on the wall.\n"
print count
print " bottles of beer.\nTake one down and pass it around,\n"
count = count - 1
if count {
print count
print " bottles of beer on the wall.\n\n"
}
}
print "No more bottles of beer on the wall.\n"
}

method init {
player = create player
print "Type 'beer' for beer.\nType 'quit' to quit.\n"
}

## Oberon-2

MODULE b99;

IMPORT  Out;

VAR     nr      : INTEGER;

BEGIN
nr := 99;
REPEAT
Out.Int (nr, 4);
Out.String (" bottles of beer on the wall");
Out.Ln;
Out.Int (nr, 4);
Out.String (" bottles of beer");
Out.Ln;
Out.String ("Take one down, pass it around");
Out.Ln;
DEC (nr);
Out.Int (nr, 4);
Out.String (" bottles of beer on the wall");
Out.Ln;
Out.Ln
UNTIL nr = 0
END b99.

## Objeck

class Bottles {
function : Main(args : String[]) ~ Nil {
bottles := 99;
do {
"{$bottles} bottles of beer on the wall"->PrintLine(); "{$bottles} bottles of beer"->PrintLine();
"Take one down, pass it around"->PrintLine();
bottles--;
"{$bottles} bottles of beer on the wall"->PrintLine(); } while(bottles > 0); } } ## Objective-C #import <Foundation/Foundation.h> int main() { @autoreleasepool { int bottles = 99; do { NSLog(@"%i bottles of beer on the wall\n", bottles); NSLog(@"%i bottles of beer\n", bottles); NSLog(@"Take one down, pass it around\n"); NSLog(@"%i bottles of beer on the wall\n\n", --bottles); } while (bottles > 0); } return 0; } ## OCaml ### For-loop for n = 99 downto 1 do Printf.printf "%d bottles of beer on the wall\n" n; Printf.printf "%d bottles of beer\n" n; Printf.printf "Take one down, pass it around\n"; Printf.printf "%d bottles of beer on the wall\n\n" (pred n); done ### Recursive Recursive version that handles plurals. let verse n = let line2 = function | 0 -> "No more bottles of beer" | 1 -> "1 bottle of beer" | n -> string_of_int n ^ " bottles of beer" in let line1or4 y = line2 y ^ " on the wall" in let line3 = function | 1 -> "Take it down, pass it around" | _ -> "Take one down, pass it around" in line1or4 n ^ "\n" ^ line2 n ^ "\n" ^ line3 n ^ "\n" ^ line1or4 (n-1) ^ "\n";; let rec beer n = print_endline (verse n); if n > 1 then beer (n-1);; beer 99;; ### Monadic Monadic version, expressing actions which evolve the program state and log output. Special cases and grammar rules are handled. (* A basic "Writer" monoid with emit *) module Writer = struct type 'a t = 'a * string let ( >>= ) (x,s) f = let (y,s') = f x in (y, s ^ s') let return x = (x,"") let emit (x,s) = print_string s; x end (* Utility functions for handling strings and grammar *) let line s = (String.capitalize s) ^ ".\n" let count = function 0 -> "no more" | n -> string_of_int n let plural = function 1 -> "" | _ -> "s" let specify = function 1 -> "it" | _ -> "one" let bottles n = count n ^ " bottle" ^ plural n ^ " of beer" (* Actions, expressed as an int * string, for Writer *) let report n = (n, line (bottles n ^ " on the wall, " ^ bottles n)) let take n = (n-1, "Take " ^ specify n ^ " down and pass it around") let summary n = (n, ", " ^ bottles n ^ " on the wall.\n\n") let shop = (99, "Go to the store and buy some more") let rec verse state = Writer.(state >>= report >>= function 0 -> shop >>= summary (* ends here *) | n -> take n >>= summary |> verse) let sing start = Writer.(emit (verse (return start))) Output for initial beer-count of two: # sing 2;; 2 bottles of beer on the wall, 2 bottles of beer. Take one down and pass it around, 1 bottle of beer on the wall. 1 bottle of beer on the wall, 1 bottle of beer. Take it down and pass it around, no more bottles of beer on the wall. 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. - : int = 99 Note the output value is 99... reflecting the state at termination. ## Octave function bottles(n) bottle = "bottle"; ofbeer = "of beer"; wall = "on the wall"; for i = n:-1:0 if ( i == 1 ) s = ""; else s = "s"; endif for j = 0:1 w = wall; if ( j == 1 ) w = ""; endif printf("%d %s%s %s %s\n",\ i, bottle, s, ofbeer, w); endfor printf("Take one down, pass it around\n"); endfor endfunction bottles(99); ## Odin package main import "core:fmt" printf :: fmt.printf //Give fn on right an arbitrary name, or 9x fmt.printf("...") bob :: proc( n: int , x: int){ for i := x; i > 0 ; i -=1 { if n >= 2 do printf("%d bottles of beer",n) else if n == 1 do printf("1 bottle of beer") else if n == 0 do printf("No more bottles of beer") if i == 1 do printf(".\n") if i > 1 do printf(" on the wall.\n") if i > 2 do printf("\n") } } main :: proc(){ n := 99 bob(n, 2) for i := n - 1 ; i >= 0 ; i -= 1 { printf("Take one down; pass it around.\n") bob(i, 3) } printf ("Go to the store and buy some more.\n") printf ("%i bottles of beer on the wall.\n",n) } ## Oforth "bottles of beer on the wall\n" const: B "bottles of beer\nTake one down, pass it around\n" const: T #[ 100 swap - dup . B print dup . T print 1- . B .cr ] 99 each ## Ol ## Onyx $Bottles {
dup cvs  bottle' cat exch 1 ne {s' cat} if
 of beer' cat
} def

$GetPronoun { 1 eq {it'}{one'} ifelse cat } def$WriteStanza {
dup dup Bottles  on the wall. ' cat exch Bottles .\n' cat cat
exch Take ' 1 idup GetPronoun  down. Pass it around.\n' cat
exch dec Bottles  on the wall.\n\n' 3 {cat} repeat print flush
} def

99 -1 1 {WriteStanza} for

Output:

99 bottles of beer on the wall. 99 bottles of beer.
Take one down. Pass it around.
98 bottles of beer on the wall.
. . .
2 bottles of beer on the wall. 2 bottles of beer.
Take one down. Pass it around.
1 bottle of beer on the wall.

1 bottle of beer on the wall. 1 bottle of beer.
Take it down. Pass it around.
0 bottles of beer on the wall.


## OOC

sing_line: func (b: Int, suffix: Bool) {
"#{b > 0 ? "#{b}" : "No more"} bottle#{b == 1 ? "" : "s"}" print()
" of beer#{suffix ? " on the wall" : ""}" println()
}

sing_verse: func (b: Int) {
println()
sing_line(b, true)
sing_line(b, false)
if (b > 0) {
"Take one down, pass it around" println()
} else {
"Go to the store and buy some more" println()
b += 100
}
sing_line(b-1, true)
}

main: func {
b := 100
while (b > 0) {
sing_verse(--b)
}
}

## ooRexx

The rexx example below runs unchanged on ooRexx

## OpenEdge/Progress

DEFINE VARIABLE amountofbottles AS INTEGER NO-UNDO INITIAL 99.
&GLOBAL-DEFINE bbm bottles of beer
&GLOBAL-DEFINE bbs bottle of beer
&GLOBAL-DEFINE otw on the wall
&GLOBAL-DEFINE tow Take one down and pass it around,
&GLOBAL-DEFINE gts Go to the store and buy some more,
FUNCTION drinkBottle RETURNS INTEGER PRIVATE (INPUT bc AS INTEGER) FORWARD.

OUTPUT TO OUTPUT.txt.
drinkBottle(amountofbottles).
OUTPUT CLOSE.

FUNCTION drinkBottle RETURNS INTEGER.
IF bc >= 0 THEN DO:
CASE bc:
WHEN 2 THEN
PUT UNFORMATTED bc " {&bbm} {&otw}, " bc " {&bbm}" SKIP
"{&tow} " bc - 1 " {&bbs} {&otw}" SKIP.
WHEN 1 THEN
PUT UNFORMATTED bc " {&bbs} {&otw}, " bc " {&bbs}" SKIP
"{&tow} no more {&bbm} {&otw}" SKIP.
WHEN 0 THEN
PUT UNFORMATTED "no more" " {&bbm} {&otw}, no more {&bbm}" SKIP
"{&gts} " amountofbottles " {&bbm} {&otw}" SKIP.
OTHERWISE
PUT UNFORMATTED bc " {&bbm} {&otw}, " bc " {&bbm}" SKIP
"{&tow} " bc - 1 " {&bbm} {&otw}" SKIP.
END CASE.
drinkBottle(bc - 1).
RETURN bc.
END.
RETURN 0.
END FUNCTION.

## Openscad

El código es de Marc Vanlindt (marc@vanlindt.be)

num_bottles = 99;
s1 = " of beer";
s2 = " on the wall";
s3 = "Take one down and pass it around, ";
s4 = "No more";
s5 = "no more";
s6 = "Go to the store and buy some more, ";
b1 = " bottle";
b2 = " bottles";
beer(n = num_bottles);
module beer(n, biere) {
biere1 = str(n >= 1 ? n  : s4,n == 1 ? b1 :b2,s1, s2,", ",n >= 1 ? n : s5,n == 1 ? b1 :b2,s1,".");
biere2 = str(n == 0 ? s6 : s3,n == 0 ? num_bottles : n == 1 ? s5 : n-1,n == 0 ? b2 : n-1 == 1 ? b1 : b2,s1,s2,".");
biere3 = str(biere1," ",biere2);
echo(biere3);
if(n > 0) {
beer(n = n-1);
}
}

## Order

These examples are taken directly from a much longer tutorial in the Order documentation, which explains the construction of the solution to this problem in great detail.

### "Pure" Order

This solution uses only Order language constructs to generate and manipulate tokens:

#include "order/interpreter.h"

ORDER_PP
(8let((8B, 8fn(8N,
8cond((8greater(8N, 1),
8separate(8N, 8quote(bottles)))
(8equal(8N, 1),
8quote(1 bottle))
(8else,
8quote(no more bottles))))),
8for_each_in_range
(8fn(8N,
8print(8ap(8B, 8N) (of beer on the wall,) 8space
8ap(8B, 8N) (of beer,) 8space
(take one down, pass it around,) 8space
8ap(8B, 8dec(8N)) (of beer on the wall.))),
100, 1)))

### C Preprocessor

...but since most of the logic is simple substitution, it makes more sense (and is significantly more efficient) to make the C Preprocessor do most of the work without the help of the Order interpreter. This version shows how to integrate normal C Preprocessor macros into an Order program:

#include "order/interpreter.h"

#define GEN_phrase(N_bottles, N_minus_1_bottles)    \
N_bottles of beer on the wall,                    \
N_bottles of beer, take one down, pass it around, \
N_minus_1_bottles of beer on the wall.

#define ORDER_PP_DEF_8bottles                          \
ORDER_PP_FN(8fn(8N,                                    \
8cond((8greater(8N, 1),                \
8separate(8N, 8quote(bottles))) \
(8equal(8N, 1),                  \
8quote(1 bottle))               \
(8else,                          \
8quote(no more bottles)))))

ORDER_PP(8for_each_in_range
(8fn(8N,
8emit(8quote(GEN_phrase),
8tuple(8bottles(8N),
8bottles(8dec(8N))))),
100, 1))

#undef GEN_phrase

Either example could obviously also form the core of a C solution (demonstrating the intended use of Order).

## Oxygene

namespace ConsoleApplication2;

interface

type
ConsoleApp = class
public
class method Main(args: array of String);
end;

implementation

method bottles(number: Integer): String;
begin
if (number = 1) then
Result := "bottle"
else
Result := "bottles";
end;

class method ConsoleApp.Main(args: array of String);
begin
for n: Integer := 99 downto 1 do
begin
Console.WriteLine("{0} {1} of beer on the wall,",n,bottles(n));
Console.WriteLine("{0} {1} of beer,",n,bottles(n));
Console.WriteLine("Take one down, and pass it around,");
Console.WriteLine("{0} {1} of beer on the wall.",n-1,bottles(n-1));
Console.WriteLine();
end;
Console.ReadKey();
end;

end.

## Oz

### Constraint Programming

Note: In real life, you would never solve a simple iterative task like this with constraint programming. This is just for fun.

declare
%% describe the possible solutions of the beer 'puzzle'
proc {BeerDescription Solution}
N = {FD.int 1#99} %% N is an integer in [1, 99]
in
%% distribute starting with highest value
{FD.distribute generic(value:max) [N]}

Solution =
{Bottles N}#" of beer on the wall\n"#
{Bottles N}#" bottles of beer\n"#
"Take one down, pass it around\n"#
{Bottles N-1}#" of beer on the wall\n"
end

%% pluralization
proc {Bottles N Txt}
cond N = 1 then Txt ="1 bottle"
else Txt = N#" bottles"
end
end
in
%% show all solutions to the 'puzzle'
{ForAll {SearchAll BeerDescription}
System.showInfo}

### Iterative

declare
fun {Bottles N}
if N == 1 then "1 bottle"
else N#" bottles"
end
end
in
for I in 99..1;~1 do
{System.showInfo
{Bottles I}#" of beer on the wall\n"#
{Bottles I}#" bottles of beer\n"#
"Take one down, pass it around\n"#
{Bottles I-1}#" of beer on the wall\n"}
end

## PARI/GP

forstep(n=99,3,-1,
print(n" bottles of beer on the wall");
print(n" bottles of beer");
print("Take one down, pass it around");
print(n-1," bottles of beer on the wall\n")
);
print("2 bottles of beer on the wall\n2 bottles of beer\nTake one down, pass it around\n1 bottle of beer on the wall\n");
print("1 bottle of beer on the wall\n1 bottle of beer\nTake one down, pass it around\nNo more bottles of beer on the wall")

## Perl

#!/usr/bin/perl -w

my $verse = <<"VERSE"; 100 bottles of beer on the wall, 100 bottles of beer! Take one down, pass it around! 99 bottles of beer on the wall! VERSE {$verse =~ s/(\d+)/$1-1/ge;$verse =~ s/\b1 bottles/1 bottle/g;
my $done =$verse =~ s/\b0 bottle/No bottles/g; # if we make this replacement, we're also done.

print $verse; redo unless$done;
}

Alternatively:

for $n (reverse(0..99)) {$bottles = sprintf("%s bottle%s of beer on the wall\n",(($n==0)?"No":$n), (($n==1)?"":"s")); print( (($n==99)?"":"$bottles\n") . (($n==0)?"":(substr(${bottles}x2,0,-12) . "\nTake one down, pass it around\n")) ); } Correct grammar and nice spacing in modern perl: use 5.10.0;$num = 99;
while ($num > 0) { my$s = "s" unless ($num == 1); say "$num bottle$s of beer on the wall,$num bottle$s of beer";$num--;
my $s = "s" unless ($num == 1);
$num = "No more" if ($num == 0);
say "Take one down, pass it around, $num bottle$s of beer on the wall\n"
}

say "No more bottles of beer on the wall, no more bottles of beer.";
say "Go to the store and buy some more, 99 bottles of beer on the wall.";

Using perl5 as a DSL factory leveraging $_'s global nature: #!/usr/bin/env perl use strict; use warnings; sub bottles() { sprintf qq{%s bottle%s of beer} ,$_ || 'No'
, $_==1 ? '' : 's'; } sub store() {$_=99; qq{Go to the store, buy some more...\n}; }
sub wall() { qq{ on the wall\n} }
sub take() { $_-- ? qq{Take one down, pass it around\n} : store } do { print bottles, wall , bottles, qq{\n} , take , bottles, qq{\n\n} } for reverse 0..99; ## Phix constant ninetynine = 99 -- (set to 9 for testing) function bottles(integer count) if count=0 then return "no more bottles " elsif count=1 then return "1 bottle " end if if count=-1 then count = ninetynine end if return sprintf("%d bottles ",count) end function function bob(integer count) return bottles(count)&"of beer" end function function up1(string bob) -- Capitalise sentence start (needed just the once, "no more"=>"No more") bob[1] = upper(bob[1]) return bob end function string many = bob(ninetynine) string down = "Take one down, pass it around,\n" for i=ninetynine to 0 by -1 do puts(1,up1(many)&" on the wall,\n") puts(1,many&".\n") if i=0 then down = "Go to the store, buy some more,\n" elsif i=1 then down[6..8] = "it" end if many = bob(i-1) puts(1,down&many&" on the wall.\n\n") end for {} = wait_key()  ## Phixmonti def bottles dup if dup 1 == if "1 bottle" print else dup print " bottles" print endif else "No more bottles" print endif enddef def verse bottles " of beer on the wall" print nl bottles " of beer" print nl "Take one down, pass it around" print nl 1 - bottles " of beer on the wall" print nl nl enddef 99 1 -1 3 tolist for verse . endfor With syntactic sugar include ..\Utilitys.pmt def bottles dup 0 == if "no more bottles of beer" else dup 1 == if "1 bottle of beer" else dup tostr " bottles of beer" chain endif endif enddef ( 99 1 -1 ) for bottles print " on the wall," ? bottles "," chain ? "take one down, pass it around," ? 1 - bottles print " on the wall." ? nl drop endfor ## PHL Translation of: C module bottles; extern printf; @Integer main [ @Integer bottles = 99; do { printf("%u bottles of beer on the wall\n", bottles); printf("%u bottles of beer\n", bottles); printf("Take one down, pass it around\n"); bottles = bottles::dec; printf("%u bottles of beer on the wall\n\n", bottles); } while(bottles > 0); return 0; ] ## PHP <?php$plural = 's';
foreach (range(99, 1) as $i) { echo "$i bottle$plural of beer on the wall,\n"; echo "$i bottle$plural of beer!\n"; echo "Take one down, pass it around!\n"; if ($i - 1 == 1)
$plural = ''; if ($i > 1)
echo ($i - 1) . " bottle$plural of beer on the wall!\n\n";
else
echo "No more bottles of beer on the wall!\n";
}
?>

### shorter way

<?php
foreach(range(99,1) as $i) {$p = ($i>1)?"s":""; echo <<< EOV$i bottle$p of beer on the wall$i bottle$p of beer Take one down, pass it around EOV; } echo "No more Bottles of beer on the wall"; ?> ### Tag syntax <?php foreach(range(99,1) as$i):?>
<?=$i?> bottle<?=$i==1 ? '' : 's'?> of beer on the wall,
<?=$i?> bottle<?=$i==1 ? '' : 's'?> of beer!
Take one down, pass it around...
<?php if($i > 1):?> <?=$i-1?> bottle<?=$i==1 ? '' : 's'?> of beer on the wall! <?php else:?> No more bottles of beer on the wall! <?php endif?> <?php endforeach?> ### modifing way <?php$verse = <<<VERSE
100 bottles of beer on the wall,
100 bottles of beer!
Take one down, pass it around!
99 bottles of beer on the wall!

VERSE;

foreach (range(1,99) as $i) { // loop 99 times$verse = preg_replace('/\d+/e', '$0 - 1',$verse);
$verse = preg_replace('/\b1 bottles/', '1 bottle',$verse);
$verse = preg_replace('/\b0 bottle/', 'No bottles',$verse);

echo $verse; } ?> ### ultra compact alternative supports grammar and has no leading and trailing new lines or spaces. Also one does not have to close the <?php tag, it is even recommended not to close it, if closing it is not necessary <?php for($i=100;$i>0;$i--){
$p2=$i." bottle".(($i>1)?"s":"")." of beer";$p1=$p2." on the wall\n";$p3="Take one down, pass it around\n";
echo (($i<100)?$p1."\n":"").$p1.$p2."\n".$p3.(($i<2)?($i-1).substr($p1,1,28):"");
}

### gettext alternative

supports grammar and translations.

<?php

$bottles = 99; while ($bottles > 0) {
printf(ngettext('%d bottle', '%d bottles', $bottles) . " of beer on the wall\n",$bottles);		//X bottles of beer on the wall
printf(ngettext('%d bottle', '%d bottles', $bottles) . " of beer\n",$bottles);				//X bottles of beer
printf("Take one down, pass it around\n");										//Take one down, pass it around

$bottles--; if ($bottles > 0) {
printf(ngettext('%d bottle', '%d bottles', $bottles) . " of beer on the wall\n\n",$bottles);	//X bottles of beer on the wall
}
}
printf('No more bottles of beer on the wall');											//No more bottles of beer on the wall

### Using printf

Fun with HEREDOC and printf placeholders

<?php

$lyrics = <<<ENDVERSE %2\$d bottle%1\$s of beer on the wall %2\$d bottle%1\$s of beer Take one down, pass it around %4\$s bottle%3\$s of beer on the wall ENDVERSE;$x = 99;
while ( $x > 0 ) { printf($lyrics, $x != 1 ? 's' : '',$x--, $x != 1 ? 's' : '',$x > 0 ? $x : 'No more' ); } Output: 99 bottles of beer on the wall 99 bottles of beer Take one down, pass it around 98 bottles of beer on the wall 98 bottles of beer on the wall 98 bottles of beer Take one down, pass it around 97 bottles of beer on the wall 97 bottles of beer on the wall 97 bottles of beer Take one down, pass it around 96 bottles of beer on the wall 96 bottles of beer on the wall 96 bottles of beer Take one down, pass it around 95 bottles of beer on the wall 95 bottles of beer on the wall 95 bottles of beer Take one down, pass it around 94 bottles of beer on the wall <!-- yada --> 4 bottles of beer on the wall 4 bottles of beer Take one down, pass it around 3 bottles of beer on the wall 3 bottles of beer on the wall 3 bottles of beer Take one down, pass it around 2 bottles of beer on the wall 2 bottles of beer on the wall 2 bottles of beer Take one down, pass it around 1 bottle of beer on the wall 1 bottle of beer on the wall 1 bottle of beer Take one down, pass it around No more bottles of beer on the wall  ## Picat beer1(N) => Beer = N, while (Beer > 0) printf("%d bottles of beer on the wall,\n", Beer), printf("%d bottles of beer.\n", Beer), printf("Take one down, pass it around.\n"), printf("%d bottles of beer.\n", Beer-1), Beer := Beer -1 end, print("0 more bottles of beer on the wall.\n"), nl. % With plurals. beer2(B) = S => BS = B.to_string(), BB = " bottle", BT = BB, if B > 1 then BB := BB ++ "s" end, OB = " of beer", NL = "\n", BW = OB ++ " on the wall." ++ NL, T = "Take one down, pass it around." ++ NL, S1 = BS ++ BT ++ BW ++ BS ++ BT ++ OB ++ T ++ cond(B > 0, (B-1).to_string() ++ BT ++ BW ++ NL, ""), S = S1. ## PicoLisp ## Piet ## Pike int main(){ for(int i = 99; i > 0; i--){ write(i + " bottles of beer on the wall, " + i + " bottles of beer.\n"); write("Take one down and pass it around, " + (i-1) + " bottles of beer on the wall.\n\n"); } write("No more bottles of beer on the wall, no more bottles of beer.\n"); write("Go to the store and buy some more, 99 bottles of beer on the wall.\n"); } alternate version: // disclaimer: i prefer gingerale void main() { array numbers = ({ "no more", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }); array decades = ({ "twenty", "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety" }); foreach (decades;; string decade) { numbers += decade+(({ "" }) + numbers[1..9])[*]; } numbers = reverse(numbers); array bottles = ((numbers[*]+" bottles of ale on the wall, ")[*] + (numbers[*]+" bottles of ale.\n")[*]); bottles[-2] = replace(bottles[-2], "one bottles", "one bottle"); string song = bottles * "take one down, pass it around,\n"; write(song); } ## PILOT El código es de Akira KIDA (SDI00379@niftyserve.or.jp) C :bottles = 99 U : *beers *LOOP T :$T of beer on the wall, $T. T :Take one down, pass it around. C :bottles = bottles - 1 U :*beers T :$T on the wall.
T :
J(bottles > 0) :*LOOP
END:

*beers
C(bottles = 0) :$T = No more bottles C(bottles = 1) :$T = 1 bottle
C(bottles > 1) :$T = #bottles bottles E : ## PIR Works with: Parrot version Tested with 2.4.0 .sub sounding_smart_is_hard_after_drinking_this_many .param int b if b == 1 goto ONE .return(" bottles ") ONE: .return(" bottle ") end .end .sub main :main .local int bottles .local string b bottles = 99 LUSH: if bottles == 0 goto DRUNK b = sounding_smart_is_hard_after_drinking_this_many( bottles ) print bottles print b print "of beer on the wall\n" print bottles print b print "of beer\nTake one down, pass it around\n" dec bottles b = sounding_smart_is_hard_after_drinking_this_many( bottles ) print bottles print b print "of beer on the wall\n\n" goto LUSH DRUNK: end .end ## Plain English To run: Start up. Sing 99 of bottles of beer on the wall. Wait for the escape key. Shut down. To sing a number of bottles of beer on the wall: Put the number into a counter. Loop. Write the first line given the counter. Write the second line given the counter. Write "Take one down, pass it around" to the console. Subtract 1 from the counter. Write the first line given the counter. If the counter is 0, break. Write "" on the console. Repeat. To write the first line given a counter: If the counter is 0, write "No more bottles of beer on the wall" to the console; exit. If the counter is 1, write "1 bottle of beer on the wall" to the console; exit. Write the counter then " bottles of beer on the wall" to the console. To write the second line given a counter: If the counter is 1, write "1 bottle of beer" to the console; exit. Write the counter then " bottles of beer" to the console. ## Plain TeX \def\ifbeer{\ifnum\number\bottles} \def\beers{ \par\ifbeer>0 \the\bottles~\else No more \fi bottle\ifbeer=1\else s\fi~of beer% } \def\take #1 down,{ \par\advance\bottles by -#1 Take #1 down, pass it around,\par } \long\def\verse{ \beers~on the wall, \beers. \take 1 down, % curious TeX \def syntax \beers~on the wall. \bigskip } \newcount\bottles\bottles99 \loop\verse \ifnum\number\bottles>0\repeat \bye ## PL/I bottles: procedure options(main); nBottles: procedure(n); declare n fixed; if n = 0 then put skip list('No more bottles'); else if n = 1 then put skip list('1 bottle'); else do; if n < 10 then put skip edit(n) (F(1)); else put skip edit(n) (F(2)); put list('bottles'); end; end nBottles; takeDown: procedure(n); declare n fixed; put skip list('Take'); if n=1 then put list('it'); else put list('one'); put list('down and take it around,'); end takeDown; declare n fixed; do n=99 by -1 to 1; call nBottles(n); put list('of beer on the wall,'); call nBottles(n); put list('of beer,'); call takeDown(n); call nBottles(n-1); put list('of beer on the wall.'); put skip; end; end bottles; ## PL/M 100H: /* CP/M ORIGIN */ BDOS: PROCEDURE(F,PARAM); /* CALL CP/M BDOS */ DECLARE F BYTE; DECLARE PARAM ADDRESS; GO TO 5; END BDOS; DECLARE BDOS$EXIT LITERALLY '0'; /* BDOS FUNCTIONS */
DECLARE BDOS$PUTS LITERALLY '9'; PRINT$BYTE: PROCEDURE(N); /* PRINT A DECIMAL BYTE */
DECLARE (N, D) BYTE, S (5) BYTE INITIAL ('... $'); DECLARE P ADDRESS, C BASED P BYTE; P = .S(3); DIGIT: P = P - 1; C = (N MOD 10) + 48; N = N / 10; IF N > 0 THEN GO TO DIGIT; CALL BDOS(BDOS$PUTS, P);
END PRINT$BYTE; PRINT$STR: PROCEDURE(S); /* PRINT A STRING */
DECLARE S ADDRESS;
CALL BDOS(BDOS$PUTS, S); END PRINT$STR;

N$OF$BOTTLES: PROCEDURE(N); /* PRINT _N_ BOTTLES */
DECLARE N BYTE;
IF N = 0 THEN CALL PRINT$STR(.('NO MORE$'));
ELSE IF N = 1 THEN CALL PRINT$STR(.('1 BOTTLE$'));
ELSE DO;
CALL PRINT$BYTE(N); CALL PRINT$STR(.('BOTTLES$')); END; END N$OF$BOTTLES; TAKE$DOWN: PROCEDURE(N); /* PRINT TAKE (ONE/IT) DOWN */
DECLARE N BYTE;
CALL PRINT$STR(.('TAKE$'));
IF N=1 THEN CALL PRINT$STR(.('IT$'));
ELSE CALL PRINT$STR(.('ONE$'));
CALL PRINT$STR(.(' DOWN AND PASS IT AROUND',13,10,'$'));
END TAKE$DOWN; DECLARE OF$BEER DATA (' OF BEER$'); DECLARE ON$WALL DATA (' ON THE WALL',13,10,'$'); DECLARE NEWLINE DATA (13,10,'$');

DECLARE BOTTLES BYTE INITIAL (99);

DO WHILE BOTTLES > 0;
CALL N$OF$BOTTLES(BOTTLES);
CALL PRINT$STR(.OF$BEER);
CALL PRINT$STR(.ON$WALL);
CALL N$OF$BOTTLES(BOTTLES);
CALL PRINT$STR(.OF$BEER);
CALL PRINT$STR(.NEWLINE); CALL TAKE$DOWN(BOTTLES);
BOTTLES = BOTTLES - 1;
CALL N$OF$BOTTLES(BOTTLES);
CALL PRINT$STR(.OF$BEER);
CALL PRINT$STR(.ON$WALL);
CALL PRINT$STR(.NEWLINE); END; CALL BDOS(BDOS$EXIT,0);
EOF

## Pointless

-----------------------------------------------------------
-- Print the lyrics to the song '99 bottles of beer'

output =
range(99, 1)
|> map(showBeer)
|> printLines

beerFmt = """{} of beer on the wall!
{} of beer!
You take one down, pass it around
{}"""

showBeer(n) =
format(
beerFmt,
[showBottle(n), showBottle(n), nextBeer(n - 1)]
)

nextBeer(n) =
if n == 0 then "No more bottles of beer on the wall!"
else format("{} of beer on the wall!\n", [showBottle(n)])

-----------------------------------------------------------
-- Get appropriate singular / plural form of 'n bottle(s)'

showBottle(n) =
format("{} {}", [n, bottleStr])
where bottleStr = if n == 1 then "bottle" else "bottles"

## Pony

### Recursive

actor Main
let _env: Env
new create(env: Env) =>
_env = env
bottles(99)

be bottles(n: U32) =>
if n == 0 then
_env.out.print("No more bottles of beer on the wall, no more bottles of beer.")
_env.out.print("Go to the store and buy some more, 99 bottles of beer on the wall.")
else
if n == 1 then
_env.out.print("1 bottle of beer on the wall, 1 bottle of beer.")
_env.out.print("Take one down and pass it around, no more bottles of beer on the wall.\n")
else
_env.out.print(n.string() + " bottles of beer on the wall, " + n.string() + " bottles of beer.")
_env.out.print("Take one down and pass it around, "+ (n - 1).string() +" bottles of beer on the wall.\n")
end
bottles(n-1)
end

### Iterative

actor Main
let _env: Env
new create(env: Env) =>
_env = env
var n: I32 = 99
repeat
if n == 0 then
_env.out.print("No more bottles of beer on the wall, no more bottles of beer.")
_env.out.print("Go to the store and buy some more, 99 bottles of beer on the wall.")
elseif n == 1 then
_env.out.print("1 bottle of beer on the wall, 1 bottle of beer.")
_env.out.print("Take one down and pass it around, no more bottles of beer on the wall.\n")
else
_env.out.print(n.string() + " bottles of beer on the wall, " + n.string() + " bottles of beer.")
_env.out.print("Take one down and pass it around, "+ (n - 1).string() +" bottles of beer on the wall.\n")
end
n = n - 1
until n < 0 end

## Pop11

define bootles(n);
while n > 0 do
printf(n, '%p bottles of beer on the wall\n');
printf(n, '%p bottles of beer\n');
printf('Take one down, pass it around\n');
n - 1 -> n;
printf(n, '%p bottles of beer on the wall\n');
endwhile;
enddefine;

bootles(99);

## PostScript

%!PS
/Helvetica findfont 9 scalefont setfont

/printBeer {
dup
20 string cvs show
( bottle) show
1 ne
{ (s) show } if
( of beer) show
} def

/printVerse {
dup
dup
dup
7 mul
50 add
/yPos exch def
15 yPos moveto
printBeer
( on the wall, ) show
printBeer
(. ) show
(Take one down, pass it around, ) show
1 sub
printBeer
( on the wall. ) show
} def

/song {
100 -1 1 { printVerse } for
} def

song
showpage
%%EOF

## Potion

No extra credit.

99 to 1 (i) :
verse = (n) :
(n,     " bottles of beer on the wall\n"
n,     " bottles of beer\n"
"Take one down, pass it around\n"
n - 1, " bottles of beer on the wall\n")
.

verse(i) join print
"\n" print
.

## Processing

Console output

Immediately prints all output to the console.

for (int i = 99; i > 0; i--) {
print(i + " bottles of beer on the wall\n"
+ i + " bottles of beer\nTake one down, pass it around\n"
+ (i - 1) + " bottles of beer on the wall\n\n");
}

Visual and animated

This approach uses Processing's draw loop to display text on the sketch canvas, with a global counter for bottles--draw() is called at the default 60fps, and acts as the for loop. One round of lyrics is displayed at a time, and the counter advances by checking Processing's built-in frameCount. Lyrics may also be advanced manually by clicking the mouse on the canvas.

int i = 99;
void setup() {
size(200, 140);
}
void draw() {
background(0);
text(i + " bottles of beer on the wall\n"
+ i + " bottles of beer\nTake one down, pass it around\n"
+ (i-1) + " bottles of beer on the wall\n\n",
10, 20);
if (frameCount%240==239) next();  // auto-advance every 4 secs
}
void mouseReleased() {
next();  // manual advance
}
void next() {
i = max(i-1, 1);  // stop decreasing at 1-0 bottles
}

### Processing Python mode

Translation of: Processing
i = 99
def setup():
size(200, 140)

def draw():
background(0)
text("{} bottles of beer on the wall\n".format(i) +
"{} bottles of beer\n".format(i) +
"Take one down, pass it around\n" +
"{} bottles of beer on the wall\n\n".format(i - 1),
10, 20)
if frameCount % 240 == 239:  # auto-advance every 4 secs
next()

def mouseReleased():
next()  # manual advance

def next():
global i
i = max(i - 1, 1)  # stop decreasing at 1-0 bottles

### Processing.R

Console output

setup <- function() {
stdout$print(bottlesong(99)) } bottlesong <- function(num) { verses = "" for(i in num:1){ verses = paste0(verses, num," bottles of beer on the wall \n", num," bottles of beer \n", "Take one down, pass it around \n", num-1, " bottles of beer on the wall \n\n", sep=""); num <- num - 1 } return(verses) } ## ProDOS ## Prolog ## Python ### One line Works with: Python version 3.6+ Short, one-line version. for i in range(99, 0, -1):b='bottles of beer';w=f' {b} on the wall';print(f'{i}{w}, {i} {b}\nTake one down and pass it around, {i-1}{w}.\n') ### Pythonic version Works with: Python version 3 VERSE = '''\ {n} bottle{s} of beer on the wall {n} bottle{s} of beer Take one down, pass it around {n_minus_1} bottle{s2} of beer on the wall ''' for n in range(99, 0, -1): if n == 1: n_minus_1 = 'No more' s = '' s2 = 's' elif n == 2: n_minus_1 = n - 1; s = 's' s2 = '' else: n_minus_1 = n - 1; s = 's' s2 = 's' print(VERSE.format(n=n, s=s, s2=s2, n_minus_1=n_minus_1)) ### Functional Translation of: Haskell Works with: Python version 3.7+ '''99 Units of Disposable Asset''' from itertools import chain # main :: IO () def main(): '''Modalised asset dispersal procedure.''' # localisation :: (String, String, String) localisation = ( 'on the wall', 'Take one down, pass it around', 'Better go to the store to buy some more' ) print(unlines(map( incantation(localisation), enumFromThenTo(99)(98)(0) ))) # incantation :: (String, String, String) -> Int -> String def incantation(localisation): '''Versification of asset disposal and inventory update.''' location, distribution, solution = localisation def inventory(n): return unwords([asset(n), location]) return lambda n: solution if 0 == n else ( unlines([ inventory(n), asset(n), distribution, inventory(pred(n)) ]) ) # asset :: Int -> String def asset(n): '''Quantified asset.''' def suffix(n): return [] if 1 == n else 's' return unwords([ str(n), concat(reversed(concat(cons(suffix(n))(["elttob"])))) ]) # GENERIC ------------------------------------------------- # concat :: [[a]] -> [a] # concat :: [String] -> String def concat(xxs): '''The concatenation of all the elements in a list.''' xs = list(chain.from_iterable(xxs)) unit = '' if isinstance(xs, str) else [] return unit if not xs else ( ''.join(xs) if isinstance(xs[0], str) else xs ) # cons :: a -> [a] -> [a] def cons(x): '''Construction of a list from x as head, and xs as tail.''' return lambda xs: [x] + xs if ( isinstance(xs, list) ) else chain([x], xs) # enumFromThenTo :: Int -> Int -> Int -> [Int] def enumFromThenTo(m): '''Integer values enumerated from m to n with a step defined by nxt-m.''' def go(nxt, n): d = nxt - m return list(range(m, d + n, d)) return lambda nxt: lambda n: ( go(nxt, n) ) # pred :: Enum a => a -> a def pred(x): '''The predecessor of a value. For numeric types, (- 1).''' return x - 1 if isinstance(x, int) else ( chr(ord(x) - 1) ) # unlines :: [String] -> String def unlines(xs): '''A single string derived by the intercalation of a list of strings with the newline character.''' return '\n'.join(xs) # unwords :: [String] -> String def unwords(xs): '''A space-separated string derived from a list of words.''' return ' '.join(xs) if __name__ == '__main__': main() ### Functional, pythonic version Works with: Python version 3 Inspired by Functional version """ 99 Bottles of Beer on the Wall made functional Main function accepts a number of parameters, so you can specify a name of the drink, its container and other things. English only. """ from functools import partial from typing import Callable def regular_plural(noun: str) -> str: """English rule to get the plural form of a word""" if noun[-1] == "s": return noun + "es" return noun + "s" def beer_song( *, location: str = 'on the wall', distribution: str = 'Take one down, pass it around', solution: str = 'Better go to the store to buy some more!', container: str = 'bottle', plurifier: Callable[[str], str] = regular_plural, liquid: str = "beer", initial_count: int = 99, ) -> str: """ Return the lyrics of the beer song :param location: initial location of the drink :param distribution: specifies the process of its distribution :param solution: what happens when we run out of drinks :param container: bottle/barrel/flask or other containers :param plurifier: function converting a word to its plural form :param liquid: the name of the drink in the given container :param initial_count: how many containers available initially """ verse = partial( get_verse, initial_count = initial_count, location = location, distribution = distribution, solution = solution, container = container, plurifier = plurifier, liquid = liquid, ) verses = map(verse, range(initial_count, -1, -1)) return '\n\n'.join(verses) def get_verse( count: int, *, initial_count: str, location: str, distribution: str, solution: str, container: str, plurifier: Callable[[str], str], liquid: str, ) -> str: """Returns the verse for the given amount of drinks""" asset = partial( get_asset, container = container, plurifier = plurifier, liquid = liquid, ) current_asset = asset(count) next_number = count - 1 if count else initial_count next_asset = asset(next_number) action = distribution if count else solution inventory = partial( get_inventory, location = location, ) return '\n'.join(( inventory(current_asset), current_asset, action, inventory(next_asset), )) def get_inventory( asset: str, *, location: str, ) -> str: """ Used to return the first or the fourth line of the verse >>> get_inventory("10 bottles of beer", location="on the wall") "10 bottles of beer on the wall" """ return ' '.join((asset, location)) def get_asset( count: int, *, container: str, plurifier: Callable[[str], str], liquid: str, ) -> str: """ Quantified asset >>> get_asset(0, container="jar", plurifier=regular_plural, liquid='milk') "No more jars of milk" """ containers = plurifier(container) if count != 1 else container spelled_out_quantity = str(count) if count else "No more" return ' '.join((spelled_out_quantity, containers, "of", liquid)) if __name__ == '__main__': print(beer_song()) Output: >>> print(beer_song( liquid = 'milk', location = 'in the fridge', container = 'jug', distribution = 'Take one out, pass it around', initial_count = 2, )) 2 jugs of milk in the fridge 2 jugs of milk Take one out, pass it around 1 jug of milk in the fridge 1 jug of milk in the fridge 1 jug of milk Take one out, pass it around No more jugs of milk in the fridge No more jugs of milk in the fridge No more jugs of milk Better go to the store to buy some more! 2 jugs of milk in the fridge  ### Flexible, OOP, multiprocessing version (exercise of style) Works with: Python version 3.6+ Inspired by the Functional Pythonic Version """ Excercise of style. An overkill for the task :-D 1. OOP, with abstract class and implementation with much common magic methods 2. you can customize: a. the initial number b. the name of the item and its plural c. the string to display when there's no more items d. the normal action e. the final action f. the template used, for foreign languages 3. strofas of the song are created with multiprocessing 4. when you launch it as a script, you can specify an optional parameter for the number of initial items """ from string import Template from abc import ABC, abstractmethod from multiprocessing.pool import Pool as ProcPool from functools import partial import sys class Song(ABC): @abstractmethod def sing(self): """ it must return the song as a text-like object """ pass class MuchItemsSomewhere(Song): eq_attrs = ( "initial_number", "zero_items", "action1", "action2", "item", "items", "strofa_tpl" ) hash_attrs = eq_attrs repr_attrs = eq_attrs __slots__ = eq_attrs + ("_repr", "_hash") def __init__( self, items = "bottles of beer", item = "bottle of beer", where = "on the wall", initial_number = None, zero_items = "No more", action1 = "Take one down, pass it around", action2 = "Go to the store, buy some more", template = None, ): initial_number_true = 99 if initial_number is None else initial_number try: is_initial_number_int = (initial_number_true % 1) == 0 except Exception: is_initial_number_int = False if not is_initial_number_int: raise ValueError("initial_number parameter must be None or a int-like object") if initial_number_true < 0: raise ValueError("initial_number parameter must be >=0") true_tpl = template or """\$i $items1$where
$i$items1
$action$j $items2$where"""

strofa_tpl_tmp = Template(true_tpl)
strofa_tpl = Template(strofa_tpl_tmp.safe_substitute(where=where))

self.zero_items = zero_items
self.action1 = action1
self.action2 = action2
self.initial_number = initial_number_true
self.item = item
self.items = items
self.strofa_tpl = strofa_tpl
self._hash = None
self._repr = None

def strofa(self, number):
zero_items = self.zero_items
item = self.item
items = self.items

if number == 0:
i = zero_items
action = self.action2
j = self.initial_number
else:
i = number
action = self.action1
j = i - 1

if i == 1:
items1 = item
j = zero_items
else:
items1 = items

if j == 1:
items2 = item
else:
items2 = items

return self.strofa_tpl.substitute(
i = i,
j = j,
action = action,
items1 = items1,
items2 = items2
)

def sing(self):
with ProcPool() as proc_pool:
strofa = self.strofa
initial_number = self.initial_number
args = range(initial_number, -1, -1)
return "\n\n".join(proc_pool.map(strofa, args))

def __copy__(self, *args, **kwargs):
return self

def __deepcopy__(self, *args, **kwargs):
return self

def __eq__(self, other, *args, **kwargs):
if self is other:
return True

getmyattr = partial(getattr, self)
getotherattr = partial(getattr, other)
eq_attrs = self.eq_attrs

for attr in eq_attrs:
val = getmyattr(attr)

try:
val2 = getotherattr(attr)
except Exception:
return False

if attr == "strofa_tpl":
val_true = val.safe_substitute()
val2_true = val.safe_substitute()
else:
val_true = val
val2_true = val

if val_true != val2_true:
return False

return True

def __hash__(self, *args, **kwargs):
_hash = self._hash

if _hash is None:
getmyattr = partial(getattr, self)
attrs = self.hash_attrs
hash_true = self._hash = hash(tuple(map(getmyattr, attrs)))
else:
hash_true = _hash

return hash_true

def __repr__(self, *args, **kwargs):
_repr = self._repr

if _repr is None:
repr_attrs = self.repr_attrs
getmyattr = partial(getattr, self)

attrs = []

for attr in repr_attrs:
val = getmyattr(attr)

if attr == "strofa_tpl":
val_true = val.safe_substitute()
else:
val_true = val

attrs.append(f"{attr}={repr(val_true)}")

repr_true = self._repr = f"{self.__class__.__name__}({', '.join(attrs)})"
else:
repr_true = _repr

return repr_true

def muchBeersOnTheWall(num):
song = MuchItemsSomewhere(initial_number=num)

return song.sing()

def balladOfProgrammer(num):
"""
Prints
"99 Subtle Bugs in Production"
or
"The Ballad of Programmer"
"""

song = MuchItemsSomewhere(
initial_number = num,
items = "subtle bugs",
item = "subtle bug",
where = "in Production",
action1 = "Debug and catch, commit a patch",
action2 = "Release the fixes, wait for some tickets",
zero_items = "Zarro",
)

return song.sing()

def main(num):
print(f"### {num} Bottles of Beers on the Wall ###")
print()
print(muchBeersOnTheWall(num))
print()
print()
print('### "The Ballad of Programmer", by Marco Sulla')
print()
print(balladOfProgrammer(num))

if __name__ == "__main__":
# Ok, argparse is **really** too much
argv = sys.argv

if len(argv) == 1:
num = None
elif len(argv) == 2:
try:
num = int(argv[1])
except Exception:
raise ValueError(
f"{__file__} parameter must be an integer, or can be omitted"
)
else:
raise RuntimeError(f"{__file__} takes one parameter at max")

main(num)

__all__ = (Song.__name__, MuchItemsSomewhere.__name__, muchBeersOnTheWall.__name__, balladOfProgrammer.__name__)

## Q

bobw:{[n] {x," bottles of beer on the wall\n",x," bottles of beer\nTake one down, pass it around\n",y," bottles of beer on the wall\n\n"} . string (n;n-1)}
-1 bobw each reverse 1 + til 99

## QB64

[NOTE]: The code below is an amazing, full-on media event! For a simpler version, click HERE.

SCREEN _NEWIMAGE(800, 600, 32)
CONST BottleSpeed = 3
PLAY "<"
MakeBottle
ScaleImage bottle&, .5, .5
t1 = _FREETIMER
ON TIMER(t1, 0.01) DrawBottle
TIMER(t1) ON
FOR x = 99 TO 1 STEP -1
CLS
LOCATE , 35: PRINT x; "bottles of beer on the wall"
: PLAY "e-8e-8e-8<b-8b-8b-8>e-8e-8e-8e-4"
LOCATE , 35: PRINT x; "bottles of beer"
PLAY "f8f8f8c8c8c8f4"
LOCATE , 35: PRINT " Take one down, pass it around"
PLAY "d4d8d8  d8d8d8d4"
LOCATE , 35: PRINT x - 1; "bottles of beer on the wall"
PLAY "<a+8a+8a+8>c8c8d8d+8d+8d+8d+4"
IF INKEY$<> "" THEN SYSTEM NEXT x CLS LOCATE , 35: PRINT "Da fatman drunk all da beer on the wall!" PLAY "e-8e-8e-8<b-8b-8b-8>e-8e-8e-8e-4" LOCATE , 35: PRINT "Da fatman drunk it all!" PLAY "f8f8f8c8c8c8f4" LOCATE , 35: PRINT "Cuss da fatman, send him for more!" PLAY "d4d8d8 d8d8d8d4" LOCATE , 35: PRINT "Someone show him the way out the door!" PLAY "<a+8a+8a+8>c8c8d8d+8d+8d+8d+4" SUB MakeBottle SHARED bottle& bottle& = _NEWIMAGE(56, 144, 32) _DEST bottle& LOCATE 1, 1: PRINT " [=]"; LOCATE 2, 1: PRINT " | |"; LOCATE 3, 1: PRINT " }@{"; LOCATE 4, 1: PRINT " / \"; LOCATE 5, 1: PRINT ":_____;"; LOCATE 6, 1: PRINT "|&&&&&|"; LOCATE 7, 1: PRINT "|&&&&&|"; LOCATE 8, 1: PRINT "|-----|"; LOCATE 9, 1: PRINT "'-----'"; _DEST 0 END SUB SUB ScaleImage (Image AS LONG, xscale AS SINGLE, yscale AS SINGLE) w = _WIDTH(Image): h = _HEIGHT(Image) w2 = w * xscale: h2 = h * yscale NewImage& = _NEWIMAGE(w2, h2, 32) _PUTIMAGE , Image&, NewImage& _FREEIMAGE Image& Image& = NewImage& END SUB SUB DrawBottle SHARED x SHARED bottle& STATIC angle LINE (0, 150)-(800, 600), _RGB32(0, 0, 0), BF angle = angle + BottleSpeed FOR i = 1 TO 20 FOR h = 1 TO 5 IF (h - 1) * 20 + (i - 1) < x THEN DisplayImage bottle&, i * 40 - 20, h * 75 + 150, angle, 0 NEXT NEXT _DISPLAY END SUB SUB DisplayImage (Image AS LONG, x AS INTEGER, y AS INTEGER, angle AS SINGLE, mode AS _BYTE) 'Image is the image handle which we use to reference our image. 'x,y is the X/Y coordinates where we want the image to be at on the screen. 'angle is the angle which we wish to rotate the image. 'mode determines HOW we place the image at point X,Y. 'Mode 0 we center the image at point X,Y 'Mode 1 we place the Top Left corner of oour image at point X,Y 'Mode 2 is Bottom Left 'Mode 3 is Top Right 'Mode 4 is Bottom Right DIM px(3) AS INTEGER, py(3) AS INTEGER, w AS INTEGER, h AS INTEGER DIM sinr AS SINGLE, cosr AS SINGLE, i AS _BYTE w = _WIDTH(Image): h = _HEIGHT(Image) SELECT CASE mode CASE 0 'center px(0) = -w \ 2: py(0) = -h \ 2: px(3) = w \ 2: py(3) = -h \ 2 px(1) = -w \ 2: py(1) = h \ 2: px(2) = w \ 2: py(2) = h \ 2 CASE 1 'top left px(0) = 0: py(0) = 0: px(3) = w: py(3) = 0 px(1) = 0: py(1) = h: px(2) = w: py(2) = h CASE 2 'bottom left px(0) = 0: py(0) = -h: px(3) = w: py(3) = -h px(1) = 0: py(1) = 0: px(2) = w: py(2) = 0 CASE 3 'top right px(0) = -w: py(0) = 0: px(3) = 0: py(3) = 0 px(1) = -w: py(1) = h: px(2) = 0: py(2) = h CASE 4 'bottom right px(0) = -w: py(0) = -h: px(3) = 0: py(3) = -h px(1) = -w: py(1) = 0: px(2) = 0: py(2) = 0 END SELECT sinr = SIN(angle / 57.2957795131): cosr = COS(angle / 57.2957795131) FOR i = 0 TO 3 x2 = (px(i) * cosr + sinr * py(i)) + x: y2 = (py(i) * cosr - px(i) * sinr) + y px(i) = x2: py(i) = y2 NEXT _MAPTRIANGLE (0, 0)-(0, h - 1)-(w - 1, h - 1), Image TO(px(0), py(0))-(px(1), py(1))-(px(2), py(2)) _MAPTRIANGLE (0, 0)-(w - 1, 0)-(w - 1, h - 1), Image TO(px(0), py(0))-(px(3), py(3))-(px(2), py(2)) END SUB ## Qore ### Simple Solution #!/usr/bin/env qore %enable-all-warnings for (my$i = 99; $i > 0;$i--) {
printf("%d bottles of beer on the wall\n", $i); printf("%d bottles of beer\n",$i);
printf("take one down, pass it around\n");
printf("%d bottles of beer on the wall\n", $i); } ### Concurrent (Unordered) Solution #!/usr/bin/env qore %enable-all-warnings %require-types # global variables (truly shared among threads) must be declared with "our" keyword %require-our our Counter$count();

sub t() {
on_exit {
$count.dec(); } my int$i = gettid()-1;
printf("%d bottles of beer on the wall\n", $i); printf("%d bottles of beer\n",$i);
printf("take one down, pass it around\n");
printf("%d bottles of beer on the wall\n", $i); } #-- following run by main thread for (my int$i = 99; $i > 0;$i--)  {
$count.inc(); background t(); }$count.waitForZero();

## Quackery

  [ stack ]                     is bottles      (         --> [       )

[ join carriage join ]        is addline      (      --> $) [ dup 0 = iff$ 'No more'
else [ dup number$]$ ' bottle' join
swap 1 != if [ char s join ]
$' of beer ' join ] is beers ( n -->$       )

$'on the wall' is wall ( -->$       )

$'Take one down, pass it around' is drink ( -->$       )

$'Go to the store, buy some more' is restock ( -->$       )

[ dup beers wall addline
over beers addline
over 0 = iff
[ nip bottles share
swap restock ]
else drink addline
swap 1 -
beers wall join addline ]   is verse        (       n --> $) [ 1+$ '' swap
dup bottles put
times [ i verse addline ]
bottles release ]           is song         (       n --> $) say 'The song "99 Bottles of Beer on the Wall":' cr cr 99 song echo$

## Quill

bottles := void(int count) {
(count > 0) if {
new_count := count - 1;
(
count, " bottles of beer on the wall", nl,
count, " bottles of beer", nl,
"Take one down, pass it around", nl,
new_count, " bottles of beer on the wall"
) print;
new_count bottles
} else {
"No more bottles of beer on the wall!" print
}
};
99 bottles

## Quite BASIC

With grammatical support for "1 bottle of beer"

10 let w=" on the wall"
20 for n=99 to 1 step -1
30 let b=" bottles of beer"
40 if n=1 then let b=" bottle of beer"
50 print n;b;w
60 print n;b
70 print "Take one down, pass it around"
80 if n-1=1 then let b=" bottle of beer"
90 if n-1=0 then let b=" bottles of beer"
100 print n-1;b;w
110 next n

Without grammatical support for "1 bottle of beer"

10 let b=" bottles of beer"
20 let w=" on the wall"
30 for n=99 to 1 step -1
40 print n;b;w
50 print n;b
60 print "Take one down, pass it around"
70 print n-1;b;w
80 next n

## R

### Simple looping solution

#a naive function to sing for N bottles of beer...

song = function(bottles){

for(i in bottles:1){ #for every integer bottles, bottles-1 ... 1

cat(bottles," bottles of beer on the wall \n",bottles," bottles of beer \nTake one down, pass it around \n",
bottles-1, " bottles of beer on the wall \n"," \n" ,sep="")       #join and print the text (\n means new line)

bottles = bottles - 1 #take one down...

}

}

song(99)#play the song by calling the function`