language-agnosticcode-golfrosetta-stone

Code Golf: Print the entire "12 Days of Christmas" song in the fewest lines of code


Print all 12 verses of the popular holiday song.

By 12 verses I mean the repetition of each line as is sung in the song, ie

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

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

...

Verse N: On the nth day of Christmas my true love gave to me (Verse N-1 without the first line) (line added in verse N)


Solution

  • Common Lisp:

    (mapc #'princ
          (reverse (maplist #'(lambda(l)
             (format nil 
                "On the ~:R day of Christmas my true love gave to me~%~{~a~%~}~%" 
                    (length l) l)) 
        '("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."))))
    

    Edit:

    Above is 412 characters if you take out the whitespace.

    This one:

    (let ((g))
      (dotimes (i 12)
        (format t
            "On the ~:R day of Christmas my true love gave to me~%~{~R ~:*~
             ~[~;~;turtle doves and~;french hens,~;calling birds,~;gold rings,~
             ~;geese a-laying,~;swans a-swimming,~;maids a-milking,~
             ~;ladies dancing,~;lords a-leaping,~;pipers piping,~
             ~;drummers drumming,~]~%~}a partridge in a pear tree~2%"
            (1+ i) g)
        (push (+ i 2) g)))
    

    is 344 characters if you take out whitespace and ~ quoted newlines in the format string:

    (let((g))(dotimes(i 12)(format t"On the ~:R day of Christmas my true love gave to me~%~{~R ~:*~[~;~;turtle doves and~;french hens,~;calling birds,~;gold rings,~;geese a-laying,~;swans a-swimming,~;maids a-milking,~;ladies dancing,~;lords a-leaping,~;pipers piping,~;drummers drumming,~]~%~}a partridge in a pear tree~2%"(1+ i)g)(push(+ i 2)g)))
    

    Edit:

    It looks like the question has run its course, and the site is nagging me to accept an answer. As far as I can see, this one is the shortest. I'm a little afraid of what the site will do if I accept my own answer - probably award me a Narcissist or Masturbator badge.

    You can't accept your own answers. Fair enough. I'll leave it open. Thanks to everyone who responded.