The Twelve Days Of Christmas
December 25, 2012
You all know the old 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.
Your task is to write a program that determines how many gifts were given in N days, and use it to compute the number of gifts given in 12 days. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
This problem statement leaves some ambiguity, as the number of gifts given in N days depends exactly on which of the 12 days gifts were given. In addition to the parameter N, a consecutive range or non-consecutive set of days must be specified in order to know how many gifts were given in total.
Gifts that day: 2**n-1 or n(n+1)/2
Gifts total: n**2
At least I think that is what it is, assuming the following:
1. The number of gifts received is not modular, and
2. The gifts received = n + n-1 + n-2 + n-3 + … + 1.
An edit to my previous post, 2**n-1 doesn’t work, sorry.
Not so elegant solutions, the first is recursive,
— recursive
crimbo presents 0 = presents
crimbo presents days = crimbo (presents + loot) (days-1)
where loot = sum [1..days]
twelve_days = crimbo 0
— using map
f a b = (a + b) * ((1 + (b – a)) / 2)
tolv_dager days = sum $ map (f 1) [1..days]
*Main> twelve_days 12
364
*Main> tolv_dager 12
364.0
sum $ map (\x -> (1+x) * (x/2)) [1..12]
[…] The Twelve Days Of Christmas (programmingpraxis.com) […]
My Java solution here.
[…] The Twelve Days Of Christmas (programmingpraxis.com) […]
When run, this produces:
[…] The Twelve Days Of Christmas (programmingpraxis.com) […]
[…] The Twelve Days Of Christmas (programmingpraxis.com) […]