The Twelve Days of Christmas

From Rosetta Code
Revision as of 18:57, 22 February 2022 by Petelomax (talk | contribs) (→‎{{header|Smart BASIC}}: fixed </Lang> tag)
Task
The Twelve Days of Christmas
You are encouraged to solve this task according to the task description, using any language you may know.
Task

Write a program that outputs the lyrics of the Christmas carol The Twelve Days of Christmas. The lyrics can be found here.

(You must reproduce the words in the correct order, but case, format, and punctuation are left to your discretion.)


Other tasks related to string operations:
Metrics
Counting
Remove/replace
Anagrams/Derangements/shuffling
Find/Search/Determine
Formatting
Song lyrics/poems/Mad Libs/phrases
Tokenize
Sequences



11l

Translation of: Python

<lang 11l>V gifts = |‘A partridge in a pear tree.

           Two turtle doves
           Three french hens
           Four calling birds
           Five golden rings
           Six geese a-laying
           Seven swans a-swimming
           Eight maids a-milking
           Nine ladies dancing
           Ten lords a-leaping
           Eleven pipers piping
           Twelve drummers drumming’.split("\n")

V days = ‘first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth’.split(‘ ’)

L(day) days

  V n = L.index + 1
  V g = reversed(gifts[0 .< n])
  print("\nOn the #. day of Christmas\nMy true love gave to me:\n".format(day)‘’g[0 .< (len)-1].join("\n")‘’(I n > 1 {" and\n"g.last} E g.last))</lang>

8080 Assembly

<lang 8080asm>CR: equ 13 LF: equ 10 puts: equ 9 ; CP/M function to write a string to the console bdos: equ 5 ; CP/M entry point org 100h mvi e,0 ; Start with first verse ;;; Print verse verse: lxi h,onthe ; On the call pstr lxi h,ordtab call ptabs ; Nth lxi h,doc call pstr ; day of Christmas, my true love gave to me lxi h,vrstab call ptabs ; ...whatever stuff inr e ; next verse mov a,e cpi 12 ; if at 12, stop jnz verse ; otherwise, print another verse ret ;;; Print the E'th string from the table under HL, ;;; preserving DE registers. ptabs: push d ; Save DE registers mvi d,0 ; Add E*2 to HL, looking up the pointer dad d dad d mov a,m ; Load low byte of pointer inx h mov h,m ; Load high byte of pointer mov l,a xchg ; Store pointer in DE mvi c,puts ; Print string in DE using CP/M call bdos pop d ; Restore registers ret ;;; Print the string under HL, preserving DE registers. pstr: push d xchg mvi c,puts call bdos pop d ret ordtab: dw first,second,third,forth,fifth,sixth dw _7th,eighth,ninth,tenth,_11th,_12th vrstab: dw one,two,three,four,five,six,seven,eight dw nine,ten,eleven,twelve onthe: db 'On the $' first: db 'first$' second: db 'second$' third: db 'third$' forth: db 'forth$' fifth: db 'fifth$' sixth: db 'sixth$' _7th: db 'seventh$' eighth: db 'eighth$' ninth: db 'ninth$' tenth: db 'tenth$' _11th: db 'eleventh$' _12th: db 'twelfth$' doc: db ' day of Christmas',CR,LF db 'My true love gave to me:',CR,LF,'$' twelve: db 'Twelve drummers drumming',CR,LF eleven: db 'Eleven pipers piping',CR,LF ten: db 'Ten lords a-leaping',CR,LF nine: db 'Nine ladies dancing',CR,LF eight: db 'Eight maids a-milking',CR,LF seven: db 'Seven swans a-swimming',CR,LF six: db 'Six geese a-laying',CR,LF five: db 'Five golden rings',CR,LF four: db 'Four calling birds',CR,LF three: db 'Three french hens',CR,LF two: db 'Two turtle doves and',CR,LF one: db 'A partridge in a pear tree.',CR,LF db CR,LF,'$'</lang>

8086 Assembly

Translation of: 8080 Assembly

<lang asm>CR: equ 10 LF: equ 13 puts: equ 9 ; MS-DOS syscall to print string cpu 8086 bits 16 org 100h section .text xor cx,cx ; Start with first verse verse: mov dx,onthe ; On the... call pstr mov si,ord.tab ; Nth call ptabs mov dx,doc ; day of Christmas, my true love call pstr ; gave to me... mov si,vrs.tab ; the gifts call ptabs inc cx ; Next verse cmp cx,12 ; If not last verse, jb verse ; then print next verse. ret ;;; Print the CX'th string from the table in [SI]. ptabs: mov bx,cx ; BX = CX*2 shl bx,1 ; (Each entry is 2 bytes wide) mov dx,[bx+si] ; Retrieve table entry ;;; Print the string in DX. pstr: mov ah,puts ; Tell DOS to print the string int 21h ret section .data onthe: db 'On the $' ord: .n1: db 'first$' .n2: db 'second$' .n3: db 'third$' .n4: db 'forth$' .n5: db 'fifth$' .n6: db 'sixth$' .n7: db 'seventh$' .n8: db 'eighth$' .n9: db 'ninth$' .n10: db 'tenth$' .n11: db 'eleventh$' .n12: db 'twelfth$' .tab: dw .n1,.n2,.n3,.n4,.n5,.n6 dw .n7,.n8,.n9,.n10,.n11,.n12 doc: db ' day of Christmas',CR,LF db 'My true love gave to me:',CR,LF,'$' vrs: .n12: db 'Twelve drummers drumming',CR,LF .n11: db 'Eleven pipers piping',CR,LF .n10: db 'Ten lords a-leaping',CR,LF .n9: db 'Nine ladies dancing',CR,LF .n8: db 'Eight maids a-milking',CR,LF .n7: db 'Seven swans a-swimming',CR,LF .n6: db 'Six geese a-laying',CR,LF .n5: db 'Five golden rings',CR,LF .n4: db 'Four calling birds',CR,LF .n3: db 'Three french hens',CR,LF .n2: db 'Two turtle doves and',CR,LF .n1: db 'A partridge in a pear tree.',CR,LF db CR,LF,'$' .tab: dw .n1,.n2,.n3,.n4,.n5,.n6 dw .n7,.n8,.n9,.n10,.n11,.n12</lang>

Action!

<lang Action!>PROC Wait(BYTE frames)

 BYTE RTCLOK=$14
 frames==+RTCLOK
 WHILE frames#RTCLOK DO OD

RETURN

PROC Main()

 DEFINE PTR="CARD"
 PTR ARRAY num(12),obj(12)
 BYTE i,j
 num(0)="first" num(1)="second" num(2)="third"
 num(3)="fourth" num(4)="fifth" num(5)="sixth"
 num(6)="seventh" num(7)="eight" num(8)="ninth"
 num(9)="tenth" num(10)="eleventh" num(11)="Twelfth"
 obj(0)="And a partridge in a pear tree."
 obj(1)="Two turtle doves"
 obj(2)="Three french hens"
 obj(3)="Four calling birds"
 obj(4)="Five golden rings"
 obj(5)="Six geese a-laying"
 obj(6)="Seven swans a-swimming"
 obj(7)="Eight maids a-milking"
 obj(8)="Nine ladies dancing"
 obj(9)="Ten lords a-leaping"
 obj(10)="Eleven pipers piping"
 obj(11)="Twelve drummers drumming"
 FOR i=0 TO 11
 DO
   PrintF("On the %S day of Christmas,%E",num(i))
   PrintE("My true love gave to me:")
   IF i=0 THEN
     PrintE("A partridge in a pear tree.")
   ELSE
     j=i+1
     WHILE j>0
     DO
       j==-1
       PrintE(obj(j))
     OD
   FI
   PutE()
   Wait(50)
 OD

RETURN</lang>

Output:

Screenshot from Atari 8-bit computer

On the first day of Christmas,
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas,
My true love gave to me:
Two turtle doves
And a partridge in a pear tree.

...

On the Twelfth day of Christmas,
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
And a partridge in a pear tree.

ActionScript

This program outputs the lyrics to a TextField object. The text field can be scrolled using the mouse wheel (Windows only) or by using the up/down arrow keys on the keyboard.

Works with: Flash Player version 10
Works with: AIR version 1.5

(Although the code can work in Flash Player 9 by replacing the Vectors with Arrays)

<lang ActionScript>package {

   import flash.display.Sprite;
   import flash.events.Event;
   import flash.events.KeyboardEvent;
   import flash.events.MouseEvent;
   import flash.text.TextField;
   import flash.text.TextFieldAutoSize;
   import flash.text.TextFormat;
   import flash.ui.Keyboard;
   
   public class TwelveDaysOfChristmas extends Sprite {
       
       private var _textArea:TextField = new TextField();
       
       public function TwelveDaysOfChristmas() {
           if ( stage ) _init();
           else addEventListener(Event.ADDED_TO_STAGE, _init);
       }
       
       private function _init(e:Event = null):void {
           
           removeEventListener(Event.ADDED_TO_STAGE, _init);
           
           _textArea = new TextField();
           _textArea.x = 10;
           _textArea.y = 10;
           _textArea.autoSize = TextFieldAutoSize.LEFT;
           _textArea.wordWrap = true;
           _textArea.width = stage.stageWidth - 20;
           _textArea.height = stage.stageHeight - 10;
           _textArea.multiline = true;
           
           var format:TextFormat = new TextFormat();
           format.size = 14;
           _textArea.defaultTextFormat = format;
           
           var verses:Vector.<String> = new Vector.<String>(12, true);
           var lines:Vector.<String>;
           
           var days:Vector.<String> = new Vector.<String>(12, true);
           var gifts:Vector.<String> = new Vector.<String>(12, true);
           
           days[0] = 'first';
           days[1] = 'second';
           days[2] = 'third';
           days[3] = 'fourth';
           days[4] = 'fifth';
           days[5] = 'sixth';
           days[6] = 'seventh';
           days[7] = 'eighth';
           days[8] = 'ninth';
           days[9] = 'tenth';
           days[10] = 'eleventh';
           days[11] = 'twelfth';
           
           gifts[0] = 'A partridge in a pear tree';
           gifts[1] = 'Two turtle doves';
           gifts[2] = 'Three french hens';
           gifts[3] = 'Four calling birds';
           gifts[4] = 'Five golden rings';
           gifts[5] = 'Six geese a-laying';
           gifts[6] = 'Seven swans a-swimming';
           gifts[7] = 'Eight maids a-milking';
           gifts[8] = 'Nine ladies dancing';
           gifts[9] = 'Ten lords a-leaping';
           gifts[10] = 'Eleven pipers piping';
           gifts[11] = 'Twelve drummers drumming';
           
           var i:uint, j:uint, k:uint, line:String;
           
           for ( i = 0; i < 12; i++ ) {
               
               lines = new Vector.<String>(i + 2, true);
               lines[0] = "On the " + days[i] + " day of Christmas, my true love gave to me";
               
               j = i + 1;
               k = 0;
               while ( j-- > 0 )
                   lines[++k] = gifts[j];
               
               verses[i] = lines.join('\n');
               
               if ( i == 0 )
                   gifts[0] = 'And a partridge in a pear tree';
               
           }
           
           var song:String = verses.join('\n\n');
           _textArea.text = song;
           addChild(_textArea);
           
           _textArea.addEventListener(MouseEvent.MOUSE_WHEEL, _onMouseWheel);
           stage.addEventListener(KeyboardEvent.KEY_DOWN, _onKeyDown);
           
       }
       
       private function _onKeyDown(e:KeyboardEvent):void {
           if ( e.keyCode == Keyboard.DOWN )
               _textArea.y -= 40;
           else if ( e.keyCode == Keyboard.UP )
               _textArea.y += 40;
       }
       
       private function _onMouseWheel(e:MouseEvent):void {
           _textArea.y += 20 * e.delta;
       }
       
   }
   

}</lang>

Ada

<lang Ada>with Ada.Text_IO; use Ada.Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;

procedure Twelve_Days_Of_Christmas is

  type Days is (First, Second, Third, Fourth, Fifth, Sixth,

Seventh, Eighth, Ninth, Tenth, Eleventh, Twelfth);

  package E_IO is new Ada.Text_IO.Enumeration_IO(Days);
  use E_IO;
  
  Gifts : array (Days) of Unbounded_String :=
    (To_Unbounded_String(" A partridge in a pear-tree."),
     To_Unbounded_String(" Two turtle doves"),
     To_Unbounded_String(" Three French hens"),
     To_Unbounded_String(" Four calling birds"),
     To_Unbounded_String(" Five golden rings"),
     To_Unbounded_String(" Six geese a-laying"),
     To_Unbounded_String(" Seven swans a-swimming"),
     To_Unbounded_String(" Eight maids a-milking"),
     To_Unbounded_String(" Nine ladies dancing"),
     To_Unbounded_String(" Ten lords a-leaping"),
     To_Unbounded_String(" Eleven pipers piping"),
     To_Unbounded_String(" Twelve drummers drumming"));

begin

  for Day in Days loop
     Put("On the "); Put(Day, Set => Lower_Case); Put(" day of Christmas,");
     New_Line; Put_Line("My true love gave to me:");
     for D in reverse Days'First..Day loop

Put_Line(To_String(Gifts(D)));

     end loop;
     if Day = First then

Replace_Slice(Gifts(Day), 2, 2, "And a");

     end if;
     New_Line;
  end loop;

end Twelve_Days_Of_Christmas; </lang>

ALGOL 68

Works with: ALGOL 68 Genie

<lang algol68>BEGIN

 []STRING labels = ("first", "second", "third",    "fourth",
                    "fifth", "sixth",  "seventh",  "eighth",
                    "ninth", "tenth",  "eleventh", "twelfth");
 []STRING gifts = ("A partridge in a pear tree.",
                   "Two turtle doves, and",
                   "Three French hens,",
                   "Four calling birds,",
                   "Five gold rings,",
                   "Six geese a-laying,",
                   "Seven swans a-swimming,",
                   "Eight maids a-milking,",
                   "Nine ladies dancing,",
                   "Ten lords a-leaping,",
                   "Eleven pipers piping,",
                   "Twelve drummers drumming,");
 FOR day TO 12 DO
   print(("On the ", labels[day],
          " day of Christmas, my true love sent to me:", newline));
   FOR gift FROM day BY -1 TO 1 DO
     print((gifts[gift], newline))
   OD;
   print(newline)
 OD

END</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves, and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves, and
A partridge in a pear tree.

AppleScript

Iterative

<lang applescript>set gifts to {"A partridge in a pear tree.", "Two turtle doves, and", ¬ "Three French hens,", "Four calling birds,", ¬ "Five gold rings,", "Six geese a-laying,", ¬ "Seven swans a-swimming,", "Eight maids a-milking,", ¬ "Nine ladies dancing,", "Ten lords a-leaping,", ¬ "Eleven pipers piping,", "Twelve drummers drumming"}

set labels to {"first", "second", "third", "fourth", "fifth", "sixth", ¬ "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"}

repeat with day from 1 to 12 log "On the " & item day of labels & " day of Christmas, my true love sent to me:" repeat with gift from day to 1 by -1 log item gift of gifts end repeat log "" end repeat</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves, and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves, and
A partridge in a pear tree.


Functional composition

Drawing on some functional primitives, and post-Yosemite AppleScript's ability to import Foundation classes:

<lang AppleScript>use framework "Foundation"

property pstrGifts : "A partridge in a pear tree, Two turtle doves, Three French hens, " & ¬

   "Four calling birds, Five golden rings, Six geese a-laying, " & ¬
   "Seven swans a-swimming, Eight maids a-milking, Nine ladies dancing, " & ¬
   "Ten lords a-leaping, Eleven pipers piping, Twelve drummers drumming"

property pstrOrdinals : "first, second, third, fourth, fifth, " & ¬

   "sixth, seventh, eighth, ninth, tenth, eleventh, twelfth"

-- DAYS OF XMAS ------------------------------------------------------------

-- daysOfXmas :: () -> String on daysOfXmas()

   -- csv :: String -> [String]
   script csv
       on |λ|(str)
           splitOn(", ", str)
       end |λ|
   end script
   
   set {gifts, ordinals} to map(csv, [pstrGifts, pstrOrdinals])
   
   -- verseOfTheDay :: Int -> String
   script verseOfTheDay
       
       -- dayGift :: Int -> String
       script dayGift
           on |λ|(n, i)
               set strGift to item n of gifts
               if n = 1 then
                   set strFirst to strGift & " !"
                   if i is not 1 then
                       "And " & toLower(text 1 of strFirst) & text 2 thru -1 of strFirst
                   else
                       strFirst
                   end if
               else if n = 5 then
                   toUpper(strGift)
               else
                   strGift
               end if
           end |λ|
       end script
       
       on |λ|(intDay)
           "On the " & item intDay of ordinals & " day of Xmas, my true love gave to me ..." & ¬
               linefeed & intercalate("," & linefeed, ¬
               map(dayGift, enumFromTo(intDay, 1)))
           
       end |λ|
   end script
   
   intercalate(linefeed & linefeed, ¬
       map(verseOfTheDay, enumFromTo(1, length of ordinals)))
   

end daysOfXmas

-- TEST --------------------------------------------------------------------- on run

   daysOfXmas()
   

end run


-- GENERIC FUNCTIONS --------------------------------------------------------

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

-- splitOn :: Text -> Text -> [Text] on splitOn(strDelim, strMain)

   set {dlm, my text item delimiters} to {my text item delimiters, strDelim}
   set lstParts to text items of strMain
   set my text item delimiters to dlm
   return lstParts

end splitOn

-- toLower :: String -> String on toLower(str)

   set ca to current application
   ((ca's NSString's stringWithString:(str))'s ¬
       lowercaseStringWithLocale:(ca's NSLocale's currentLocale())) as text

end toLower

-- toUpper :: String -> String on toUpper(str)

   set ca to current application
   ((ca's NSString's stringWithString:(str))'s ¬
       uppercaseStringWithLocale:(ca's NSLocale's currentLocale())) as text

end toUpper</lang>

Output:
On the first day of Xmas, my true love gave to me ...
A partridge in a pear tree !

On the second day of Xmas, my true love gave to me ...
Two turtle doves,
And a partridge in a pear tree !

...

On the twelfth day of Xmas, my true love gave to me ...
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three French hens,
Two turtle doves,
And a partridge in a pear tree !

Arturo

<lang rebol>gifts: [

   "A partridge in a pear tree."
   "Two turtle doves"
   "Three french hens"
   "Four calling birds"
   "Five golden rings"
   "Six geese a-laying"
   "Seven swans a-swimming"
   "Eight maids a-milking"
   "Nine ladies dancing"
   "Ten lords a-leaping"
   "Eleven pipers piping"
   "Twelve drummers drumming"

]

days: ["first" "second" "third" "fourth" "fifth" "sixth"

      "seventh" "eighth" "ninth" "tenth" "eleventh" "twelfth"]

loop.with:'n days 'day [

   g: reverse slice gifts 0 n
   print ~"On the |day| day of Christmas\n" ++
         "My true love gave to me:\n" ++
         (join.with:"\n" chop g) ++
         (n>0)? -> " and \n" ++ last g
                -> capitalize last g
   print ""

]</lang>

Output:
On the first day of Christmas
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas
My true love gave to me:
Two turtle doves and 
A partridge in a pear tree.

On the third day of Christmas
My true love gave to me:
Three french hens
Two turtle doves and 
A partridge in a pear tree.

On the fourth day of Christmas
My true love gave to me:
Four calling birds
Three french hens
Two turtle doves and 
A partridge in a pear tree.

On the fifth day of Christmas
My true love gave to me:
Five golden rings
Four calling birds
Three french hens
Two turtle doves and 
A partridge in a pear tree.

On the sixth day of Christmas
My true love gave to me:
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and 
A partridge in a pear tree.

On the seventh day of Christmas
My true love gave to me:
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and 
A partridge in a pear tree.

On the eighth day of Christmas
My true love gave to me:
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and 
A partridge in a pear tree.

On the ninth day of Christmas
My true love gave to me:
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and 
A partridge in a pear tree.

On the tenth day of Christmas
My true love gave to me:
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and 
A partridge in a pear tree.

On the eleventh day of Christmas
My true love gave to me:
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and 
A partridge in a pear tree.

On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and 
A partridge in a pear tree.

AutoHotkey

<lang AutoHotkey>nth := ["first","second","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth"] lines := ["A partridge in a pear tree." ,"Two turtle doves and" ,"Three french hens" ,"Four calling birds" ,"Five golden rings" ,"Six geese a-laying" ,"Seven swans a-swimming" ,"Eight maids a-milking" ,"Nine ladies dancing" ,"Ten lords a-leaping" ,"Eleven pipers piping" ,"Twelve drummers drumming"]

full:="", mid:="" loop % lines.MaxIndex() { top:="On the " . nth[A_Index] . " day of Christmas,`nMy true love gave to me:" mid:= lines[A_Index] . "`n" . mid full:= full . top . "`n" . mid . ((A_Index<lines.MaxIndex())?"`n":"") } MsgBox % full</lang>

AWK

<lang AWK>

  1. syntax: GAWK -f THE_TWELVE_DAYS_OF_CHRISTMAS.AWK

BEGIN {

   gifts[++i] = "a partridge in a pear tree."
   gifts[++i] = "two turtle doves, and"
   gifts[++i] = "three french hens,"
   gifts[++i] = "four calling birds,"
   gifts[++i] = "five golden rings,"
   gifts[++i] = "six geese a-laying,"
   gifts[++i] = "seven swans a-swimming,"
   gifts[++i] = "eight maids a-milking,"
   gifts[++i] = "nine ladies dancing,"
   gifts[++i] = "ten lords a-leaping,"
   gifts[++i] = "eleven pipers piping,"
   gifts[++i] = "twelve drummers drumming,"
   split("first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth",days_arr," ")
   for (i=1; i<=12; i++) {
     printf("On the %s day of Christmas,\n",days_arr[i])
     print("my true love gave to me:")
     for (j=i; j>0; j--) {
       printf("%s\n",gifts[j])
     }
     print("")
   }
   exit(0)

} </lang>

Output:
On the first day of Christmas,
my true love gave to me:
a partridge in a pear tree.

On the second day of Christmas,
my true love gave to me:
two turtle doves, and
a partridge in a pear tree.

...

On the twelfth day of Christmas,
my true love gave to me:
twelve drummers drumming,
eleven pipers piping,
ten lords a-leaping,
nine ladies dancing,
eight maids a-milking,
seven swans a-swimming,
six geese a-laying,
five golden rings,
four calling birds,
three french hens,
two turtle doves, and
a partridge in a pear tree.

Batch File

<lang dos>:: The Twelve Days of Christmas

Batch File Implementation

@echo off

Pseudo-array for Days

set "day1=First" set "day2=Second" set "day3=Third" set "day4=Fourth" set "day5=Fifth" set "day6=Sixth" set "day7=Seventh" set "day8=Eighth" set "day9=Nineth" set "day10=Tenth" set "day11=Eleventh" set "day12=Twelveth"

Pseudo-array for Gifts

set "gift12=Twelve drummers drumming" set "gift11=Eleven pipers piping" set "gift10=Ten loards a-leaping" set "gift9=Nine ladies dancing" set "gift8=Eight maids a-milking" set "gift7=Seven swans a-swimming" set "gift6=Six geese a-laying" set "gift5=Five golden rings" set "gift4=Four calling birds" set "gift3=Three french hens" set "gift2=Two turtle doves" set "gift1=A partridge in a pear tree"

Display It!

setlocal enabledelayedexpansion for /l %%i in (1,1,12) do ( echo On the !day%%i! day of Christmas

       echo My true love gave to me:

for /l %%j in (%%i,-1,1) do ( if %%j equ 1 ( if %%i neq 1 <nul set /p ".=And " echo !gift1!. ) else ( echo !gift%%j!, ) ) echo( ) exit /b</lang>

BASIC

<lang basic>10 DEFINT I,J: DEFSTR N,V: DIM N(12),V(12) 20 FOR I=1 TO 12: READ N(I): NEXT 30 FOR I=1 TO 12: READ V(I): NEXT 40 FOR I=1 TO 12 50 PRINT "On the ";N(I);" day of Christmas" 60 PRINT "My true love gave to me:" 70 FOR J=I TO 1 STEP -1: PRINT V(J): NEXT 75 PRINT 80 NEXT 90 END 100 DATA first,second,third,fourth,fifth,sixth 110 DATA seventh,eighth,ninth,tenth,eleventh,twelfth 120 DATA "A partridge in a pear tree." 130 DATA "Two turtle doves and" 140 DATA "Three french hens" 150 DATA "Four calling birds" 160 DATA "Five golden rings" 170 DATA "Six geese a-laying" 180 DATA "Seven swans a-swimming" 190 DATA "Eight maids a-milking" 200 DATA "Nine ladies dancing" 210 DATA "Ten lords a-leaping" 220 DATA "Eleven pipers piping" 230 DATA "Twelve drummers drumming"</lang>

BCPL

<lang BCPL>get "libhdr"

let ordinal(n) =

   n=1 -> "first",     n=2 -> "second",    n=3 -> "third",
   n=4 -> "fourth",    n=5 -> "fifth",     n=6 -> "sixth",
   n=7 -> "seventh",   n=8 -> "eighth",    n=9 -> "ninth",
   n=10 -> "tenth",    n=11 -> "eleventh", n=12 -> "twelfth",
   valof finish

let gift(n) =

   n=1 -> "A partridge in a pear tree.",
   n=2 -> "Two turtle doves, and",
   n=3 -> "Three french hens,",
   n=4 -> "Four calling birds,",
   n=5 -> "Five golden rings,",
   n=6 -> "Six geese a-laying,",
   n=7 -> "Seven swans a-swimming,",
   n=8 -> "Eight maids a-milking,",
   n=9 -> "Nine ladies dancing,",
   n=10 -> "Ten lords a-leaping,",
   n=11 -> "Eleven pipers piping,",
   n=12 -> "Twelve drummers drumming,",
   valof finish
   

let verse(n) be $( writef("On the %S day of Christmas,*N", ordinal(n))

   writes("My true love gave to me:*N")
   for i=n to 1 by -1 do writef("%S*N", gift(i))
   wrch('*N')

$)

let start() be for n=1 to 12 do verse(n)</lang>

Befunge

This is essentially the same algorithm as Old lady swallowed a fly - just a different set of phrases and a simpler song pattern. <lang befunge>0246*+00p20#v_:#`2#g+#0:#0<>\#%"O"/#:3#:+#< g48*- >1-:!#v_\1+::"O"%\"O"/v >-#11#\0#50#< g2-:00p4v >\#%"O"/#::$#<3#$+g48*-v^\,+*+ 55!:*!!-"|":g+3<

            ^02_>#`>#< 2 5 3 1 0 \1-:#^\_^#:-1\+<00_@#:>#<$<

(On the ?|A partridge in a pear tree.||&first% andL day of Christmas,|My true l ove gave to me:2|Two turtle doves'second3|Three french hens&third4|Four calling

birds'fourth3|Five golden rings&fifth4|Six geese a-laying&sixth8|Seven swans a

-swimming(seventh7|Eight maids a-milking'eighth5|Nine ladies dancing&ninth5|Ten

lords a-leaping&tenth6|Eleven pipers piping)eleventh:|Twelve drummers drumming

(twelfth</lang>

Bracmat

<lang bracmat>( first

     second
     third
     fourth
     fifth
     sixth
     seventh
     eighth
     ninth
     tenth
     eleventh
     twelveth
 : ?days

& "A partridge in a pear tree."

     "Two turtle doves and"
     "Three french hens,"
     "Four calling birds,"
     "Five golden rings,"
     "Six geese a-laying,"
     "Seven swans a-swimming,"
     "Eight maids a-milking,"
     "Nine ladies dancing,"
     "Ten lords a-leaping,"
     "Eleven pipers piping,"
     "Twelve drummers drumming,"
 : ?gifts

& :?given & whl

 ' ( !gifts:%?gift ?gifts
   & !gift \n !given:?given
   & !days:%?day ?days
   &   out
     $ ( str
       $ ("\nOn the " !day " day of Christmas my true love gave to me:

" !given)

       )
   )

);</lang>

C

<lang C>

  1. include<stdio.h>

int main() {

   int i,j;

   char days[12][10] = 
   {
       "First",
       "Second",
       "Third",
       "Fourth",
       "Fifth",
       "Sixth",
       "Seventh",
       "Eighth",
       "Ninth",
       "Tenth",
       "Eleventh",
       "Twelfth"
   };
   char gifts[12][33] =
   {
       "Twelve drummers drumming",
       "Eleven pipers piping",
       "Ten lords a-leaping",
       "Nine ladies dancing",
       "Eight maids a-milking",
       "Seven swans a-swimming",
       "Six geese a-laying",
       "Five golden rings",
       "Four calling birds",
       "Three french hens", 
       "Two turtle doves", 
       "And a partridge in a pear tree."
   };

   for(i=0;i<12;i++)
   {
       printf("\n\nOn the %s day of Christmas\nMy true love gave to me:",days[i]);

       for(j=i;j>=0;j--)
       {
           (i==0)?printf("\nA partridge in a pear tree."):printf("\n%s%c",gifts[11-j],(j!=0)?',':' ');
       }
   }

   return 0;

}</lang>

C#

<lang csharp>using System;

public class TwelveDaysOfChristmas {

   public static void Main() {
       string[] days = new string[12] {
           "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth",
           "tenth", "eleventh", "twelfth",
       };
       string[] gifts = new string[12] {
           "A partridge in a pear tree",
           "Two turtle doves",
           "Three french hens",
           "Four calling birds",
           "Five golden rings",
           "Six geese a-laying",
           "Seven swans a-swimming",
           "Eight maids a-milking",
           "Nine ladies dancing",
           "Ten lords a-leaping",
           "Eleven pipers piping",
           "Twelve drummers drumming"
       };
       for ( int i = 0; i < 12; i++ ) {
           Console.WriteLine("On the " + days[i] + " day of Christmas, my true love gave to me");
           int j = i + 1;
           while ( j-- > 0 )
               Console.WriteLine(gifts[j]);
           Console.WriteLine();
           if ( i == 0 )
               gifts[0] = "And a partridge in a pear tree";
       }
   }

}</lang>

C++

<lang cpp>#include <iostream>

  1. include <array>
  2. include <string>

using namespace std;

int main() {

   const array<string, 12> days
   {
       "first",
       "second",
       "third",
       "fourth",
       "fifth",
       "sixth",
       "seventh",
       "eighth",
       "ninth",
       "tenth",
       "eleventh",
       "twelfth"
   };
 
   const array<string, 12> gifts
   {
       "And a partridge in a pear tree",
       "Two turtle doves",
       "Three french hens",
       "Four calling birds",
       "FIVE GOLDEN RINGS",
       "Six geese a-laying",
       "Seven swans a-swimming",
       "Eight maids a-milking",
       "Nine ladies dancing",
       "Ten lords a-leaping",
       "Eleven pipers piping",
       "Twelve drummers drumming"
   };
   for(int i = 0; i < days.size(); ++i)
   {
       cout << "On the " << days[i] << " day of christmas, my true love gave to me\n";
       if(i == 0)
       {
           cout << "A partridge in a pear tree\n";
       }
       else
       {
           int j = i + 1;
           while(j-- > 0) cout << gifts[j] << '\n';
       }
       cout << '\n';
   }
   return 0;

}</lang>

Clojure

Translation of: Raku

<lang clojure>(let

 [numbers '(first second third fourth fifth sixth
            seventh eighth ninth tenth eleventh twelfth)
  gifts   ["And a partridge in a pear tree",   "Two turtle doves",
           "Three French hens",                "Four calling birds",
           "Five gold rings",                  "Six geese a-laying",
           "Seven swans a-swimming",           "Eight maids a-milking",
           "Nine ladies dancing",              "Ten lords a-leaping",
           "Eleven pipers piping",             "Twelve drummers drumming"]
  day     (fn [n]
              (printf "On the %s day of Christmas, my true love sent to me\n"
                      (nth numbers n)))]
 (day 0)
 (println  (clojure.string/replace (first gifts) "And a" "A"))
 (dorun (for [d (range 1 12)] (do
   (println)
   (day d)
   (dorun (for [n (range d -1 -1)]
     (println (nth gifts n))))))))

</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

CLU

<lang clu>christmas = cluster is carol

   rep = null
   
   own ordinals: array[string] := array[string]$[
       "first", "second", "third", "fourth", "fifth",
       "sixth", "seventh", "eighth", "ninth", "tenth",
       "eleventh", "twelfth"
   ]
   
   own gifts: array[string] := array[string]$[
       "A partridge in a pear tree.",
       "Two turtle doves, and",
       "Three french hens,",
       "Four calling birds,",
       "Five golden rings,",
       "Six geese a-laying,",
       "Seven swans a-swimming,",
       "Eight maids a-milking,",
       "Nine ladies dancing,",
       "Ten lords a-leaping,",
       "Eleven pipers piping,",
       "Twelve drummers drumming,"
   ]
   
   verse = proc (s: stream, n: int)
       stream$putl(s, "On the " || ordinals[n] || " day of Christmas,")
       stream$putl(s, "My true love gave to me:")
       for gift: int in int$from_to_by(n, 1, -1) do
           stream$putl(s, gifts[gift])
       end
       stream$putl(s, "")
   end verse
   
   carol = proc (s: stream)
       for n: int in int$from_to(1, 12) do
           verse(s, n)
       end
   end carol

end christmas

start_up = proc ()

   christmas$carol(stream$primary_output())

end start_up</lang>

COBOL

Works with: GNU Cobol version 2.0

<lang cobol> >>SOURCE FREE PROGRAM-ID. twelve-days-of-christmas.

DATA DIVISION. WORKING-STORAGE SECTION. 01 gifts-area VALUE "partridge in a pear tree "

   & "Two turtle doves              "
   & "Three french hens             "
   & "Four calling birds            "
   & "FIVE GOLDEN RINGS             "
   & "Six geese a-laying            "
   & "Seven swans a-swimming        "
   & "Eight maids a-milking         "
   & "Nine ladies dancing           "
   & "Ten lords a-leaping           "
   & "Eleven pipers piping          "
   & "Twelve drummers drumming      ".
   03  gifts                           PIC X(30) OCCURS 12 TIMES
                                       INDEXED BY gift-idx.

01 ordinals-area VALUE "first second third fourth fifth "

   & "sixth     seventh   eighth    ninth     tenth     eleventh  twelfth   ".
   03  ordinals                        PIC X(10) OCCURS 12 TIMES.

01 day-num PIC 99 COMP.

PROCEDURE DIVISION.

   PERFORM VARYING day-num FROM 1 BY 1 UNTIL day-num > 12
       DISPLAY "On the " FUNCTION TRIM(ordinals (day-num)) " day of Christmas,"
           " my true love gave to me"
       IF day-num = 1
           DISPLAY "A " gifts (1)
       ELSE
           PERFORM VARYING gift-idx FROM day-num BY -1 UNTIL gift-idx = 1
               DISPLAY gifts (gift-idx)
           END-PERFORM
           DISPLAY "And a " gifts (1)
       END-IF
       
       DISPLAY SPACE
   END-PERFORM
   .

END PROGRAM twelve-days-of-christmas.</lang>

Common Lisp

<lang lisp>let

 ((gifts '("A partridge in a pear tree." "Two turtle doves, and"
           "Three French hens,"          "Four calling birds,"
           "Five gold rings,"            "Six geese a-laying,"
           "Seven swans a-swimming,"     "Eight maids a-milking,"
           "Nine ladies dancing,"        "Ten lords a-leaping,"
           "Eleven pipers piping,"       "Twelve drummers drumming," )))
  (loop for day from 1 to 12 doing
    (format t "On the ~:r day of Christmas, my true love sent to me:~%" day)
    (loop for gift from (1- day) downto 0 doing
       (format t "~a~%" (nth gift gifts)))
    (format t "~%")))

</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

Cowgol

<lang cowgol>include "cowgol.coh";

var ordinals: [uint8][] := {

   "first","second","third","fourth","fifth",
   "sixth","seventh","eighth","ninth","tenth",
   "eleventh","twelfth"

};

var gifts: [uint8][] := {

   "Twelve drummers drumming",
   "Eleven pipers piping",
   "Ten lords a-leaping",
   "Nine ladies dancing",
   "Eight maids a-milking",
   "Seven swans a-swimming",
   "Six geese a-laying",
   "Five golden rings",
   "Four calling birds",
   "Three french hens",
   "Two turtle doves and",
   "A partridge in a pear tree."

};

var verse: @indexof ordinals := 0; var gift: @indexof gifts; while verse < 12 loop

   print("On the ");
   print(ordinals[verse]);
   print(" day of Christmas, my true love gave to me:\n");
   gift := 11 - verse;
   while gift < 12 loop
       print(gifts[gift]);
       print_nl();
       gift := gift + 1;
   end loop;
   print_nl();
   verse := verse + 1;

end loop;</lang>

Crystal

Translation of: Ruby

<lang ruby>days = "first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth".split " " gifts = "A partridge in a pear tree Two turtle doves and Three french hens Four calling birds Five golden rings Six geese a-laying Seven swans a-swimming Eight maids a-milking Nine ladies dancing Ten lords a-leaping Eleven pipers piping Twelve drummers drumming".split "\n"

days.each_with_index do |day, i|

   puts "On the #{day} day of Christmas\nMy true love gave to me:"
   gifts[0, i + 1].reverse.each &->puts(String)
   puts

end</lang>

D

Translation of: Python

<lang d>immutable gifts = "A partridge in a pear tree. Two turtle doves Three french hens Four calling birds Five golden rings Six geese a-laying Seven swans a-swimming Eight maids a-milking Nine ladies dancing Ten lords a-leaping Eleven pipers piping Twelve drummers drumming";

immutable days = "first second third fourth fifth

                 sixth seventh eighth ninth tenth
                 eleventh twelfth";

void main() @safe {

   import std.stdio, std.string, std.range;
   foreach (immutable n, immutable day; days.split) {
       auto g = gifts.splitLines.take(n + 1).retro;
       writeln("On the ", day,
               " day of Christmas\nMy true love gave to me:\n",
               g[0 .. $ - 1].join('\n'),
               (n > 0 ? " and\n" ~ g.back : g.back.capitalize), '\n');
   }

}</lang>

dc

<lang dc>0

d [first] r :n d [A partridge in a pear tree.] r :g 1 +

d [second] r :n d [Two turtle doves and] r :g 1 +

d [third] r :n d [Three French hens,] r :g 1 +

d [fourth] r :n d [Four calling birds,] r :g 1 +

d [fifth] r :n d [Five gold rings,] r :g 1 +

d [sixth] r :n d [Six geese a-laying,] r :g 1 +

d [seventh] r :n d [Seven swans a-swimming,] r :g 1 +

d [eighth] r :n d [Eight maids a-milking,] r :g 1 +

d [ninth] r :n d [Nine ladies dancing,] r :g 1 +

d [tenth] r :n d [Ten lords a-leaping,] r :g 1 +

d [eleventh] r :n d [Eleven pipers piping,] r :g 1 +

d [twelfth] r :n

 [Twelve drummers drumming,]   r :g 

[

 d 
 ;g n 
 10 P 

] sp

[

 d 
 0 r !<p 
 1 - 
 d 
 0 r !<r 

] sr

[

 [On the ] n 
 d ;n n 
 [ day of Christmas, my true love sent to me:] n 
 10 P 
 d 
 lr x s_
 10 P
 1 + 
 d 
 12 r <l

] sl

0 ll x </lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

Dyalect

<lang dyalect>let days = [

   "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth",
   "tenth", "eleventh", "twelfth"

] let gifts = [

   "A partridge in a pear tree",
   "Two turtle doves",
   "Three french hens",
   "Four calling birds",
   "Five golden rings",
   "Six geese a-laying",
   "Seven swans a-swimming",
   "Eight maids a-milking",
   "Nine ladies dancing",
   "Ten lords a-leaping",
   "Eleven pipers piping",
   "Twelve drummers drumming"

]

for i in 0..11 {

   print("On the \(days[i]) day of Christmas, my true love gave to me.")
   for j in i^-1..0 {
       print(gifts[j])
   }
   print()

}</lang>

Eiffel

<lang Eiffel> class APPLICATION

create make

feature

make do twelve_days_of_christmas end

feature {NONE}

twelve_days_of_christmas -- Christmas carol: Twelve days of christmas. local i, j: INTEGER do create gifts.make_empty create days.make_empty gifts := <<"A partridge in a pear tree.", "Two turtle doves and", "Three french hens", "Four calling birds", "Five golden rings", "Six geese a-laying", "Seven swans a-swimming", "Eight maids a-milking", "Nine ladies dancing", "Ten lords a-leaping", "Eleven pipers piping", "Twelve drummers drumming", "And a partridge in a pear tree.", "Two turtle doves">> days := <<"first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "Twelfth">> from i := 1 until i > days.count loop io.put_string ("On the " + days [i] + " day of Christmas.%N") io.put_string ("My true love gave to me:%N") from j := i until j <= 0 loop if i = 12 and j = 2 then io.put_string (gifts [14] + "%N") io.put_string (gifts [13] + "%N") j := j - 1 else io.put_string (gifts [j] + "%N") end j := j - 1 end io.new_line i := i + 1 end end

gifts: ARRAY [STRING]

days: ARRAY [STRING]

end </lang>

Elena

Translation of: C++

ELENA 5.0 : <lang elena>import extensions;

public program() {

   var days := new string[]{
           "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth",
           "tenth", "eleventh", "twelfth"
           };

   var gifts := new string[]{
           "And a partridge in a pear tree",
           "Two turtle doves",
           "Three french hens",
           "Four calling birds",
           "Five golden rings",
           "Six geese a-laying",
           "Seven swans a-swimming",
           "Eight maids a-milking",
           "Nine ladies dancing",
           "Ten lords a-leaping",
           "Eleven pipers piping",
           "Twelve drummers drumming"
       };

   for(int i := 0, i < 12, i += 1)
   {
       console.printLine("On the ", days[i], " day of Christmas, my true love gave to me");

       if (i == 0)
       {
           console.printLine("A partridge in a pear tree")
       }
       else
       {
           for(int j := i, j >= 0, j -= 1)
           {
               console.printLine(gifts[j])
           }
       };

       console.printLine()
   }

}</lang>

Elixir

<lang elixir>gifts = """ A partridge in a pear tree Two turtle doves and Three french hens Four calling birds Five golden rings Six geese a-laying Seven swans a-swimming Eight maids a-milking Nine ladies dancing Ten lords a-leaping Eleven pipers piping Twelve drummers drumming """ |> String.split("\n", trim: true)

days = ~w(first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth)

Enum.with_index(days) |> Enum.each(fn {day, i} ->

 IO.puts "On the #{day} day of Christmas"
 IO.puts "My true love gave to me:"
 Enum.take(gifts, i+1) |> Enum.reverse |> Enum.each(&IO.puts &1)
 IO.puts ""

end)</lang>

Output:
On the first day of Christmas
My true love gave to me:
A partridge in a pear tree

On the second day of Christmas
My true love gave to me:
Two turtle doves and
A partridge in a pear tree

...

On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

Erlang

<lang erlang>-module(twelve_days). -export([gifts_for_day/1]).

names(N) -> lists:nth(N,

             ["first",   "second", "third", "fourth", "fifth",    "sixth", 
              "seventh", "eighth", "ninth", "tenth",  "eleventh", "twelfth" ]).

gifts() -> [ "A partridge in a pear tree.", "Two turtle doves and",

            "Three French hens,",          "Four calling birds,",
            "Five gold rings,",            "Six geese a-laying,",
            "Seven swans a-swimming,",     "Eight maids a-milking,",
            "Nine ladies dancing,",        "Ten lords a-leaping,",
            "Eleven pipers piping,",       "Twelve drummers drumming," ].

gifts_for_day(N) ->

 "On the " ++ names(N) ++ " day of Christmas, my true love sent to me:\n" ++
 string:join(lists:reverse(lists:sublist(gifts(), N)), "\n").

main(_) -> lists:map(fun(N) -> io:fwrite("~s~n~n", [gifts_for_day(N)]) end,

                    lists:seq(1,12)).

</lang>

Output:
On the first day of Christmas, my true love sent to me:

A partridge in a pear tree.

On the second day of Christmas, my true love sent to me: Two turtle doves and A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me: Twelve drummers drumming, Eleven pipers piping, Ten lords a-leaping, Nine ladies dancing, Eight maids a-milking, Seven swans a-swimming, Six geese a-laying, Five gold rings, Four calling birds, Three French hens, Two turtle doves and

A partridge in a pear tree.

F#

<lang fsharp>let gifts = [

   "And a partridge in a pear tree";
   "Two turtle doves";
   "Three french hens";
   "Four calling birds";
   "FIVE GOLDEN RINGS";
   "Six geese a-laying";
   "Seven swans a-swimming";
   "Eight maids a-milking";
   "Nine ladies dancing";
   "Ten lords a-leaping";
   "Eleven pipers piping";
   "Twelve drummers drumming"

]

let days = [

   "first"; "second"; "third"; "fourth"; "fifth"; "sixth"; "seventh"; "eighth";
   "ninth"; "tenth"; "eleventh"; "twelfth"

]

let displayGifts day =

   printfn "On the %s day of Christmas, my true love gave to me" days.[day]
   if day = 0 then
       printfn "A partridge in a pear tree"
   else
       List.iter (fun i -> printfn "%s" gifts.[i]) [day..(-1)..0]
   printf "\n"
   

List.iter displayGifts [0..11]</lang>

Factor

<lang factor>USING: formatting io kernel math math.ranges qw sequences ; IN: rosetta-code.twelve-days-of-christmas

CONSTANT: opener

   "On the %s day of Christmas, my true love sent to me:\n"

CONSTANT: ordinals qw{

   first second third fourth fifth sixth seventh eighth ninth
   tenth eleventh twelfth

}

CONSTANT: gifts {

   "A partridge in a pear tree."
   "Two turtle doves, and"
   "Three french hens,"
   "Four calling birds,"
   "Five golden rings,"
   "Six geese a-laying,"
   "Seven swans a-swimming,"
   "Eight maids a-milking,"
   "Nine ladies dancing,"
   "Ten lords a-leaping,"
   "Eleven pipers piping,"
   "Twelve drummers drumming,"

}

descend ( n -- ) 0 [a,b] [ gifts nth print ] each nl ;
verse ( n -- )
   1 - [ ordinals nth opener printf ] [ descend ] bi ;
   
twelve-days-of-christmas ( -- ) 12 [1,b] [ verse ] each ;

MAIN: twelve-days-of-christmas</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves, and
A partridge in a pear tree.

...

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

Forth

Works with: GNU Forth

<lang forth>create ordinals s" first" 2, s" second" 2, s" third" 2, s" fourth" 2,

               s" fifth" 2, s" sixth"  2, s" seventh"  2, s" eighth" 2,
               s" ninth" 2, s" tenth"  2, s" eleventh" 2, s" twelfth" 2,
ordinal ordinals swap 2 * cells + 2@ ;

create gifts s" A partridge in a pear tree." 2,

            s" Two turtle doves and" 2,
            s" Three French hens," 2,
            s" Four calling birds," 2,
            s" Five gold rings," 2,
            s" Six geese a-laying," 2,
            s" Seven swans a-swimming," 2,
            s" Eight maids a-milking," 2,
            s" Nine ladies dancing," 2,
            s" Ten lords a-leaping," 2,
            s" Eleven pipers piping," 2,
            s" Twelve drummers drumming," 2,
gift gifts swap 2 * cells + 2@ ;
day
 s" On the " type 
 dup ordinal type
 s"  day of Christmas, my true love sent to me:" type
 cr
 -1 swap -do
   i gift type cr
 1 -loop
 cr
 ;

main
 12 0 do i day loop

main bye </lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

Fortran

Works with: FORTRAN version 77

<lang fortran> program twelve_days

     character days(12)*8
     data days/'first', 'second', 'third',    'fourth',
    c          'fifth', 'sixth',  'seventh',  'eighth',
    c          'ninth', 'tenth',  'eleventh', 'twelfth'/
     character gifts(12)*27
     data gifts/'A partridge in a pear tree.',
    c           'Two turtle doves and',
    c           'Three French hens,',
    c           'Four calling birds,',
    c           'Five gold rings,',
    c           'Six geese a-laying,',
    c           'Seven swans a-swimming,',
    c           'Eight maids a-milking,',
    c           'Nine ladies dancing,',
    c           'Ten lords a-leaping,',
    c           'Eleven pipers piping,',
    c           'Twelve drummers drumming,'/
     integer day, gift
     do 10 day=1,12
       write (*,'(a)') 'On the ', trim(days(day)),
    c              ' day of Christmas, my true love sent to me:'
       do 20 gift=day,1,-1
         write (*,'(a)') trim(gifts(gift))
 20    continue
       write(*,*)
 10  continue
     end

</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

 [...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

FreeBASIC

<lang freebasic>' version 10-01-2017 ' compile with: fbc -s console

Dim As ULong d, r

Dim As String days(1 To ...) = { "first", "second", "third", "fourth", _

                               "fifth", "sixth", "seventh", "eighth", _
                             "ninth", "tenth", "eleventh", "twelfth" }

Dim As String gifts(1 To ...) = { "", " Two turtle doves", _

             " Three french hens", " Four calling birds", _
             " Five golden rings", " Six geese a-laying", _
     " Seven swans a-swimming", " Eight maids a-milking", _
          " Nine ladies dancing", " Ten lords a-leaping", _
    " Eleven pipers piping", " Twelve drummers drumming" }

For d = 1 To 12

   Print " On the " + days(d) + " day of Christmas"
   Print " My true love gave to me:"
   For r = d To 3 Step -1
       Print gifts(r)
   Next
   ' print " Two turtle doves" for the twelfth day and add "and" for the other days
   If d > 1 Then
       Print gifts(2); iif(d = 12, "", " and")
   End If
   ' print "A partridge...", on the twelfth day print "And a partrige..."
   Print " A" & IIf(d = 12, "nd a", "" ) & " partridge in a pear tree"
   Print

Next

' empty keyboard buffer While Inkey <> "" : Wend Print : 'Print "hit any key to end program" Sleep End</lang>

Output:
 On the first day of Christmas
 My true love gave to me:
 A partridge in a pear tree

 On the second day of Christmas
 My true love gave to me:
 Two turtle doves and
 A partridge in a pear tree

 '''

 On the twelfth day of Christmas
 My true love gave to me:
 Twelve drummers drumming
 Eleven pipers piping
 Ten lords a-leaping
 Nine ladies dancing
 Eight maids a-milking
 Seven swans a-swimming
 Six geese a-laying
 Five golden rings
 Four calling birds
 Three french hens
 Two turtle doves
 And a partridge in a pear tree

Go

Go Playground <lang go>package main

import ( "fmt" )

func main() { days := []string{"first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"}

gifts := []string{"A Partridge in a Pear Tree", "Two Turtle Doves and", "Three French Hens", "Four Calling Birds", "Five Gold Rings", "Six Geese a-Laying", "Seven Swans a-Swimming", "Eight Maids a-Milking", "Nine Ladies Dancing", "Ten Lords a-Leaping", "Eleven Pipers Piping", "Twelve Drummers Drumming"}

for i := 0; i < 12; i++ { fmt.Printf("On the %s day of Christmas,\n", days[i]) fmt.Println("My true love sent to me:")

for j := i; j >= 0; j-- { fmt.Println(gifts[j]) } fmt.Println() } } </lang>

Groovy

<lang groovy>def presents = ['A partridge in a pear tree.', 'Two turtle doves', 'Three french hens', 'Four calling birds',

       'Five golden rings', 'Six geese a-laying', 'Seven swans a-swimming', 'Eight maids a-milking',
       'Nine ladies dancing', 'Ten lords a-leaping', 'Eleven pipers piping', 'Twelve drummers drumming']

['first', 'second', 'third', 'forth', 'fifth', 'sixth', 'seventh', 'eight', 'ninth', 'tenth', 'eleventh', 'Twelfth'].eachWithIndex{ day, dayIndex ->

   println "On the $day day of Christmas"
   println 'My true love gave to me:'
   (dayIndex..0).each { p ->
       print presents[p]
       println p == 1 ? ' and' : 
   }
   println()

}</lang>

Haskell

Translation of: F#

<lang haskell>gifts :: [String] gifts =

 [ "And a partridge in a pear tree!",
   "Two turtle doves,",
   "Three french hens,",
   "Four calling birds,",
   "FIVE GOLDEN RINGS,",
   "Six geese a-laying,",
   "Seven swans a-swimming,",
   "Eight maids a-milking,",
   "Nine ladies dancing,",
   "Ten lords a-leaping,",
   "Eleven pipers piping,",
   "Twelve drummers drumming,"
 ]

days :: [String] days =

 [ "first",
   "second",
   "third",
   "fourth",
   "fifth",
   "sixth",
   "seventh",
   "eighth",
   "ninth",
   "tenth",
   "eleventh",
   "twelfth"
 ]

verseOfTheDay :: Int -> IO () verseOfTheDay day = do

 putStrLn $
   "On the " <> days !! day
     <> " day of Christmas my true love gave to me... "
 mapM_ putStrLn [dayGift day d | d <- [day, day -1 .. 0]]
 putStrLn ""
 where
   dayGift 0 _ = "A partridge in a pear tree!"
   dayGift _ gift = gifts !! gift

main :: IO () main = mapM_ verseOfTheDay [0 .. 11]</lang>

Output:
On the first day of Christmas my true love gave to me... 
A partridge in a pear tree!

On the second day of Christmas my true love gave to me... 
Two turtle doves,
And a partridge in a pear tree!

On the third day of Christmas my true love gave to me... 
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

On the fourth day of Christmas my true love gave to me... 
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

On the fifth day of Christmas my true love gave to me... 
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

On the sixth day of Christmas my true love gave to me... 
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

On the seventh day of Christmas my true love gave to me... 
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

On the eighth day of Christmas my true love gave to me... 
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

On the ninth day of Christmas my true love gave to me... 
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

On the tenth day of Christmas my true love gave to me... 
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

On the eleventh day of Christmas my true love gave to me... 
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

On the twelfth day of Christmas my true love gave to me... 
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree!

Icon and Unicon

Works in both languages. <lang unicon>procedure main()

   days := ["first","second","third","fourth","fifth","sixth","seventh",
            "eighth","ninth","tenth","eleventh","twelveth"]
   gifts := ["A partridge in a pear tree.", "Two turtle doves and",
             "Three french hens,", "Four calling birds,",
             "Five golden rings,", "Six geese a-laying,",
             "Seven swans a-swimming,", "Eight maids a-milking,",
             "Nine ladies dancing,", "Ten lords a-leaping,",
             "Eleven pipers piping,", "Twelve drummers drumming,"]
   every write("\nOn the ",days[day := 1 to 12]," day of Christmas my true love gave to me:") do
       every write(" ",gifts[day to 1 by -1])

end</lang>

J

<lang j>require 'strings' NB. not necessary for versions > j6

days=: ;:'first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth'

gifts=: <;.2 ] 0 : 0 And a partridge in a pear tree. Two turtle doves, Three french hens, Four calling birds, Five golden rings, Six geese a-laying, Seven swans a-swimming, Eight maids a-milking, Nine ladies dancing, Ten lords a-leaping, Eleven pipers piping, Twelve drummers drumming, )

firstline=: 'On the ' , ,&(' day of Christmas, my true love gave to me',LF)

chgFirstVerse=: rplc&('nd a';)&.>@{. , }.

makeVerses=: [: chgFirstVerse (firstline&.> days) ,&.> [: <@;@|.\ gifts"_

singCarol=: LF joinstring makeVerses</lang>

Java

<lang java>public class TwelveDaysOfChristmas {

   final static String[] gifts = {
       "A partridge in a pear tree.", "Two turtle doves and",
       "Three french hens", "Four calling birds",
       "Five golden rings", "Six geese a-laying",
       "Seven swans a-swimming", "Eight maids a-milking",
       "Nine ladies dancing", "Ten lords a-leaping",
       "Eleven pipers piping", "Twelve drummers drumming",
       "And a partridge in a pear tree.", "Two turtle doves"
   };
   final static String[] days = {
       "first", "second", "third", "fourth", "fifth", "sixth", "seventh",
       "eighth", "ninth", "tenth", "eleventh", "Twelfth"
   };
   public static void main(String[] args) {
       for (int i = 0; i < days.length; i++) {
           System.out.printf("%nOn the %s day of Christmas%n", days[i]);
           System.out.println("My true love gave to me:");
           for (int j = i; j >= 0; j--)
               System.out.println(gifts[i == 11 && j < 2 ? j + 12 : j]);
       }
   }

}</lang>

JavaScript

<lang JavaScript> var days = [

   'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth',
   'tenth', 'eleventh', 'twelfth',

];

var gifts = [

   "A partridge in a pear tree",
   "Two turtle doves",
   "Three french hens",
   "Four calling birds",
   "Five golden rings",
   "Six geese a-laying",
   "Seven swans a-swimming",
   "Eight maids a-milking",
   "Nine ladies dancing",
   "Ten lords a-leaping",
   "Eleven pipers piping",
   "Twelve drummers drumming"

];

var lines, verses = [], song;

for ( var i = 0; i < 12; i++ ) {

   lines = [];
   lines[0] = "On the " + days[i] + " day of Christmas, my true love gave to me";
   
   var j = i + 1;
   var k = 0;
   while ( j-- > 0 )
       lines[++k] = gifts[j];


   verses[i] = lines.join('\n');
   
   if ( i == 0 )
       gifts[0] = "And a partridge in a pear tree";
   

}

song = verses.join('\n\n'); document.write(song); </lang>


Alternatively, in a functional style of JavaScript, we can define the ancient song "strPrepn the lstOrdinal[i] strUnit of strHoliday" as an expression, and return that expression in a human-legible and machine-parseable JSON string translation, for further analysis and processing :-)

<lang JavaScript>JSON.stringify(

 (function (
   strPrepn,
   strHoliday,
   strUnit,
   strRole,
   strProcess,
   strRecipient
 ) {
   var lstOrdinal =
     'first second third fourth fifth sixth\
          seventh eighth ninth tenth eleventh twelfth'
     .split(/\s+/),
     lngUnits = lstOrdinal.length,
     lstGoods =
     'A partridge in a pear tree.\
          Two turtle doves\
          Three french hens\
          Four calling birds\
          Five golden rings\
          Six geese a-laying\
          Seven swans a-swimming\
          Eight maids a-milking\
          Nine ladies dancing\
          Ten lords a-leaping\
          Eleven pipers piping\
          Twelve drummers drumming'
     .split(/\s{2,}/),
     lstReversed = (function () {
       var lst = lstGoods.slice(0);
       return (lst.reverse(), lst);
     })(),
     strProvenance = [strRole, strProcess, strRecipient + ':'].join(' '),
     strPenultimate = lstReversed[lngUnits - 2] + ' and',
     strFinal = lstGoods[0];
   return lstOrdinal.reduce(
     function (sofar, day, i) {
       return sofar.concat(
         [
           [
             [ // abstraction of line 1
               strPrepn,
               'the',
               lstOrdinal[i],
               strUnit,
               'of',
               strHoliday
             ].join(' '),
             strProvenance
           ].concat( // reversed descent through memory
             (i > 1 ? [lstGoods[i]] : []).concat(
               lstReversed.slice(
                 lngUnits - i,
                 lngUnits - 2
               )
             ).concat( // penultimate line ends with 'and'
               [
                 strPenultimate,
                 strFinal
               ].slice(i ? 0 : 1)
             )
           )
         ]
       );
     }, []
   );
 })(
   'On', 'Christmas', 'day', 'my true love', 'gave to', 'me'
 ), null, 2

);</lang>

Note that the Google Closure compiler's translation of this would be half the size, but rather less legible. (It does make interesting suggestions though – the semi-colon segmentation of the verses below is a trick that might be worth remembering).

<lang JavaScript>JSON.stringify(function (h, k, l, f, m, n) {

 var c =
   "first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth"
   .split(" "),
   d = c.length,
   e =
   "A partridge in a pear tree.;Two turtle doves;Three french hens;Four calling birds;Five golden rings;Six geese a-laying;Seven swans a-swimming;Eight maids a-milking;Nine ladies dancing;Ten lords a-leaping;Eleven pipers piping;Twelve drummers drumming"
   .split(";"),
   g = function () {
     var b = e.slice(0);
     return b.reverse(), b;
   }(),
   p = [f, m, n + ":"].join(" "),
   q = g[d - 2] + " and",
   r = e[0];
   
 return c.reduce(function (b, f, a) {
   return b.concat([[[h, "the", c[a], l, "of", k].join(" "), p].concat((1 <
     a ? [e[a]] : []).concat(g.slice(d - a, d - 2)).concat([q, r].slice(a ?
     0 : 1)))]);
 }, []);

}("On", "Christmas", "day", "my true love", "gave to", "me"), null, 2);</lang>

Formatted JSON output (the expanded and Closure-compiled versions above both yield the same output).

<lang JavaScript>[

 [
   "On the first day of Christmas",
   "my true love gave to me:",
   "A partridge in a pear tree."
 ],
 [
   "On the second day of Christmas",
   "my true love gave to me:",
   "Two turtle doves and",
   "A partridge in a pear tree."
 ],
 [
   "On the third day of Christmas",
   "my true love gave to me:",
   "Three french hens",
   "Two turtle doves and",
   "A partridge in a pear tree."
 ],
 [
   "On the fourth day of Christmas",
   "my true love gave to me:",
   "Four calling birds",
   "Three french hens",
   "Two turtle doves and",
   "A partridge in a pear tree."
 ],
 [
   "On the fifth day of Christmas",
   "my true love gave to me:",
   "Five golden rings",
   "Four calling birds",
   "Three french hens",
   "Two turtle doves and",
   "A partridge in a pear tree."
 ]

//... etc.

]</lang>

jq

<lang jq>[ "one", "two", "three", "four", "five", "six",

   "seven", "eight", "nine", "ten", "eleven", "twelve"] as $cardinals

| [ "first", "second", "third", "fourth", "fifth", "sixth",

   "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"] as $ordinals

| [ "a partridge in a pear tree.", "turtle doves", "French hens",

   "calling birds", "gold rings", "geese a-laying", "swans a-swimming",
   "maids a-milking", "ladies dancing", "lords a-leaping", "pipers piping",
   "drummers drumming" ] as $gifts

| range(12) | . as $i | $ordinals[$i] as $nth | "On the " + $nth + " day of Christmas, my true love sent to me:\n" +

 ([[range($i+1)]|reverse[]|. as $j|$cardinals[$j] as $count|
    if $j > 0 then $count else if $i > 0 then "and" else "" end end + 
     " " + $gifts[$j] + if $j > 0 then "," else "\n" end]
 | join("\n"))

</lang>

Run with

jq -rnf programfile.jq

to yield this result:

Output:
On the first day of Christmas, my true love sent to me:
 a partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
two turtle doves,
and a partridge in a pear tree.

On the third day of Christmas, my true love sent to me:
three French hens,
two turtle doves,
and a partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
twelve drummers drumming,
eleven pipers piping,
ten lords a-leaping,
nine ladies dancing,
eight maids a-milking,
seven swans a-swimming,
six geese a-laying,
five gold rings,
four calling birds,
three French hens,
two turtle doves,
and a partridge in a pear tree.

Jsish

Based on Javascript entry, almost identical, added unitTest. <lang javascript>#!/usr/bin/env jsish "use strict";

/* Twelve Days Of Christmas, in Jsish */ var days = [

   'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth',
   'tenth', 'eleventh', 'twelfth'

];

var gifts = [

   "A partridge in a pear tree",
   "Two turtle doves",
   "Three french hens",
   "Four calling birds",
   "Five golden rings",
   "Six geese a-laying",
   "Seven swans a-swimming",
   "Eight maids a-milking",
   "Nine ladies dancing",
   "Ten lords a-leaping",
   "Eleven pipers piping",
   "Twelve drummers drumming"

];

var lines, verses = [], song;

for ( var i = 0; i < 12; i++ ) {

   lines = [];
   lines[0] = "On the " + days[i] + " day of Christmas, my true love gave to me";

   var j = i + 1;
   var k = 0;
   while ( j-- > 0 )
       lines[++k] = gifts[j];

   verses[i] = lines.join('\n');

   if ( i == 0 )
       gifts[0] = "And a partridge in a pear tree";

}

song = verses.join('\n\n');

song;

/*

!EXPECTSTART!

song ==> On the first day of Christmas, my true love gave to me A partridge in a pear tree

On the second day of Christmas, my true love gave to me Two turtle doves And a partridge in a pear tree

On the third day of Christmas, my true love gave to me Three french hens Two turtle doves And a partridge in a pear tree

On the fourth day of Christmas, my true love gave to me Four calling birds Three french hens Two turtle doves And a partridge in a pear tree

On the fifth day of Christmas, my true love gave to me Five golden rings Four calling birds Three french hens Two turtle doves And a partridge in a pear tree

On the sixth day of Christmas, my true love gave to me Six geese a-laying Five golden rings Four calling birds Three french hens Two turtle doves And a partridge in a pear tree

On the seventh day of Christmas, my true love gave to me Seven swans a-swimming Six geese a-laying Five golden rings Four calling birds Three french hens Two turtle doves And a partridge in a pear tree

On the eighth day of Christmas, my true love gave to me Eight maids a-milking Seven swans a-swimming Six geese a-laying Five golden rings Four calling birds Three french hens Two turtle doves And a partridge in a pear tree

On the ninth day of Christmas, my true love gave to me Nine ladies dancing Eight maids a-milking Seven swans a-swimming Six geese a-laying Five golden rings Four calling birds Three french hens Two turtle doves And a partridge in a pear tree

On the tenth day of Christmas, my true love gave to me Ten lords a-leaping Nine ladies dancing Eight maids a-milking Seven swans a-swimming Six geese a-laying Five golden rings Four calling birds Three french hens Two turtle doves And a partridge in a pear tree

On the eleventh day of Christmas, my true love gave to me Eleven pipers piping Ten lords a-leaping Nine ladies dancing Eight maids a-milking Seven swans a-swimming Six geese a-laying Five golden rings Four calling birds Three french hens Two turtle doves And a partridge in a pear tree

On the twelfth day of Christmas, my true love gave to me Twelve drummers drumming Eleven pipers piping Ten lords a-leaping Nine ladies dancing Eight maids a-milking Seven swans a-swimming Six geese a-laying Five golden rings Four calling birds Three french hens Two turtle doves And a partridge in a pear tree

!EXPECTEND!

  • /</lang>
Output:

The verses are in the unitTest. --U mode to show the echo mode output skipped here.

prompt$ jsish -u twelveDaysOfChristmas.jsi
[PASS] twelveDaysOfChristmas.jsi

Julia

<lang julia># v0.6.0

function printlyrics()

   const gifts = split("""
   A partridge in a pear tree.
   Two turtle doves
   Three french hens
   Four calling birds
   Five golden rings
   Six geese a-laying
   Seven swans a-swimming
   Eight maids a-milking
   Nine ladies dancing
   Ten lords a-leaping
   Eleven pipers piping
   Twelve drummers drumming
   """, '\n')
   const days = split("""
   first second third fourth fifth
   sixth seventh eighth ninth tenth
   eleventh twelfth""")
   for (n, day) in enumerate(days)
       g = gifts[n:-1:1]
       print("\nOn the $day day of Christmas\nMy true love gave to me:\n")
       if n == 1
           print(join(g[1:end], '\n'), '\n')
       else
           print(join(g[1:end-1], '\n'), " and\n", g[end], '\n')
       end
   end

end

printlyrics()</lang>

Output:
On the first day of Christmas
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas
My true love gave to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree.

Kotlin

Translation of: C#

<lang scala>enum class Day {

   first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth;
   val header = "On the " + this + " day of Christmas, my true love sent to me\n\t"

}

fun main(x: Array<String>) {

   val gifts = listOf("A partridge in a pear tree",
                      "Two turtle doves and",
                      "Three french hens",
                      "Four calling birds",
                      "Five golden rings",
                      "Six geese a-laying",
                      "Seven swans a-swimming",
                      "Eight maids a-milking",
                      "Nine ladies dancing",
                      "Ten lords a-leaping",
                      "Eleven pipers piping",
                      "Twelve drummers drumming")
   Day.values().forEachIndexed { i, d -> println(d.header + gifts.slice(0..i).asReversed().joinToString("\n\t")) }

}</lang>

Lambdatalk

<lang scheme> {def days

  first second third fourth fifth sixth
  seventh eight ninth tenth eleventh twelfth}

-> days

{def texts

  {quote A partridge in a pear tree.}
  {quote Two turtle doves and}
  {quote Three french hens}
  {quote Four calling birds}
  {quote Five golden rings}
  {quote Six geese a-laying}
  {quote Seven swans a-swimming}
  {quote Eight maids a-milking}
  {quote Nine ladies dancing}
  {quote Ten lords a-leaping}
  {quote Eleven pipers piping}
  {quote Twelve drummers drumming}} 

-> texts

{S.map {lambda {:i} {hr}On the {S.get :i {days}} day of Christmas

                   {br}My true love gave to me               
                   {S.map {lambda {:i} {br}{S.get :i {texts}}} 
                          {S.serie :i 0 -1}} 
      } {S.serie 0 {- {S.length {days}} 1}}}   

-> On the first day of Christmas My true love gave to me A partridge in a pear tree.

On the second day of Christmas My true love gave to me Two turtle doves and A partridge in a pear tree.

...

On the twelfth day of Christmas My true love gave to me Twelve drummers drumming Eleven pipers piping Ten lords a-leaping Nine ladies dancing Eight maids a-milking Seven swans a-swimming Six geese a-laying Five golden rings Four calling birds Three french hens Two turtle doves and A partridge in a pear tree. </lang>

<lang logo>make "numbers [first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth] make "gifts [[And a partridge in a pear tree] [Two turtle doves] [Three French hens]

              [Four calling birds]             [Five gold rings]      [Six geese a-laying]
              [Seven swans a-swimming]         [Eight maids a-miling] [Nine ladies dancing]
              [Ten lords a-leaping]            [Eleven pipers piping] [Twelve drummers drumming]]

to nth :n

 print (sentence [On the] (item :n :numbers) [day of Christmas, my true love sent to me])

end

nth 1 print [A partridge in a pear tree]

for [d 2 12] [

 print []
 nth :d
 for [g :d 1] [
   print item :g gifts
 ]

] bye</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

LOLCODE

Works with: LCI 0.10

<lang>CAN HAS STDIO? HAI 1.2

I HAS A Dayz ITZ A BUKKIT Dayz HAS A SRS 1 ITZ "first" Dayz HAS A SRS 2 ITZ "second" Dayz HAS A SRS 3 ITZ "third" Dayz HAS A SRS 4 ITZ "fourth" Dayz HAS A SRS 5 ITZ "fifth" Dayz HAS A SRS 6 ITZ "sixth" Dayz HAS A SRS 7 ITZ "seventh" Dayz HAS A SRS 8 ITZ "eighth" Dayz HAS A SRS 9 ITZ "ninth" Dayz HAS A SRS 10 ITZ "tenth" Dayz HAS A SRS 11 ITZ "eleventh" Dayz HAS A SRS 12 ITZ "twelfth"

I HAS A Prezents ITZ A BUKKIT Prezents HAS A SRS 1 ITZ "A partridge in a pear tree" Prezents HAS A SRS 2 ITZ "Two turtle doves" Prezents HAS A SRS 3 ITZ "Three French hens" Prezents HAS A SRS 4 ITZ "Four calling birds" Prezents HAS A SRS 5 ITZ "Five gold rings" Prezents HAS A SRS 6 ITZ "Six geese a-laying" Prezents HAS A SRS 7 ITZ "Seven swans a-swimming" Prezents HAS A SRS 8 ITZ "Eight maids a-milking" Prezents HAS A SRS 9 ITZ "Nine ladies dancing" Prezents HAS A SRS 10 ITZ "Ten lords a-leaping" Prezents HAS A SRS 11 ITZ "Eleven pipers piping" Prezents HAS A SRS 12 ITZ "Twelve drummers drumming"

IM IN YR Outer UPPIN YR i WILE DIFFRINT i AN 12

 I HAS A Day ITZ SUM OF i AN 1
 VISIBLE "On the " !
 VISIBLE Dayz'Z SRS Day !
 VISIBLE " day of Christmas, my true love sent to me"
 IM IN YR Inner UPPIN YR j WILE DIFFRINT j AN  Day
   I HAS A Count ITZ DIFFERENCE OF Day AN j
   VISIBLE Prezents'Z SRS Count
 IM OUTTA YR Inner
 BOTH SAEM i AN 0 
 O RLY? 
   YA RLY
     Prezents'Z SRS 1 R "And a partridge in a pear tree"
 OIC
 DIFFRINT i AN 11
   O RLY?
     YA RLY
       VISIBLE ""
 OIC

IM OUTTA YR Outer

KTHXBYE</lang>

Output:
On the first day of Christmas, my true love sent to me
A partridge in a pear tree

On the second day of Christmas, my true love sent to me
Two turtle doves
And a partridge in a pear tree

[...]

On the twelfth day of Christmas, my true love sent to me
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five gold rings
Four calling birds
Three French hens
Two turtle doves
And a partridge in a pear tree

Lua

<lang Lua> local days = {

   'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth',
   'tenth', 'eleventh', 'twelfth',

}

local gifts = {

   "A partridge in a pear tree",
   "Two turtle doves",
   "Three french hens",
   "Four calling birds",
   "Five golden rings",
   "Six geese a-laying",
   "Seven swans a-swimming",
   "Eight maids a-milking",
   "Nine ladies dancing",
   "Ten lords a-leaping",
   "Eleven pipers piping",
   "Twelve drummers drumming",

}

local verses = {}

for i = 1, 12 do

   local lines = {}
   lines[1] = "On the " .. days[i] .. " day of Christmas, my true love gave to me"
   
   local j = i
   local k = 2
   repeat
       lines[k] = gifts[j]
       k = k + 1
       j = j - 1
   until j == 0
   
   verses[i] = table.concat(lines, '\n')

end

print(table.concat(verses, '\n\n')) </lang>

MAD

<lang MAD> NORMAL MODE IS INTEGER

           THROUGH VERSE, FOR I=1, 1, I.G.12
           PRINT FORMAT XMS,ORD(I)
           PRINT FORMAT TLV
           TRANSFER TO GIFT(13-I)

GIFT(1) PRINT FORMAT G12 GIFT(2) PRINT FORMAT G11 GIFT(3) PRINT FORMAT G10 GIFT(4) PRINT FORMAT G9 GIFT(5) PRINT FORMAT G8 GIFT(6) PRINT FORMAT G7 GIFT(7) PRINT FORMAT G6 GIFT(8) PRINT FORMAT G5 GIFT(9) PRINT FORMAT G4 GIFT(10) PRINT FORMAT G3 GIFT(11) PRINT FORMAT G2 GIFT(12) PRINT FORMAT G1 VERSE PRINT FORMAT MT

           VECTOR VALUES XMS = 
         0        $7HON THE ,C,S1,16HDAY OF CHRISTMAS*$
           VECTOR VALUES ORD = $*$, $FIRST$, $SECOND$, $THIRD$
         0 ,      $FOURTH$, $FIFTH$, $SIXTH$, $SEVENTH$, $EIGHTH$
         1 ,      $NINTH$, $TENTH$, $ELEVENTH$, $TWELFTH$
           VECTOR VALUES TLV = $23HMY TRUE LOVE GAVE TO ME*$
           VECTOR VALUES G12 = $24HTWELVE DRUMMERS DRUMMING*$
           VECTOR VALUES G11 = $20HELEVEN PIPERS PIPING*$
           VECTOR VALUES G10 = $19HTEN LORDS A-LEAPING*$
           VECTOR VALUES G9  = $19HNINE LADIES DANCING*$
           VECTOR VALUES G8  = $21HEIGHT MAIDS A-MILKING*$
           VECTOR VALUES G7  = $22HSEVEN SWANS A-SWIMMING*$
           VECTOR VALUES G6  = $18HSIX GEESE A-LAYING*$
           VECTOR VALUES G5  = $17HFIVE GOLDEN RINGS*$
           VECTOR VALUES G4  = $18HFOUR CALLING BIRDS*$
           VECTOR VALUES G3  = $17HTHREE FRENCH HENS*$
           VECTOR VALUES G2  = $20HTWO TURTLE DOVES AND*$
           VECTOR VALUES G1  = $26HA PARTRIDGE IN A PEAR TREE*$
           VECTOR VALUES MT  = $*$
           END OF PROGRAM

</lang>

Maple

<lang maple>gifts := ["Twelve drummers drumming", "Eleven pipers piping", "Ten lords a-leaping", "Nine ladies dancing", "Eight maids a-milking", "Seven swans a-swimming", "Six geese a-laying", "Five golden rings", "Four calling birds", "Three french hens", "Two turtle doves and", "A partridge in a pear tree"]: days := ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"]: for i to 12 do printf("On the %s day of Christmas\nMy true love gave to me:\n", days[i]); for j from 13-i to 12 do printf("%s\n", gifts[j]); end do; printf("\n"); end do;</lang>

Output:
On the first day of Christmas
My true love gave to me:
A partridge in a pear tree

On the second day of Christmas
My true love gave to me:
Two turtle doves and
A partridge in a pear tree

On the third day of Christmas
My true love gave to me:
Three french hens
Two turtle doves and
A partridge in a pear tree

...

On the eleventh day of Christmas
My true love gave to me:
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

Mathematica/Wolfram Language

<lang Mathematica>daysarray = {"first", "second", "third", "fourth", "fifth", "sixth",

  "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"};

giftsarray = {"And a partridge in a pear tree.", "Two turtle doves",

  "Three french hens", "Four calling birds", "FIVE GOLDEN RINGS", 
  "Six geese a-laying", "Seven swans a-swimming,", 
  "Eight maids a-milking", "Nine ladies dancing", 
  "Ten lords a-leaping", "Eleven pipers piping", 
  "Twelve drummers drumming"};

Do[Print[StringForm[

  "On the `1` day of Christmas, my true love gave to me: `2`", 
  daysarrayi, 
  If[i == 1, "A partridge in a pear tree.", 
   Row[Reverse[Take[giftsarray, i]], ","]]]], {i, 1, 12}]</lang>
Output:
On the first day of Christmas, my true love gave to me: 
A partridge in a pear tree.

On the second day of Christmas, my true love gave to me: 
Two turtle doves,
And a partridge in a pear tree.

On the third day of Christmas, my true love gave to me: 
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the fourth day of Christmas, my true love gave to me: 
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the fifth day of Christmas, my true love gave to me: 
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the sixth day of Christmas, my true love gave to me: 
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the seventh day of Christmas, my true love gave to me: 
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the eighth day of Christmas, my true love gave to me: 
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the ninth day of Christmas, my true love gave to me: 
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the tenth day of Christmas, my true love gave to me: 
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the eleventh day of Christmas, my true love gave to me: 
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the twelfth day of Christmas, my true love gave to me: 
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GOLDEN RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

MiniScript

<lang MiniScript>days = ["first","second","third", "fourth","fifth","sixth",

       "seventh","eigth","nineth","tenth","eleventh","twelfth"]

gifts = ["A partridge in a pear tree.","Two turtle doves, and",

       "Three French hens,","Four calling birds,",
       "Five gold rings,","Six geese a-laying,",
       "Seven swans a-swimming,","Eight maids a-milking,",
       "Nine ladies dancing,","Ten lords a-leaping,",
       "Eleven pipers piping,","Twelve drummers drumming,"]

for i in range(0,11)

   print "On the " + days[i] + " day of Christmas,"
   print "my true love gave to me,"
   for j in range(i,0)
       print " " + gifts[j]
   end for
   print "     ----------"

end for </lang>

Output:
On the first day of Christmas,
my true love gave to me,
A partridge in a pear tree.
----------

<and so on until the last>

On the twelfth day of Christmas,
my true love gave to me,
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves, and
A partridge in a pear tree.
----------

Nim

Translation of: Python

<lang nim>import strutils, algorithm

const

 Gifts = ["A partridge in a pear tree.",
          "Two turtle doves",
          "Three french hens",
          "Four calling birds",
          "Five golden rings",
          "Six geese a-laying",
          "Seven swans a-swimming",
          "Eight maids a-milking",
          "Nine ladies dancing",
          "Ten lords a-leaping",
          "Eleven pipers piping",
          "Twelve drummers drumming"]
 Days = ["first", "second", "third", "fourth", "fifth", "sixth",
         "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"]

for n, day in Days:

 var g = reversed(Gifts[0..n])
 echo "\nOn the ", day, " day of Christmas\nMy true love gave to me:\n",
      g[0..^2].join("\n"), if n > 0: " and\n" & g[^1] else: capitalizeAscii(g[^1])</lang>
Output:
On the first day of Christmas
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas
My true love gave to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree.

Objeck

Translation of: C sharp – C#

<lang objeck> class TwelveDaysOfChristmas {

 function : Main(args : String[]) ~ Nil {
   days := ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth",
           "tenth", "eleventh", "twelfth"];

       gifts := ["A partridge in a pear tree",
           "Two turtle doves",
           "Three french hens",
           "Four calling birds",
           "Five golden rings",
           "Six geese a-laying",
           "Seven swans a-swimming",
           "Eight maids a-milking",
           "Nine ladies dancing",
           "Ten lords a-leaping",
           "Eleven pipers piping",
           "Twelve drummers drumming"];

       for(i := 0; i < days->Size(); i+=1;) {
         IO.Console->Print("On the ")->Print(days[i])->PrintLine(" day of Christmas, my true love gave to me");
         j := i + 1;
         while(j > 0 ) {
           j -= 1;
           gifts[j]->PrintLine();
         };
     
          IO.Console->PrintLine();

          if (i = 0) {
            gifts[0] := "And a partridge in a pear tree";
          };
       };
   }

} </lang>

PARI/GP

<lang parigp>days=["first","second","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth"]; gifts=["And a partridge in a pear tree.", "Two turtle doves", "Three french hens", "Four calling birds", "Five golden rings", "Six geese a-laying", "Seven swans a-swimming", "Eight maids a-milking", "Nine ladies dancing", "Ten lords a-leaping", "Eleven pipers piping", "Twelve drummers drumming"]; { for(i=1,#days,

 print("On the "days[i]" day of Christmas, my true love gave to me:");
 forstep(j=i,2,-1,print("\t"gifts[j]", "));
 print(if(i==1,"\tA partridge in a pear tree.",Str("\t",gifts[1])))

) }</lang>

Output:
On the first day of Christmas, my true love gave to me:
        A partridge in a pear tree.
On the second day of Christmas, my true love gave to me:
        Two turtle doves,
        And a partridge in a pear tree.
[...]
On the twelfth day of Christmas, my true love gave to me:
        Twelve drummers drumming,
        Eleven pipers piping,
        Ten lords a-leaping,
        Nine ladies dancing,
        Eight maids a-milking,
        Seven swans a-swimming,
        Six geese a-laying,
        Five golden rings,
        Four calling birds,
        Three french hens,
        Two turtle doves,
        And a partridge in a pear tree.

Pascal

This should work with any modern Pascal implementation that has a string type, e.g. Free Pascal.

<lang pascal>program twelve_days(output);

const

 days:  array[1..12] of string =
   ( 'first',   'second', 'third', 'fourth', 'fifth',    'sixth',
     'seventh', 'eighth', 'ninth', 'tenth',  'eleventh', 'twelfth' );
 gifts: array[1..12] of string =
   ( 'A partridge in a pear tree.',
     'Two turtle doves and',
     'Three French hens,',
     'Four calling birds,',
     'Five gold rings,',
     'Six geese a-laying,',
     'Seven swans a-swimming,',
     'Eight maids a-milking,',
     'Nine ladies dancing,',
     'Ten lords a-leaping,',
     'Eleven pipers piping,',
     'Twelve drummers drumming,' );

var

  day, gift: integer;

begin

  for day := 1 to 12 do begin
    writeln('On the ', days[day], ' day of Christmas, my true love sent to me:');
    for gift := day downto 1 do
      writeln(gifts[gift]);
    writeln
  end

end.</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

Here's a version that works in ISO Standard Pascal, albeit with extraneous spaces in the output:

<lang pascal>program twelve_days_iso(output);

const

 days:  array[1..12, 1..8] of char =
   ( 'first   ', 'second  ', 'third   ', 'fourth  ',
     'fifth   ', 'sixth   ', 'seventh ', 'eighth  ',
     'ninth   ', 'tenth   ', 'eleventh', 'twelfth ' );
 gifts: array[1..12, 1..27] of char =
   ( 'A partridge in a pear tree.',
     'Two turtle doves and       ',
     'Three French hens,         ',
     'Four calling birds,        ',
     'Five gold rings,           ',
     'Six geese a-laying,        ',
     'Seven swans a-swimming,    ',
     'Eight maids a-milking,     ',
     'Nine ladies dancing,       ',
     'Ten lords a-leaping,       ',
     'Eleven pipers piping,      ',
     'Twelve drummers drumming,  ' );

var

  day, gift: integer;

begin

  for day := 1 to 12 do begin
    writeln('On the ', days[day], ' day of Christmas, my true love gave to me:');
    for gift := day downto 1 do
      writeln(gifts[gift]);
    writeln
  end

end.</lang>

Output:
On the first    day of Christmas, my true love gave to me:
A partridge in a pear tree.

On the second   day of Christmas, my true love gave to me:
Two turtle doves and       
A partridge in a pear tree.

[...]

On the twelfth  day of Christmas, my true love gave to me:
Twelve drummers drumming,  
Eleven pipers piping,      
Ten lords a-leaping,       
Nine ladies dancing,       
Eight maids a-milking,     
Seven swans a-swimming,    
Six geese a-laying,        
Five gold rings,           
Four calling birds,        
Three French hens,         
Two turtle doves and       
A partridge in a pear tree.

Perl

<lang perl>use v5.10;

my @days = qw{ first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth };

chomp ( my @gifts = grep { /\S/ } );

while ( my $day = shift @days ) {

   say "On the $day day of Christmas,\nMy true love gave to me:";
   say for map { $day eq 'first' ? s/And a/A/r : $_ } @gifts[@days .. @gifts-1];
   say "";

}

__DATA__ Twelve drummers drumming Eleven pipers piping Ten lords a-leaping Nine ladies dancing Eight maids a-milking Seven swans a-swimming Six geese a-laying Five golden rings Four calling birds Three french hens Two turtle doves And a partridge in a pear tree.</lang>

Output:
On the first day of Christmas,
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas,
My true love gave to me:
Two turtle doves
And a partridge in a pear tree.

...

On the twelfth day of Christmas,
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
And a partridge in a pear tree.

Phix

constant days = {"first", "second", "third", "fourth", "fifth", "sixth",
                 "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"},
         gifts = {"A partridge in a pear tree.\n",
                  "Two turtle doves, and\n",
                  "Three French hens,\n",
                  "Four calling birds,\n",
                  "Five gold rings,\n",
                  "Six geese a-laying,\n",
                  "Seven swans a-swimming,\n",
                  "Eight maids a-milking,\n",
                  "Nine ladies dancing,\n",
                  "Ten lords a-leaping,\n",
                  "Eleven pipers piping,\n",
                  "Twelve drummers drumming,\n"}
for i=1 to 12 do
    printf(1,"On the %s day of Christmas,\nmy true love gave to me:\n",{days[i]})
    for j=i to 1 by -1 do
        printf(1,gifts[j])
    end for
end for

Phixmonti

<lang Phixmonti>include ..\Utilitys.pmt

( "A partridge in a pear tree."

 "Two turtle doves, and"
 "Three French hens,"
 "Four calling birds,"
 "Five gold rings,"
 "Six geese a-laying,"
 "Seven swans a-swimming,"
 "Eight maids a-milking,"
 "Nine ladies dancing,"
 "Ten lords a-leaping,"
 "Eleven pipers piping,"
 "Twelve drummers drumming," )

( "first" "second" "third" "fourth" "fifth" "sixth"

 "seventh" "eighth" "ninth" "tenth" "eleventh" "twelfth" )  
   

10 tochar var cr

12 for >ps

   tps get
   "On the " swap " day of Christmas," cr "my true love gave to me:" 5 tolist lprint nl
   swap
   ( ps> 1 -1 ) for
       get ?
   endfor
   swap
   nl

endfor</lang>

PHP

<lang PHP> <?php

header("Content-Type: text/plain; charset=UTF-8");

$days = array(

   'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth',
   'tenth', 'eleventh', 'twelfth',

);

$gifts = array(

   "A partridge in a pear tree",
   "Two turtle doves",
   "Three french hens",
   "Four calling birds",
   "Five golden rings",
   "Six geese a-laying",
   "Seven swans a-swimming",
   "Eight maids a-milking",
   "Nine ladies dancing",
   "Ten lords a-leaping",
   "Eleven pipers piping",
   "Twelve drummers drumming"

);

$verses = [];

for ( $i = 0; $i < 12; $i++ ) {

   $lines = [];
   $lines[0] = "On the {$days[$i]} day of Christmas, my true love gave to me";
   
   $j = $i;
   $k = 0;
   while ( $j >= 0 ) {
       $lines[++$k] = $gifts[$j];
       $j--;
   }
       
   $verses[$i] = implode(PHP_EOL, $lines);
       
   if ( $i == 0 )
       $gifts[0] = "And a partridge in a pear tree";

}

echo implode(PHP_EOL . PHP_EOL, $verses);

?> </lang>

Or using recursion:

<lang PHP><?php

$gifts = array(

   'first'    => "A partridge in a pear tree",
   'second'   => "Two turtle doves",
   'third'    => "Three french hens",
   'fourth'   => "Four calling birds",
   'fifth'    => "Five golden rings",
   'sixth'    => "Six geese a-laying",
   'seventh'  => "Seven swans a-swimming",
   'eighth'   => "Eight maids a-milking",
   'ninth'    => "Nine ladies dancing",
   'tenth'    => "Ten lords a-leaping",
   'eleventh' => "Eleven pipers piping",
   'twelfth'  => "Twelve drummers drumming"

);

function print_day( $gifts ) {

   echo "On the ", key( $gifts ), " day of Xmas, my true love gave to me", PHP_EOL;
   foreach( $gifts as $day => $gift ) {
       echo $gift, $day == 'second' ? ' and' : , PHP_EOL;
   }
   echo PHP_EOL;

}

function twelve_days( $gifts ) {

   if ( ! empty( $gifts ) ) {
       twelve_days( array_slice( $gifts, 1, null, true ) );
       print_day( $gifts );
   }

}

twelve_days( array_reverse( $gifts, true ) );

</lang>

Output:
On the first day of Xmas, my true love gave to me
A partridge in a pear tree

On the second day of Xmas, my true love gave to me
Two turtle doves and
A partridge in a pear tree

On the third day of Xmas, my true love gave to me
Three french hens
Two turtle doves and
A partridge in a pear tree

On the fourth day of Xmas, my true love gave to me
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

On the fifth day of Xmas, my true love gave to me
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

On the sixth day of Xmas, my true love gave to me
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

On the seventh day of Xmas, my true love gave to me
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

On the eighth day of Xmas, my true love gave to me
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

On the ninth day of Xmas, my true love gave to me
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

On the tenth day of Xmas, my true love gave to me
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

On the eleventh day of Xmas, my true love gave to me
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

On the twelfth day of Xmas, my true love gave to me
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

PicoLisp

<lang PicoLisp>(de days

  first second third fourth fifth sixth
  seventh eight ninth tenth eleventh twelfth )

(de texts

  "A partridge in a pear tree."
  "Two turtle doves and"
  "Three french hens"
  "Four calling birds"
  "Five golden rings"
  "Six geese a-laying"
  "Seven swans a-swimming"
  "Eight maids a-milking"
  "Nine ladies dancing"
  "Ten lords a-leaping"
  "Eleven pipers piping"
  "Twelve drummers drumming" )

(for (X . Day) days

  (prinl "On the " Day " day of Christmas")
  (prinl "My true love game to me:")
  (for (Y X (gt0 Y) (dec Y))
     (prinl
        (if (and (= 12 X) (= 1 Y))
           "And a partridge in a pear tree."
           (get texts Y)) ) )
  (prinl) )

(bye)</lang>

PowerShell

<lang PowerShell>$days = @{

   1 = "first";
   2 = "second";
   3 = "third";
   4 = "fourth";
   5 = "fifth";
   6 = "sixth";
   7 = "seventh";
   8 = "eight";
   9 = "ninth";
   10 = "tenth";
   11 = "eleventh";
   12 = "twelfth";

}

$gifts = @{

   1 = 'A partridge in a pear tree';
   2 = 'Two turtle doves';
   3 = 'Three french hens';
   4 = 'Four calling birds';
   5 = 'Five golden rings';
   6 = 'Six geese a-laying';
   7 = 'Seven swans a-swimming';
   8 = 'Eight maids a-milking';
   9 = 'Nine ladies dancing';
   10 = 'Ten lords a-leaping';
   11 = 'Eleven pipers piping';
   12 = 'Twelve drummers drumming';

}

1 .. 12 | % {

   "On the $($days[$_]) day of Christmas`nMy true love gave to me"
   $_ .. 1 | % { 
       $gift = $gifts[$_]
       if ($_ -eq 2) { $gift += " and" }
       $gift
   }
   ""

}</lang>

Output:
On the first day of Christmas
My true love gave to me
A partridge in a pear tree

On the second day of Christmas
My true love gave to me
Two turtle doves and
A partridge in a pear tree

...

On the twelfth day of Christmas
My true love gave to me
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree

Prolog

<lang prolog>day(1, 'first'). day(2, 'second'). day(3, 'third'). day(4, 'fourth'). day(5, 'fifth'). day(6, 'sixth'). day(7, 'seventh'). day(8, 'eighth'). day(9, 'ninth'). day(10, 'tenth'). day(11, 'eleventh'). day(12, 'twelfth').

gift(1, 'A partridge in a pear tree.'). gift(2, 'Two turtle doves and'). gift(3, 'Three French hens,'). gift(4, 'Four calling birds,'). gift(5, 'Five gold rings,'). gift(6, 'Six geese a-laying,'). gift(7, 'Seven swans a-swimming,'). gift(8, 'Eight maids a-milking,'). gift(9, 'Nine ladies dancing,'). gift(10, 'Ten lords a-leaping,'). gift(11, 'Eleven pipers piping,'). gift(12, 'Twelve drummers drumming,').

giftsFor(0, []) :- !. giftsFor(N, [H|T]) :- gift(N, H), M is N-1, giftsFor(M,T).

writeln(S) :- write(S), write('\n').

writeList([])  :- writeln(), !. writeList([H|T]) :- writeln(H), writeList(T).

writeGifts(N) :- day(N, Nth), write('On the '), write(Nth),

   writeln(' day of Christmas, my true love sent to me:'),
   giftsFor(N,L), writeList(L).

writeLoop(0) :- !. writeLoop(N) :- Day is 13 - N, writeGifts(Day), M is N - 1, writeLoop(M).

main :- writeLoop(12), halt.</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

PureBasic

<lang PureBasic>#TXT$ = "On the * day of Christmas, my true love sent to me:" days$ = ~"first\nsecond\nthird\nfourth\nfifth\nsixth\nseventh\neighth\nninth\ntenth\neleventh\ntwelfth\n" gifts$= ~"Twelve drummers drumming,\nEleven pipers piping,\nTen lords a-leaping,\nNine ladies dancing,\n"+

       ~"Eight maids a-milking,\nSeven swans a-swimming,\nSix geese a-laying,\nFive golden rings,\n"+
       ~"Four calling birds,\nThree french hens,\nTwo turtle doves,\nA partridge in a pear tree.\n"

Define I.i, J.i

If OpenConsole("The twelve days of Christmas")

 For I = 1 To 12
   PrintN(ReplaceString(#TXT$,"*",StringField(days$,I,~"\n")))    
   For J = 13-I To 12      
     PrintN(" -> "+StringField(gifts$,J,~"\n"))
   Next J    
 Next I
 Input()

EndIf</lang>

Output:
On the first day of Christmas, my true love sent to me:
 -> A partridge in a pear tree.
On the second day of Christmas, my true love sent to me:
 -> Two turtle doves,
 -> A partridge in a pear tree.
.
.
.
On the eleventh day of Christmas, my true love sent to me:
 -> Eleven pipers piping,
 -> Ten lords a-leaping,
 -> Nine ladies dancing,
 -> Eight maids a-milking,
 -> Seven swans a-swimming,
 -> Six geese a-laying,
 -> Five golden rings,
 -> Four calling birds,
 -> Three french hens,
 -> Two turtle doves,
 -> A partridge in a pear tree.
On the twelfth day of Christmas, my true love sent to me:
 -> Twelve drummers drumming,
 -> Eleven pipers piping,
 -> Ten lords a-leaping,
 -> Nine ladies dancing,
 -> Eight maids a-milking,
 -> Seven swans a-swimming,
 -> Six geese a-laying,
 -> Five golden rings,
 -> Four calling birds,
 -> Three french hens,
 -> Two turtle doves,
 -> A partridge in a pear tree.

Python

<lang python>gifts = \ A partridge in a pear tree. Two turtle doves Three french hens Four calling birds Five golden rings Six geese a-laying Seven swans a-swimming Eight maids a-milking Nine ladies dancing Ten lords a-leaping Eleven pipers piping Twelve drummers drumming.split('\n')

days = first second third fourth fifth

         sixth seventh eighth ninth tenth
         eleventh twelfth.split()

for n, day in enumerate(days, 1):

   g = gifts[:n][::-1]
   print(('\nOn the %s day of Christmas\nMy true love gave to me:\n' % day) +
         '\n'.join(g[:-1]) +
         (' and\n' + g[-1] if n > 1 else g[-1].capitalize()))</lang>
Output:
On the first day of Christmas
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas
My true love gave to me:
Two turtle doves and
A partridge in a pear tree.

On the third day of Christmas
My true love gave to me:
Three french hens
Two turtle doves and
A partridge in a pear tree.

On the fourth day of Christmas
My true love gave to me:
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree.
.
.
.

On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree.

q

<lang q> days:" "vs"first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth"

gifts:(

 "Twelve drummers drumming";
 "Eleven pipers piping";
 "Ten lords a-leaping";
 "Nine ladies dancing";
 "Eight maids a-milking";
 "Seven swans a-swimming";
 "Six geese a-laying";
 "Five golden rings";
 "Four calling birds";
 "Three french hens";
 "Two turtle doves";
 "And a partridge in a pear tree.";
 "")

verses:stanza 0 1,/:{(reverse x)+2+til each 2+x}til 12 lyric:raze .[;0 2;{"A",5_x}] verses{@[x;0;ssr[;"twelfth";y]]}'days

1 "\n"sv lyric; // print </lang>

Output:
On the first day of Christmas
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas
My true love gave to me:
Two turtle doves
And a partridge in a pear tree.

..

On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
And a partridge in a pear tree.

Quackery

<lang Quackery> [ [ table

     $ "first" $ "second" $ "third"    $ "fourth"
     $ "fifth" $ "sixth"  $ "seventh"  $ "eighth"
     $ "ninth" $ "tenth"  $ "eleventh" $ "twelfth" ]
   do echo$ ]                                        is day   ( n --> )  

 [ [ table
     $ "A partridge in a pear tree."
     $ "Two turtle doves and"
     $ "Three French hens,"
     $ "Four calling birds,"
     $ "Five gold rings,"
     $ "Six geese a-laying,"
     $ "Seven swans a-swimming,"
     $ "Eight maids a-milking,"
     $ "Nine ladies dancing,"
     $ "Ten lords a-leaping,"
     $ "Eleven pipers piping,"
     $ "Twelve drummers drumming," ] do echo$ ]      is gift  ( n --> )
     
 [ say "On the " dup day say " day of Christmas," cr
   say "My true love gave to me," cr
   1+ times [ i gift cr ] cr ]                       is verse ( n --> )
 [  12 times [ i^ verse ] ]                          is song  (   --> )
 
 song</lang>
Output:
On the first day of Christmas,
My true love gave to me,
A partridge in a pear tree.

On the second day of Christmas,
My true love gave to me,
Two turtle doves and
A partridge in a pear tree.

[ ... ]

On the twelfth day of Christmas,
My true love gave to me,
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.


R

<lang R> gifts <- c("A partridge in a pear tree.", "Two turtle doves and", "Three french hens", "Four calling birds", "Five golden rings", "Six geese a-laying", "Seven swans a-swimming", "Eight maids a-milking", "Nine ladies dancing", "Ten lords a-leaping", "Eleven pipers piping", "Twelve drummers drumming") days <- c("first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth")

for (i in seq_along(days)) {

 cat("On the", days[i], "day of Christmas\n")
 cat("My true love gave to me:\n")
 cat(paste(gifts[i:1], collapse = "\n"), "\n\n")

}</lang>

Output:
## On the first day of Christmas
## My true love gave to me:
## A partridge in a pear tree. 
## 
## On the second day of Christmas
## My true love gave to me:
## Two turtle doves and
## A partridge in a pear tree. 
## 
## On the third day of Christmas
## My true love gave to me:
## Three french hens
## Two turtle doves and
## A partridge in a pear tree. 
## 
## On the fourth day of Christmas
## My true love gave to me:
## Four calling birds
## Three french hens
## Two turtle doves and
## A partridge in a pear tree. 
## 
...
## 
## On the twelfth day of Christmas
## My true love gave to me:
## Twelve drummers drumming
## Eleven pipers piping
## Ten lords a-leaping
## Nine ladies dancing
## Eight maids a-milking
## Seven swans a-swimming
## Six geese a-laying
## Five golden rings
## Four calling birds
## Three french hens
## Two turtle doves and
## A partridge in a pear tree.

Racket

This version:

  • doesn't capitalise the word Twelfth
  • capitalises the French   (in French hen)
  • capitalised True Love as it may save me a lot of grief when I get home.
  • British Variant: changes golden to go-old rings. Anyone who still has enough breath left to sing the second syllable after sustaining the first syllable of golden simply wasn't making enough effort in the first place.
  • British Variant: capitalises FIVE GO-OLD RINGS since it needs to be sung at top volume. If you want to change this back; the source is there. But I guarantee you won't have as much fun singing it.

<lang racket>#lang racket (define (ordinal-text d)

 (vector-ref
  (vector
   "zeroth" "first" "second" "third" "fourth"
   "fifth" "sixth" "seventh" "eighth" "ninth"
   "tenth" "eleventh" "twelfth")
  d))

(define (on-the... day)

 (printf "On the ~a day of Christmas,~%" (ordinal-text day))
 (printf "My True Love gave to me,~%"))

(define (prezzy prezzy-line day)

 (match prezzy-line
   [1 (string-append (if (= day 1) "A " "And a")" partridge in a pear tree")]
   [2 "Two turtle doves"]
   [3 "Three French hens"]
   [4 "Four calling birds"]
   [5 "FIVE GO-OLD RINGS"]
   [6 "Six geese a-laying"]
   [7 "Seven swans a-swimming"]
   [8 "Eight maids a-milking"]
   [9 "Nine ladies dancing"]
   [10 "Ten lords a-leaping"]
   [11 "Eleven pipers piping"]
   [12 "Twelve drummers drumming"]))

(define (line-end prezzy-line day)

 (match* (day prezzy-line) [(12 1) "."] [(x 1) ".\n"] [(_ _) ","]))

(for ((day (sequence-map add1 (in-range 12)))

     #:when (on-the... day)
     (prezzy-line (in-range day 0 -1)))
 (printf "~a~a~%" (prezzy prezzy-line day) (line-end prezzy-line day)))</lang>
Output:
On the first day of Christmas,
My True Love gave to me,
A  partridge in a pear tree.

On the second day of Christmas,
My True Love gave to me,
Two turtle doves,
And a partridge in a pear tree.

On the third day of Christmas,
My True Love gave to me,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the fourth day of Christmas,
My True Love gave to me,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the fifth day of Christmas,
My True Love gave to me,
FIVE GO-OLD RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the sixth day of Christmas,
My True Love gave to me,
Six geese a-laying,
FIVE GO-OLD RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

On the seventh day of Christmas, ...
On the eighth day of Christmas, ...
On the ninth day of Christmas, ...
On the tenth day of Christmas, ...
On the eleventh day of Christmas, ...

On the twelfth day of Christmas,
My True Love gave to me,
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
FIVE GO-OLD RINGS,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

Raku

(formerly Perl 6) <lang perl6>my @days = <first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth>;

my @gifts = lines q:to/END/;

 And a partridge in a pear tree.
 Two turtle doves,
 Three french hens,
 Four calling birds,
 Five golden rings,
 Six geese a-laying,
 Seven swans a-swimming,
 Eight maids a-milking,
 Nine ladies dancing,
 Ten lords a-leaping,
 Eleven pipers piping,
 Twelve drummers drumming,

END

sub nth($n) { say "On the @days[$n] day of Christmas, my true love gave to me:" }

nth(0); say @gifts[0].subst('And a','A');

for 1 ... 11 -> $d {

   say ;
   nth($d);
   say @gifts[$_] for $d ... 0;

}</lang>

Output:
On the first day of Christmas, my true love gave to me:
  A partridge in a pear tree.

On the second day of Christmas, my true love gave to me:
  Two turtle doves,
  And a partridge in a pear tree.

On the third day of Christmas, my true love gave to me:
  Three french hens,
  Two turtle doves,
  And a partridge in a pear tree.

On the fourth day of Christmas, my true love gave to me:
  Four calling birds,
  Three french hens,
  Two turtle doves,
  And a partridge in a pear tree.
.
.
.
On the twelfth day of Christmas, my true love gave to me:
  Twelve drummers drumming,
  Eleven pipers piping,
  Ten lords a-leaping,
  Nine ladies dancing,
  Eight maids a-milking,
  Seven swans a-swimming,
  Six geese a-laying,
  Five golden rings,
  Four calling birds,
  Three french hens,
  Two turtle doves,
  And a partridge in a pear tree.

REXX

This version:

  •   doesn't capitalize the word   Twelfth
  •   capitalizes the   French   (in French hen)
  •   capitalized   True Love   as it (may) refer to a deity
  •   added indentation to make verses resemble song lyrics

<lang rexx>/*REXX program displays the verses of the song: "The 12 days of Christmas". */ ordD= 'first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth' pad= left(, 20) /*used for indenting the shown verses. */

                  @.1= 'A partridge in a pear-tree.';   @.7 = "Seven swans a-swimming,"
                  @.2= 'Two Turtle Doves, and'      ;   @.8 = "Eight maids a-milking,"
                  @.3= 'Three French Hens,'         ;   @.9 = "Nine ladies dancing,"
                  @.4= 'Four Calling Birds,'        ;   @.10= "Ten lords a-leaping,"
                  @.5= 'Five Golden Rings,'         ;   @.11= "Eleven pipers piping,"
                  @.6= 'Six geese a-laying,'        ;   @.12= "Twelve drummers drumming,"
 do day=1  for 12
 say pad  'On the'   word(ordD, day)   "day of Christmas"    /*display line 1 prologue.*/
 say pad  'My True Love gave to me:'                         /*   "      "  2     "    */
             do j=day  by -1  to 1;       say pad @.j        /*   "    the daily gifts.*/
             end   /*j*/
 say                                            /*add a blank line between the verses. */
 end               /*day*/                      /*stick a fork in it,  we're all done. */</lang>
output:


(Shown at three-quarters size.)

                     On the first day of Christmas
                     My True Love gave to me:
                     A partridge in a pear-tree.

                     On the second day of Christmas
                     My True Love gave to me:
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the third day of Christmas
                     My True Love gave to me:
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the fourth day of Christmas
                     My True Love gave to me:
                     Four Calling Birds,
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the fifth day of Christmas
                     My True Love gave to me:
                     Five Golden Rings,
                     Four Calling Birds,
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the sixth day of Christmas
                     My True Love gave to me:
                     Six geese a-laying,
                     Five Golden Rings,
                     Four Calling Birds,
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the seventh day of Christmas
                     My True Love gave to me:
                     Seven swans a-swimming,
                     Six geese a-laying,
                     Five Golden Rings,
                     Four Calling Birds,
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the eighth day of Christmas
                     My True Love gave to me:
                     Eight maids a-milking,
                     Seven swans a-swimming,
                     Six geese a-laying,
                     Five Golden Rings,
                     Four Calling Birds,
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the ninth day of Christmas
                     My True Love gave to me:
                     Nine ladies dancing,
                     Eight maids a-milking,
                     Seven swans a-swimming,
                     Six geese a-laying,
                     Five Golden Rings,
                     Four Calling Birds,
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the tenth day of Christmas
                     My True Love gave to me:
                     Ten lords a-leaping,
                     Nine ladies dancing,
                     Eight maids a-milking,
                     Seven swans a-swimming,
                     Six geese a-laying,
                     Five Golden Rings,
                     Four Calling Birds,
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the eleventh day of Christmas
                     My True Love gave to me:
                     Eleven pipers piping,
                     Ten lords a-leaping,
                     Nine ladies dancing,
                     Eight maids a-milking,
                     Seven swans a-swimming,
                     Six geese a-laying,
                     Five Golden Rings,
                     Four Calling Birds,
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

                     On the twelfth day of Christmas
                     My True Love gave to me:
                     Twelve drummers drumming,
                     Eleven pipers piping,
                     Ten lords a-leaping,
                     Nine ladies dancing,
                     Eight maids a-milking,
                     Seven swans a-swimming,
                     Six geese a-laying,
                     Five Golden Rings,
                     Four Calling Birds,
                     Three French Hens,
                     Two Turtle Doves, and
                     A partridge in a pear-tree.

Ring

<lang ring>

  1. Project : The Twelve Days of Christmas

gifts = "A partridge in a pear tree,Two turtle doves,Three french hens,Four calling birds,Five golden rings,Six geese a-laying,Seven swans a-swimming,Eight maids a-milking,Nine ladies dancing,Ten lords a-leaping,Eleven pipers piping,Twelve drummers drumming" days = "first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth" lstgifts = str2list(substr(gifts,",", nl)) lstdays = str2list(substr(days, " ", nl)) for i = 1 to 12

    see "On the "+ lstdays[i]+ " day of Christmas" + nl
    see "My true love gave to me:" + nl
    for j = i to 1 step -1
         if i > 1 and j = 1
            see "and " + nl
         ok
         see "" + lstgifts[j] + nl
    next
    see nl

next

</lang> Output:

On the first day of Christmas
My true love gave to me:
A partridge in a pear tree

On the second day of Christmas
My true love gave to me:
Two turtle doves
and 
A partridge in a pear tree

On the third day of Christmas
My true love gave to me:
Three french hens
Two turtle doves
and 
A partridge in a pear tree

On the fourth day of Christmas
My true love gave to me:
Four calling birds
Three french hens
Two turtle doves
and 
A partridge in a pear tree

On the fifth day of Christmas
My true love gave to me:
Five golden rings
Four calling birds
Three french hens
Two turtle doves
and 
A partridge in a pear tree

On the sixth day of Christmas
My true love gave to me:
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
and 
A partridge in a pear tree

On the seventh day of Christmas
My true love gave to me:
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
and 
A partridge in a pear tree

On the eighth day of Christmas
My true love gave to me:
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
and 
A partridge in a pear tree

On the ninth day of Christmas
My true love gave to me:
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
and 
A partridge in a pear tree

On the tenth day of Christmas
My true love gave to me:
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
and 
A partridge in a pear tree

On the eleventh day of Christmas
My true love gave to me:
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
and 
A partridge in a pear tree

On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
and 
A partridge in a pear tree

Ruby

<lang ruby>gifts = "A partridge in a pear tree Two turtle doves and Three french hens Four calling birds Five golden rings Six geese a-laying Seven swans a-swimming Eight maids a-milking Nine ladies dancing Ten lords a-leaping Eleven pipers piping Twelve drummers drumming".split("\n")

days = %w(first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth)

days.each_with_index do |day, i|

 puts "On the #{day} day of Christmas"
 puts "My true love gave to me:"
 puts gifts[0, i+1].reverse
 puts

end</lang>

Run BASIC

<lang Runbasic>gifts$ = " A partridge in a pear tree., Two turtle doves, Three french hens, Four calling birds, Five golden rings, Six geese a-laying, Seven swans a-swimming, Eight maids a-milking, Nine ladies dancing, Ten lords a-leaping, Eleven pipers piping, Twelve drummers drumming"

days$ = "first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth"

for i = 1 to 12

   print "On the ";word$(days$,i," ");" day of Christmas"
   print "My true love gave to me:"
   for j = i to 1 step -1
   if i > 1 and j = 1 then print "and ";
   print mid$(word$(gifts$,j,","),2)
   next j
   print

next i </lang>Output:

On the first day of Christmas
My true love gave to me:
A partridge in a pear tree.
.
.
On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves
and A partridge in a pear tree.

Rust

Rust Playground <lang rust>fn main() {

   let days = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth",
               "ninth", "tenth", "eleventh", "twelfth"];
   let gifts = ["A Patridge in a Pear Tree",
                "Two Turtle Doves and",
                "Three French Hens",
                "Four Calling Birds",
                "Five Golden Rings",
                "Six Geese a Laying",
                "Seven Swans a Swimming",
                "Eight Maids a Milking",
                "Nine Ladies Dancing",
                "Ten Lords a Leaping",
                "Eleven Pipers Piping",
                "Twelve Drummers Drumming"];
   for i in 0..12 {
       println!("On the {} day of Christmas,", days[i]);
       println!("My true love gave to me:");
       for j in (0..i + 1).rev() {
           println!("{}", gifts[j]);
       }
       println!()
   }

}</lang>

Scala

<lang scala>val gifts = Array(

   "A partridge in a pear tree.",
   "Two turtle doves and",
   "Three French hens,",
   "Four calling birds,",
   "Five gold rings,",
   "Six geese a-laying,",
   "Seven swans a-swimming,",
   "Eight maids a-milking,",
   "Nine ladies dancing,",
   "Ten lords a-leaping,",
   "Eleven pipers piping,",
   "Twelve drummers drumming,"
 )

val days = Array(

   "first",   "second", "third", "fourth", "fifth",    "sixth",
   "seventh", "eighth", "ninth", "tenth",  "eleventh", "twelfth"
 )

val giftsForDay = (day: Int) =>

   "On the %s day of Christmas, my true love sent to me:\n".format(days(day)) +
     gifts.take(day+1).reverse.mkString("\n") + "\n"

(0 until 12).map(giftsForDay andThen println) </lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

Scheme

Without Common Lisp's format, we sadly have to hard-code the list of ordinals. <lang scheme>; Racket has this built in, but it's not standard (define (take lst n)

 (if (or (null? lst) (<= n 0))
     '()
     (cons (car lst) (take (cdr lst) (- n 1)))))

(let

 ((days  '("first" "second" "third" "fourth" "fifth" "sixth" "seventh"
           "eighth" "ninth" "tenth" "eleventh" "twelfth"))
  (gifts '("A partridge in a pear tree." "Two turtle doves, and"
           "Three French hens,"          "Four calling birds,"
           "Five gold rings,"            "Six geese a-laying,"
           "Seven swans a-swimming,"     "Eight maids a-milking,"
           "Nine ladies dancing,"        "Ten lords a-leaping,"
           "Eleven pipers piping,"       "Twelve drummers drumming,")))
 (do ((left days (cdr left))
      ; No universal predefined (+ 1) function, sadly. Implementations
      ; are divided between (add1) and (1+).
      (day  1    (+ 1 day))) 
     ((null? left) #t)
   (display "On the ")
   (display (car left))
   (display " day of Christmas, my true love sent to me:")
   (newline)
   (do ((daily (reverse (take gifts day)) (cdr daily)))
       ((null? daily) #t)
     (display (car daily))
     (newline))
     (newline)))

(exit)</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves, and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves, and
A partridge in a pear tree.

Seed7

<lang seed7>$ include "seed7_05.s7i";

const proc: main is func

 local
   const array string: gifts is [] (
       "A partridge in a pear tree.", "Two turtle doves and",
       "Three french hens", "Four calling birds",
       "Five golden rings", "Six geese a-laying",
       "Seven swans a-swimming", "Eight maids a-milking",
       "Nine ladies dancing", "Ten lords a-leaping",
       "Eleven pipers piping", "Twelve drummers drumming");
   const array string: days is [] (
       "first", "second", "third", "fourth", "fifth", "sixth",
       "seventh", "eighth", "ninth", "tenth", "eleventh", "Twelfth");
   var integer: day is 0;
   var integer: gift is 0;
 begin
   for day range 1 to length(days) do
     writeln;
     writeln("On the " <& days[day] <& " day of Christmas,");
     writeln("My true love gave to me:");
     for gift range day downto 1 do
       writeln(gifts[gift]);
     end for;
   end for;
 end func;</lang>
Output:
On the first day of Christmas,
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas,
My true love gave to me:
Two turtle doves and
A partridge in a pear tree.

On the third day of Christmas,
My true love gave to me:
Three french hens
Two turtle doves and
A partridge in a pear tree.

...

On the Twelfth day of Christmas,
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree.

Self

Nicely factored: <lang self>(| parent* = traits oddball.

gifts = (

  'And a partridge in a pear tree' &
  'Two turtle doves' &
  'Three french hens' &
  'Four calling birds' &
  'FIVE GO-OLD RINGS' &
  'Six geese a-laying' &
  'Seven swans a-swimming' &
  'Eight maids a-milking' &
  'Nine ladies dancing' &
  'Ten lords a-leaping' &
  'Eleven pipers piping' &
  'Twelve drummers drumming'

) asSequence.

days = (

  'first' & 'second' & 'third'    & 'fourth'  & 
  'fifth' & 'sixth'  & 'seventh'  & 'eighth'  &
  'ninth' & 'tenth'  & 'eleventh' & 'twelfth'

) asSequence.

intro: i = ( 'On the ', (days at: i), ' day of Christmas, my true love gave to me:'). gifts: i = ( i = 0 ifTrue: [sequence copyAddFirst: 'A partridge in a pear tree' ]

                    False: [(gifts slice: 0@(i + 1)) reverse ]).

verse: i = ( ((sequence copyAddFirst: intro: i) addAll: gifts: i) addLast: ). value = ( (days gather: [|:d. :i| verse: i ]) asSequence joinUsing: '\n' )

|) value printLine </lang>

SenseTalk

<lang sensetalk>put [ "partridge in a pear tree.", "turtle doves and", "french hens", "calling birds", "golden rings", "geese a-laying", "swans a-swimming", "maids a-milking", "ladies dancing", "lords a-leaping", "pipers piping", "drummers drumming" ] into gifts

repeat with each item d1 of 1 .. 12 put "On the" && ordinalwords of d1 && "day of Christmas," put "My true love gave to me:" repeat with each item d2 of d1 .. 1 if d2 is 1 put "A" into number else put capitalized(numberwords of d2) into number end if put number && item d2 of gifts end repeat put "" end repeat</lang>

Output:
On the first day of Christmas,
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas,
My true love gave to me:
Two turtle doves and
A partridge in a pear tree.

On the third day of Christmas,
My true love gave to me:
Three french hens
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas,
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree.

Sidef

Translation of: Raku

<lang ruby>var days = <first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth>;

var gifts = <<'EOT'.lines;

 And a partridge in a pear tree.
 Two turtle doves,
 Three french hens,
 Four calling birds,
 Five golden rings,
 Six geese a-laying,
 Seven swans a-swimming,
 Eight maids a-milking,
 Nine ladies dancing,
 Ten lords a-leaping,
 Eleven pipers piping,
 Twelve drummers drumming,

EOT

func nth(n) { say "On the #{days[n]} day of Christmas, my true love gave to me:" };

nth(0); say gifts[0].sub('And a', 'A');

range(1, 11).each { |d|

   say ;
   nth(d);
   d.downto(0).each { |i|
       say gifts[i];
   }

}</lang>

Output:
On the first day of Christmas, my true love gave to me:
  A partridge in a pear tree.

On the second day of Christmas, my true love gave to me:
  Two turtle doves,
  And a partridge in a pear tree.

On the third day of Christmas, my true love gave to me:
  Three french hens,
  Two turtle doves,
  And a partridge in a pear tree.

On the fourth day of Christmas, my true love gave to me:
  Four calling birds,
  Three french hens,
  Two turtle doves,
  And a partridge in a pear tree.
.
.
.
On the twelfth day of Christmas, my true love gave to me:
  Twelve drummers drumming,
  Eleven pipers piping,
  Ten lords a-leaping,
  Nine ladies dancing,
  Eight maids a-milking,
  Seven swans a-swimming,
  Six geese a-laying,
  Five golden rings,
  Four calling birds,
  Three french hens,
  Two turtle doves,
  And a partridge in a pear tree.

Simula

Works with: GNU Cim

<lang simula>Begin

 Text Array days(1:12), gifts(1:12);
 Integer day, gift;
 days(1)  :- "first";
 days(2)  :- "second";
 days(3)  :- "third";
 days(4)  :- "fourth";
 days(5)  :- "fifth";
 days(6)  :- "sixth";
 days(7)  :- "seventh";
 days(8)  :- "eighth";
 days(9)  :- "ninth";
 days(10) :- "tenth";
 days(11) :- "eleventh";
 days(12) :- "twelfth";


 gifts(1)  :- "A partridge in a pear tree.";
 gifts(2)  :- "Two turtle doves and";
 gifts(3)  :- "Three French hens,";
 gifts(4)  :- "Four calling birds,";
 gifts(5)  :- "Five gold rings,";
 gifts(6)  :- "Six geese a-laying,";
 gifts(7)  :- "Seven swans a-swimming,";
 gifts(8)  :- "Eight maids a-milking,";
 gifts(9)  :- "Nine ladies dancing,";
 gifts(10) :- "Ten lords a-leaping,";
 gifts(11) :- "Eleven pipers piping,";
 gifts(12) :- "Twelve drummers drumming,";
 For day := 1 Step 1 Until 12 Do Begin
   outtext("On the "); outtext(days(day)); 
   outtext(" day of Christmas, my true love sent to me:"); outimage;
   For gift := day Step -1 Until 1 Do Begin
     outtext(gifts(gift)); outimage
   End;
   outimage
 End

End </lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

Smalltalk

Works with: GNU Smalltalk

<lang smalltalk>Object subclass: TwelveDays [

 Ordinals := #('first'   'second' 'third' 'fourth' 'fifth'    'sixth'
               'seventh' 'eighth' 'ninth' 'tenth'  'eleventh' 'twelfth').
 Gifts := #( 'A partridge in a pear tree.' 'Two turtle doves and'
             'Three French hens,'          'Four calling birds,'
             'Five gold rings,'            'Six geese a-laying,'
             'Seven swans a-swimming,'     'Eight maids a-milking,'
             'Nine ladies dancing,'        'Ten lords a-leaping,'
             'Eleven pipers piping,'       'Twelve drummers drumming,' ).

]

TwelveDays class extend [

 giftsFor: day [
   |newLine ordinal giftList|
   newLine := $<10> asString.
   ordinal := Ordinals at: day.
   giftList := (Gifts first: day) reverse.
   ^'On the ', ordinal, ' day of Christmas, my true love sent to me:',
     newLine, (giftList join: newLine), newLine.
 ]

]

1 to: 12 do: [:i |

 Transcript show: (TwelveDays giftsFor: i); cr.

].</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

Smart BASIC

<lang smart BASIC>' by rbytes dim d$(12),x$(15)!s=15 for t=0 to 11!read d$(t)!next t for t=0 to 14!read x$(t)!next t for u=0 to 11!s-=1 print x$(0)&d$(u)&x$(1)&chr$(10)&x$(2) for t=s to 14!print x$(t)!next t print!next u!data "first","second","third","fourth","fifth","sixth","seventh","eight","ninth","tenth","eleventh","Twelfth","On the "," day of Christmas","My true love gave to me:","Twelve drummers drumming","Eleven pipers piping","Ten lords a-leaping","Nine ladies dancing","Eight maids a-milking","Seven swans a-swimming,","Six geese a-laying","Five golden rings","Four calling birds","Three french hens","Two turtle doves and","A partridge in a pear tree."</lang>

On the first day of Christmas
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas
My true love gave to me:
Two turtle doves and
A partridge in a pear tree.

On the third day of Christmas
My true love gave to me:
Three french hens
Two turtle doves and
A partridge in a pear tree.

[ ... ]

On the eleventh day of Christmas
My true love gave to me:
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming,
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree.

On the Twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming,
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves and
A partridge in a pear tree.

Snobol

Works with: CSNOBOL4

<lang snobol> DAYS = ARRAY('12') DAYS<1> = 'first' DAYS<2> = 'second' DAYS<3> = 'third' DAYS<4> = 'fourth' DAYS<5> = 'fifth' DAYS<6> = 'sixth' DAYS<7> = 'seventh' DAYS<8> = 'eighth' DAYS<9> = 'ninth' DAYS<10> = 'tenth' DAYS<11> = 'eleventh' DAYS<12> = 'twelfth'

GIFTS = ARRAY('12') GIFTS<1> = 'A partridge in a pear tree.' GIFTS<2> = 'Two turtle doves and' GIFTS<3> = 'Three French hens,' GIFTS<4> = 'Four calling birds,' GIFTS<5> = 'Five gold rings,' GIFTS<6> = 'Six geese a-laying,' GIFTS<7> = 'Seven swans a-swimming,' GIFTS<8> = 'Eight maids a-milking,' GIFTS<9> = 'Nine ladies dancing,' GIFTS<10> = 'Ten lords a-leaping,' GIFTS<11> = 'Eleven pipers piping,' GIFTS<12> = 'Twelve drummers drumming,'

      DAY = 1

OUTER LE(DAY,12) :F(END)

      INTRO = 'On the NTH day of Christmas, my true love sent to me:'
      INTRO 'NTH' = DAYS<DAY>
      OUTPUT = INTRO
      GIFT = DAY

INNER GE(GIFT,1) :F(NEXT)

      OUTPUT = GIFTS<GIFT>
      GIFT = GIFT - 1       :(INNER)

NEXT OUTPUT =

      DAY = DAY + 1         :(OUTER)

END</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

SQL

Demonstration of Oracle 12c "with" clause enhancement.

<lang SQL> with function nl ( s in varchar2 ) return varchar2 is begin

       return chr(10) || s;

end nl; function v ( d number, x number, g in varchar2 ) return varchar2 is begin

       return
       case when d >= x then nl (g) end;

end v; select 'On the '

       || to_char(to_date(level,'j'),'jspth' )
       || ' day of Christmas,'
       || nl( 'my true love sent to me:')
       || v ( level, 12, 'Twelve drummers drumming,' )
       || v ( level, 11, 'Eleven pipers piping,' )
       || v ( level, 10, 'Ten lords a-leaping,' )
       || v ( level, 9, 'Nine ladies dancing,' )
       || v ( level, 8, 'Eight maids a-milking,' )
       || v ( level, 7, 'Seven swans a-swimming,' )
       || v ( level, 6, 'Six geese a-laying,' )
       || v ( level, 5, 'Five golden rings!' )
       || v ( level, 4, 'Four calling birds,' )
       || v ( level, 3, 'Three French hens,' )
       || v ( level, 2, 'Two turtle doves,' )
       || v ( level, 1, case level when 1 then 'A' else 'And a' end || ' partridge in a pear tree.' )
       || nl(null)
       "The Twelve Days of Christmas"

from dual connect by level <= 12 / </lang> output:

The Twelve Days of Christmas
--------------------------------------------------------------------------------
On the first day of Christmas,
my true love sent to me:
A partridge in a pear tree.

...

On the twelfth day of Christmas,
my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five golden rings!
Four calling birds,
Three French hens,
Two turtle doves,
And a partridge in a pear tree.

Swift

Works with: Swift version 2.1

<lang swift>let gifts = [ "partridge in a pear tree", "Two turtle doves",

             "Three French hens",        "Four calling birds",       
             "Five gold rings",          "Six geese a-laying", 
             "Seven swans a-swimming",   "Eight maids a-milking",
             "Nine ladies dancing",      "Ten lords a-leaping", 
             "Eleven pipers piping",     "Twelve drummers drumming" ]

let nth = [ "first", "second", "third", "fourth", "fifth", "sixth",

           "seventh", "eighth", "ninth", "tenth",  "eleventh", "twelfth" ]

func giftsForDay(day: Int) -> String {

 var result = "On the \(nth[day-1]) day of Christmas, my true love sent to me:\n"
 if day > 1 {
   for again in 1...day-1 {
     let n = day - again 
     result += gifts[n]
     if n > 1 { result += "," }
     result += "\n"
   }
   result += "And a "
 } else {
   result += "A "
 }
 return result + gifts[0] + ".\n";

}

for day in 1...12 {

 print(giftsForDay(day))

}</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

Tailspin

<lang tailspin> def ordinal: ['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth', 'tenth', 'eleventh', 'twelfth']; def gift: [

 'a partridge in a pear tree',
 'two turtle-doves',
 'three French hens',
 'four calling birds',
 'five golden rings',
 'six geese a-laying',
 'seven swans a-swimming',
 'eight maids a-milking',
 'nine ladies dancing',
 'ten lords a-leaping',
 'eleven pipers piping',
 'twelve drummers drumming'

]; templates punctuation

 <=1> '.' !
 <=2> ' and' !
 <=5> ';' !
 <> ',' !

end punctuation

1..12 -> \singVerse(

 'On the $ordinal($); day of Christmas,

my true love gave to me: ' !

 $..1:-1 -> '$gift($);$->punctuation;

' ! ' ' ! \singVerse) -> !OUT::write </lang>

Output:
On the first day of Christmas,
my true love gave to me:
a partridge in a pear tree.

On the second day of Christmas,
my true love gave to me:
two turtle-doves and
a partridge in a pear tree.

...

On the twelfth day of Christmas,
my true love gave to me:
twelve drummers drumming,
eleven pipers piping,
ten lords a-leaping,
nine ladies dancing,
eight maids a-milking,
seven swans a-swimming,
six geese a-laying,
five golden rings;
four calling birds,
three French hens,
two turtle-doves and
a partridge in a pear tree.


Terraform

<lang terraform>locals {

 days = [ "first",   "second", "third", "fourth", "fifth",    "sixth",
          "seventh", "eighth", "ninth", "tenth",  "eleventh", "twelfth" ]
 gifts = [
   "A partridge in a pear tree.",
   "Two turtle doves, and",
   "Three French hens,",
   "Four calling birds,",
   "Five gold rings,",
   "Six geese a-laying,",
   "Seven swans a-swimming,",
   "Eight maids a-milking,",
   "Nine ladies dancing,",
   "Ten lords a-leaping,",
   "Eleven pipers piping,",
   "Twelve drummers drumming,"
 ]

}

data "template_file" "days" {

 count = 12
 template = "On the ${local.days[count.index]} day of Christmas, my true love sent to me:\n${join("\n",[for g in range(count.index,-1,-1): local.gifts[g]])}"

}

output "lyrics" {

 value = join("\n\n",[for t in data.template_file.days: t.rendered])

}</lang>


Output:
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

lyrics = <<EOT
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves, and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves, and
A partridge in a pear tree.
EOT

Tcl

Works with: Tcl version 8.6

<lang tcl>set days {

   first second third fourth fifth sixth
   seventh eighth ninth tenth eleventh twelfth

} set gifts [lreverse {

   "A partridge in a pear tree."
   "Two turtle doves, and"
   "Three french hens,"
   "Four calling birds,"
   "Five golden rings,"
   "Six geese a-laying,"
   "Seven swans a-swimming,"
   "Eight maids a-milking,"
   "Nine ladies dancing,"
   "Ten lords a-leaping,"
   "Eleven pipers piping,"
   "Twelve drummers drumming,"

}]

set n -1;puts [join [lmap day $days {

   format "On the $day day of Christmas,\nMy true love gave to me:\n%s" \

[join [lrange $gifts end-[incr n] end] \n] }] \n\n]</lang>

Output:
On the first day of Christmas,
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas,
My true love gave to me:
Two turtle doves, and
A partridge in a pear tree.

On the third day of Christmas,
My true love gave to me:
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

On the fourth day of Christmas,
My true love gave to me:
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

On the fifth day of Christmas,
My true love gave to me:
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

On the sixth day of Christmas,
My true love gave to me:
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

On the seventh day of Christmas,
My true love gave to me:
Seven swans a-swimming,
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

On the eighth day of Christmas,
My true love gave to me:
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

On the ninth day of Christmas,
My true love gave to me:
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

On the tenth day of Christmas,
My true love gave to me:
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

On the eleventh day of Christmas,
My true love gave to me:
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.

On the twelfth day of Christmas,
My true love gave to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.


True BASIC

Works with: QBasic version 1.1
Works with: QuickBasic version 4.5

<lang qbasic>DATA "first","second","third","fourth","fifth","sixth" DATA "seventh","eighth","ninth","tenth","eleventh","twelfth" DATA "A partridge in a pear tree." DATA "Two turtle doves and" DATA "Three french hens" DATA "Four calling birds" DATA "Five golden rings" DATA "Six geese a-laying" DATA "Seven swans a-swimming" DATA "Eight maids a-milking" DATA "Nine ladies dancing" DATA "Ten lords a-leaping" DATA "Eleven pipers piping" DATA "Twelve drummers drumming"

DIM day$(12), gift$(12) FOR i = 1 TO 12

   READ day$(i)

NEXT i FOR i = 1 TO 12

   READ gift$(i)

NEXT i

FOR i = 1 TO 12

   PRINT "On the "; day$(i); " day of Christmas,"
   PRINT "My true love gave TO me:"
   FOR j = i TO 1 STEP -1
       PRINT gift$(j)
   NEXT j
   PRINT

NEXT i END</lang>

uBasic/4tH

<lang>Dim @n(12) : Dim @v(12) ' define both arrays

Proc _DataDays ' put data on the stack

For i=11 To 0 Step -1 ' read them in

 @n(i) = Pop()

Next

Proc _DataGifts ' put data on the stack

For i=11 To 0 Step -1 ' read them in

 @v(i) = Pop()

Next

For i=0 To 11 ' print all twelve verses

 Print "On the ";Show(@n(i));" day of Christmas"
 Print "My true love gave to me:"
 For j=i To 0 Step -1                 ' show list of gifts
   Print Show(@v(j))
 Next
 Print                                ' next verse

Next End


_DataDays

 Push Dup("first"), Dup("second"), Dup("third"), Dup ("fourth")
 Push Dup("fifth"), Dup("sixth"), Dup("seventh"), Dup("eighth")
 Push Dup("ninth"), Dup("tenth"), Dup("eleventh"), Dup("twelfth")

Return

_DataGifts

 Push Dup("A partridge in a pear tree.")
 Push Dup("Two turtle doves and")
 Push Dup("Three french hens")
 Push Dup("Four calling birds")
 Push Dup("Five golden rings")
 Push Dup("Six geese a-laying")
 Push Dup("Seven swans a-swimming")
 Push Dup("Eight maids a-milking")
 Push Dup("Nine ladies dancing")
 Push Dup("Ten lords a-leaping")
 Push Dup("Eleven pipers piping")
 Push Dup("Twelve drummers drumming")

Return</lang>

UNIX Shell

Works with: Bourne Again SHell
Works with: Korn Shell version 93

<lang bash>#!/usr/bin/env bash ordinals=(first second third fourth fifth sixth

         seventh eighth ninth tenth  eleventh twelfth)

gifts=( "A partridge in a pear tree." "Two turtle doves and"

       "Three French hens,"          "Four calling birds,"
       "Five gold rings,"            "Six geese a-laying,"
       "Seven swans a-swimming,"     "Eight maids a-milking,"
       "Nine ladies dancing,"        "Ten lords a-leaping,"
       "Eleven pipers piping,"       "Twelve drummers drumming," )

echo_gifts() {

 local i day=$1
 echo "On the ${ordinals[day]} day of Christmas, my true love sent to me:"
 for (( i=day; i >=0; --i )); do
   echo "${gifts[i]}"
 done
 echo

}

for (( day=0; day < 12; ++day )); do

 echo_gifts $day

done</lang>

The above will also work in zsh if the index range is changed from 0..11 to 1..12.

Works with: Bourne Shell

(requires the seq command)

<lang sh>#!/bin/sh ordinal() {

 n=$1
 set first   second third fourth fifth    sixth \
     seventh eighth ninth tenth  eleventh twelfth
 shift $n
 echo $1

}

gift() {

 n=$1
 set "A partridge in a pear tree." "Two turtle doves and"      \
     "Three French hens,"          "Four calling birds,"       \
     "Five gold rings,"            "Six geese a-laying,"       \
     "Seven swans a-swimming,"     "Eight maids a-milking,"    \
     "Nine ladies dancing,"        "Ten lords a-leaping,"      \
     "Eleven pipers piping,"       "Twelve drummers drumming," 
 shift $n
 echo "$1"

}

echo_gifts() {

 day=$1
 echo "On the `ordinal $day` day of Christmas, my true love sent to me:"
 for i in `seq $day 0`; do
   gift $i
 done
 echo

}

for day in `seq 0 11`; do

 echo_gifts $day

done</lang>

Output:
On the first day of Christmas, my true love sent to me:
A partridge in a pear tree.

On the second day of Christmas, my true love sent to me:
Two turtle doves and
A partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love sent to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five gold rings,
Four calling birds,
Three French hens,
Two turtle doves and
A partridge in a pear tree.

VBA

<lang vb>Sub Main() Dim i As Integer, c As Integer, j As Integer, strReturn() As String Dim s, n

  s = Split(SING_, "$")
  n = Split(NUMBERS_, " ")
  ReDim strReturn(UBound(s))
  For i = LBound(s) To UBound(s)
     strReturn(i) = Replace(BASE_, "(X)", n(i))
     For j = c To 0 Step -1
        strReturn(i) = strReturn(i) & s(j) & vbCrLf
     Next
     c = c + 1
  Next i
  strReturn(UBound(strReturn)) = Replace(strReturn(UBound(strReturn)), "and" & vbCrLf & "A", vbCrLf & "And a")
  Debug.Print Join(strReturn, vbCrLf)

End Sub</lang>

Output:
On the first day of Christmas,
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas,
My true love gave to me:
Two turtle doves and
A partridge in a pear tree.

On the third day of Christmas,
My true love gave to me:
Three french hens
Two turtle doves and
A partridge in a pear tree.
[...]
On the twelfth day of Christmas,
My true love gave to me:
Twelve drummers drumming
Eleven pipers piping
Ten lords a-leaping
Nine ladies dancing
Eight maids a-milking
Seven swans a-swimming
Six geese a-laying
Five golden rings
Four calling birds
Three french hens
Two turtle doves 
And a partridge in a pear tree.

VBScript

<lang vb>days = Array("first","second","third","fourth","fifth","sixth",_ "seventh","eight","ninth","tenth","eleventh","twelfth")

gifts = Array("A partridge in a pear tree","Two turtle doves","Three french hens",_ "Four calling birds","Five golden rings","Six geese a-laying","Seven swans a-swimming",_ "Eight maids a-milking","Nine ladies dancing","Ten lords a-leaping","Eleven pipers piping",_ "Twelve drummers drumming")

For i = 0 To 11 WScript.StdOut.Write "On the " & days(i) & " day of Christmas" WScript.StdOut.WriteLine WScript.StdOut.Write "My true love sent to me:" WScript.StdOut.WriteLine If i = 0 Then WScript.StdOut.Write gifts(i) Else For j = i To 0 Step - 1 If j = 0 Then WScript.StdOut.Write "and " & gifts(0) Else WScript.StdOut.Write gifts(j) WScript.StdOut.WriteLine End If Next End If WScript.StdOut.WriteBlankLines(2) Next</lang>


Vedit macro language

This example uses calculated call targets. Note that in the gift subroutines, the execution falls through all the following subroutines and returns only after the gift 1 routine. <lang vedit>for (#1 = 1; #1 <= 12; #1++) {

   Num_Str(#1, 9, LEFT)
   IT("On the ")
   Call("day |@(9)")
   IT(" day of Christmas, my true love sent to me:") IN
   Call("gift |@(9)")
   IN

} return

day 1: IT("first") return
day 2: IT("second") return
day 3: IT("third") return
day 4: IT("fourth") return
day 5: IT("fifth") return
day 6: IT("sixth") return
day 7: IT("seventh") return
day 8: IT("eighth") return
day 9: IT("ninth") return
day 10: IT("tenth") return
day 11: IT("eleventh") return
day 12: IT("twelfth") return
gift 12: IT("Twelve drummers drumming,") IN
gift 11: IT("Eleven pipers piping,") IN
gift 10: IT("Ten lords a-leaping,") IN
gift 9: IT("Nine ladies dancing,") IN
gift 8: IT("Eight maids a-milking,") IN
gift 7: IT("Seven swans a-swimming,") IN
gift 6: IT("Six geese a-laying,") IN
gift 5: IT("Five gold rings,") IN
gift 4: IT("Four calling birds,") IN
gift 3: IT("Three French hens,") IN
gift 2: IT("Two turtle doves, and") IN
gift 1: IT("A partridge in a pear tree.") IN

return </lang>

Vim Script

Translation of: Raku

<lang vimscript> let b:days=["first", "second", "third", "fourth", "fifth", "sixth",

 \         "seventh", "eighth", "ninth", "tenth",  "eleventh", "twelfth"]

let b:gifts=[

 \ "And a partridge in a pear tree.",
 \ "Two turtle doves,",
 \ "Three french hens,",
 \ "Four calling birds,",
 \ "Five golden rings,",
 \ "Six geese a-laying,",
 \ "Seven swans a-swimming,",
 \ "Eight maids a-milking,",
 \ "Nine ladies dancing,",
 \ "Ten lords a-leaping,",
 \ "Eleven pipers piping,",
 \ "Twelve drummers drumming,"

\ ]

function Nth(n)

 echom "On the " . b:days[a:n] . " day of Christmas, my true love gave to me:"

endfunction

call Nth(0) echom toupper(strpart(b:gifts[0], 4, 1)) . strpart(b:gifts[0], 5)

let b:day = 1 while (b:day < 12)

 echom " "
 call Nth(b:day)
 let b:gift = b:day
 while (b:gift >= 0)
   echom b:gifts[b:gift]
   let b:gift = b:gift - 1
 endwhile
 let b:day = b:day + 1

endwhile</lang>

Output:
On the first day of Christmas, my true love gave to me:
A partridge in a pear tree.

On the second day of Christmas, my true love gave to me:
Two turtle doves,
And a partridge in a pear tree.

[...]

On the twelfth day of Christmas, my true love gave to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

Visual Basic .NET

Translation of: C#

Compiler: Roslyn Visual Basic (language version >= 14, e.g. with Visual Studio 2015)

<lang vbnet>Module Program

   Sub Main()
       Dim days = New String(11) {"first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"}
       Dim gifts = New String(11) {
           "A partridge in a pear tree",
           "Two turtle doves",
           "Three french hens",
           "Four calling birds",
           "Five golden rings",
           "Six geese a-laying",
           "Seven swans a-swimming",
           "Eight maids a-milking",
           "Nine ladies dancing",
           "Ten lords a-leaping",
           "Eleven pipers piping",
           "Twelve drummers drumming"
       }
       For i = 0 To 11
           Console.WriteLine($"On the {days(i)} day of Christmas, my true love gave to me")
           For j = i To 0 Step -1
               Console.WriteLine(gifts(j))
           Next
           Console.WriteLine()
           If i = 0 Then gifts(0) = "And a partridge in a pear tree"
       Next
   End Sub

End Module</lang>

Wren

<lang ecmascript>var days = [

   "first", "second", "third", "fourth", "fifth", "sixth",
   "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"

]

var gifts = [

   "A partridge in a pear tree.", "Two turtle doves and", "Three french hens",
   "Four calling birds", "Five golden rings", "Six geese a-laying",
   "Seven swans a-swimming", "Eight maids a-milking", "Nine ladies dancing",
   "Ten lords a-leaping", "Eleven pipers piping", "Twelve drummers drumming"

]

for (i in 0..11) {

   System.print("On the %(days[i]) day of Christmas,")
   System.print("My true love gave to me:")
   for (j in i..0) System.print(gifts[j])
   System.print()

}</lang>

XPL0

<lang XPL0>int Day, Gift, D, G; [Day:= [0, "first", "second", "third", "forth", "fifth", "sixth",

       "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth"];

Gift:= [0,

       "A partridge in a pear tree.",
       "Two turtle doves, and",
       "Three french hens,",
       "Four calling birds,",
       "Five golden rings,",
       "Six geese a-laying,",
       "Seven swans a-swimming,",
       "Eight maids a-milking,",
       "Nine ladies dancing,",
       "Ten lords a-leaping,",
       "Eleven pipers piping,",
       "Twelve drummers drumming,"];

for D:= 1 to 12 do

       [Text(0, "On the ");  Text(0, Day(D));
        Text(0, " day of Christmas

My true love gave to me: "); for G:= D downto 1 do

               [Text(0, Gift(G));  CrLf(0)];
       CrLf(0);
       ];

]</lang>

Output:
On the first day of Christmas
My true love gave to me:
A partridge in a pear tree.

On the second day of Christmas
My true love gave to me:
Two turtle doves, and
A partridge in a pear tree.
. . .
On the twelfth day of Christmas
My true love gave to me:
Twelve drummers drumming,
Eleven pipers piping,
Ten lords a-leaping,
Nine ladies dancing,
Eight maids a-milking,
Seven swans a-swimming,
Six geese a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves, and
A partridge in a pear tree.


Yabasic

<lang yabasic>dim day$(12), gift$(12) for i = 1 to 12: read day$(i): next i for i = 1 to 12: read gift$(i): next i for i = 1 to 12

   print "On the ", day$(i), " day of Christmas,"
   print "My true love gave to me:"
   for j = i to 1 step -1: print gift$(j): next j
   print

next i end

data "first","second","third","fourth","fifth","sixth" data "seventh","eighth","ninth","tenth","eleventh","twelfth" data "A partridge in a pear tree." data "Two turtle doves and" data "Three french hens" data "Four calling birds" data "Five golden rings" data "Six geese a-laying" data "Seven swans a-swimming" data "Eight maids a-milking" data "Nine ladies dancing" data "Ten lords a-leaping" data "Eleven pipers piping" data "Twelve drummers drumming"</lang>


Z80 Assembly

You can copy-paste this into the WinAPE assembler and it will work. Run it with CALL &8000 (remember that Shift+6 on the keyboard will give you & on Winape!) Press any key to advance to the next verse. This was repurposed from my entry to the Old Lady Swallowed A Fly task.


<lang z80>waitChar equ &BB06 ;wait for a key press PrintChar equ &BB5A ;print accumulator to screen

org &8000

ld ix,VerseTable inc ix inc ix ld iy,SongLookup

ld b,12 ;12 verses total outerloop_song: push af ;new line ld a,13 call PrintChar ld a,10 call PrintChar pop af push bc push ix ld ix,VerseTable ld a,(ix+0) ld c,a ;get the low byte of verse ptr ld a,(ix+1) ld b,a ;get the high byte pop ix ;bc = the memory location of Verse1 call loop_meta_PrintString push ix push iy

ld iy,Verse0 inc (IY+1) inc (IY+1)

ld a,(IX+2) ld (IY+7),a ld a,(IX+3) ld (IY+8),a pop iy pop ix inc ix inc ix pop bc


call WaitChar ;wait for user to press any key before ;continuing so they have time to read it.


djnz outerloop_song

ReturnToBasic: ret

loop_meta_PrintString: ld a,(bc) or a ;compare A to 0. 0 is the null terminator for verses. ret z cp 255 ;255 means "goto the verse specified after the 255" jr z,GotoPreviousVerse ld (smc_loop_meta_PrintString_alpha+2),a ;use self modifying code to point IY's offset to the correct ; song line, without changing IY itself. inc a ld (smc_loop_meta_PrintString_beta+2),a smc_loop_meta_PrintString_alpha: ld a,(iy+0) ;the "+0" gets clobbered with the desired lyric low byte ld L,a smc_loop_meta_PrintString_beta: ld a,(iy+0) ;the "+0" gets clobbered with the desired lyric high byte ld H,a call PrintString ;now print the string in HL. inc bc jp loop_meta_PrintString

GotoPreviousVerse: inc bc ;advance past &FF opcode ld a,(bc) ;get low byte ld e,a inc bc ;advance to high byte ld a,(bc) ld d,a push de pop bc jp loop_meta_PrintString


PrintString: ld a,(hl) or a ret z call PrintChar inc hl jr PrintString

data

VerseTable: word Verse0 word Verse1 word Verse2 word Verse3 word Verse4 word Verse5 word Verse6 word Verse7 word Verse8 word Verse9 word Verse10 word Verse11 word Verse12

Verse0: byte 2 byte 32 ;increment this by 2 after each verse. byte 4,56,6,56 byte 255 word Verse1 ;look up next verse and write that here too. ;repeat until a hardcoded 12 verses are "sung"

Verse1: byte 8,56,0 Verse2: byte 10,56,255 word Verse1 Verse3: byte 12,56,255 word Verse2 Verse4: byte 14,56,255 word Verse3 Verse5: byte 16,56,255 word Verse4 Verse6: byte 18,56,255 word Verse5 Verse7: byte 20,56,255 word Verse6 Verse8: byte 22,56,255 word Verse7 Verse9: byte 24,56,255 word Verse8 Verse10: byte 26,56,255 word Verse9 Verse11: byte 28,56,255 word Verse10 Verse12: byte 30,56,255 word Verse11


SongLookup: word null ;0 word Day_Part1 ;2 word Day_Part2 ;4 word Day_Part3 ;6 word Day1 ;8

word Day2 ;10 word Day3 ;12 word Day4 ;14 word Day5 ;16 word Day6 ;18

word Day7 ;20 word Day8 ;22 word Day9 ;24 word Day10 ;26 word Day11 ;28

word Day12 ;30 word First ;32 word Second ;34 word Third ;36 word Fourth ;38

word Fifth ;40 word Sixth ;42 word Seventh ;44 word Eighth ;46 word Ninth ;48 word Tenth ;50

word Eleventh ;52 word Twelfth ;54

word Song_NewLine ;56

null: byte 0 Day_Part1: byte "On the",0 Day_Part2: byte "day of Christmas,",0 Day_Part3: byte "my true love gave to me",0 Day1: byte "a partridge in a pear tree.",0 Day2: byte "two turtle doves, and",0 Day3: byte "three french hens",0 Day4: byte "four calling birds",0 Day5: byte "five golden rings",0 Day6: byte "six geese a-laying",0 Day7: byte "seven swans a-swimming",0 Day8: byte "eight maids a-milking",0 Day9: byte "nine ladies dancing",0 Day10: byte "ten lords a-leaping",0 Day11: byte "eleven pipers piping",0 Day12: byte "twelve drummers drumming",0 First: byte " first ",0 Second: byte " second ",0 Third: byte " third ",0 Fourth: byte " fourth ",0 Fifth: byte " fifth ",0 Sixth: byte " sixth ",0 Seventh: byte " seventh ",0 Eighth: byte " eighth ",0 Ninth: byte " ninth ",0 Tenth: byte " tenth ",0 Eleventh: byte " eleventh ",0 Twelfth: byte " twelfth ",0

Song_NewLine: byte 13,10,0 ;control codes for a new line.</lang>

zkl

Translation of: Python

<lang zkl>gifts:=

  1. <<<

"A beer, in a tree.; Two turtlenecks; Three french toast; Four pounds of backbacon; Five golden touques; Six packs of two-four; Seven packs of smokes; Eight comic books; Nine back up singers; Ten feet of snow; Eleven hosers hosing; Twelve dozen donuts"

  1. <<<

.split(";").apply("strip");

days:=("first second third fourth fifth sixth seventh eighth ninth tenth "

     "eleventh twelfth").split();

foreach n,day in (days.enumerate()){ n+=1;

  g:=gifts[0,n].reverse();
  println("On the %s day of Christmas\nMy true love gave to me:\n".fmt(day),
        g[0,-1].concat("\n"), (n>1) and " and\n" or "", g[-1], "\n");

}</lang>

Output:
On the first day of Christmas
My true love gave to me:
A beer, in a tree.

On the second day of Christmas
My true love gave to me:
Two turtlenecks and
A beer, in a tree.

On the third day of Christmas
My true love gave to me:
Three french toast
Two turtlenecks and
A beer, in a tree.

On the fourth day of Christmas
My true love gave to me:
Four pounds of backbacon
Three french toast
Two turtlenecks and
A beer, in a tree.

On the fifth day of Christmas
My true love gave to me:
Five golden touques
Four pounds of backbacon
Three french toast
Two turtlenecks and
A beer, in a tree.

On the sixth day of Christmas
My true love gave to me:
Six packs of two-four
Five golden touques
Four pounds of backbacon
Three french toast
Two turtlenecks and
A beer, in a tree.

On the seventh day of Christmas
My true love gave to me:
Seven packs of smokes
Six packs of two-four
Five golden touques
Four pounds of backbacon
Three french toast
Two turtlenecks and
A beer, in a tree.

On the eighth day of Christmas
My true love gave to me:
Eight comic books
Seven packs of smokes
Six packs of two-four
Five golden touques
Four pounds of backbacon
Three french toast
Two turtlenecks and
A beer, in a tree.

On the ninth day of Christmas
My true love gave to me:
Nine back up singers
Eight comic books
Seven packs of smokes
Six packs of two-four
Five golden touques
Four pounds of backbacon
Three french toast
Two turtlenecks and
A beer, in a tree.

On the tenth day of Christmas
My true love gave to me:
Ten feet of snow
Nine back up singers
Eight comic books
Seven packs of smokes
Six packs of two-four
Five golden touques
Four pounds of backbacon
Three french toast
Two turtlenecks and
A beer, in a tree.

On the eleventh day of Christmas
My true love gave to me:
Eleven hosers hosing
Ten feet of snow
Nine back up singers
Eight comic books
Seven packs of smokes
Six packs of two-four
Five golden touques
Four pounds of backbacon
Three french toast
Two turtlenecks and
A beer, in a tree.

On the twelfth day of Christmas
My true love gave to me:
Twelve dozen donuts
Eleven hosers hosing
Ten feet of snow
Nine back up singers
Eight comic books
Seven packs of smokes
Six packs of two-four
Five golden touques
Four pounds of backbacon
Three french toast
Two turtlenecks and
A beer, in a tree.