About Python
The Python programming language offers an intuitive syntax and good OO features. The collection of standard and 3rd party modules is comprehensive and growing. It is available on most platforms, and it is extendable and embedable. It is usable from soft RT applications to complex data analysis and Processing.
The lyrics: On the first day of Christmas my true love gave to me
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 gold 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 gold 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 gold 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 gold 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 gold 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 gold 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 gold 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 gold rings
four calling birds
three French hens
two turtle doves
and a partridge in a pear tree
Comments
(255 chars, 715 bytes)
exec(bytes(‘潦湩爠湡敧ㄨ⤲瀺楲瑮∨湏琠敨┠慤⁹景䌠牨獩浴獡湜祍琠畲潬敶猠湥⁴潴洠≥∥楆獲⁴敓潣摮吠楨摲䘠畯瑲楆瑦楓瑸敓敶瑮楅桧桴丠湩桴吠湥桴䔠敬敶瑮睔汥瑦≨献汰瑩⤨敛ⱝ∪睔汥敶䐠畲浭牥牄浵幭汅癥湥倠灩牥楐幰敔潌摲ⵡ敌灡乞湩慌楤獥䐠湡幣楅桧⁴慍摩ⵡ楍歬卞癥湥匠慷獮愭匭楷浭卞硩䜠敥敳愭䰭祡䙞癩潇摬删湩獧簬潆牵䌠污楬杮䈠物獤簬桔敲牆湥档䠠湥ⱳ呼潷吠牵汴潄敶ⱳ愠摮䅼倠牡牴摩敧椠敐牡吠敲湜⸢敲汰捡⡥帢Ⱒ椢杮簬⤢献汰瑩∨≼嬩敾崺猬灥∽湜⤢’,’U16′)[2:])
(460 chars, 460 bytes)
for e in range(12):print(“On the %s day of Christmas\nMy true love sent to me”%”First Second Third Fourth Fifth Sixth Seventh Eighth Ninth Tenth Eleventh Twelfth”.split()[e],*”Twelve Drummers Drumm^Eleven Pipers Pip^Ten Lords-a-Leap^Nine Ladies Danc^Eight Maids-a-Milk^Seven Swans-a-Swimm^Six Geese-a-Lay^Five Gold Rings,|Four Calling Birds,|Three French Hens,|Two Turtle Doves, and|A Partridge in a Pear Tree.\n”.replace(“^”,”ing,|”).split(“|”)[~e:],sep=”\n”)
I think my mod below is more ‘Pythonic’ though
#Print 12 Days of Christmas song using loops
Present_List = [‘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’]
Days = [‘first’, ‘second’, ‘third’, ‘forth’, ‘fifth’, ‘sixth’, ‘seventh’,
‘eighth’, ‘ninth’, ‘tenth’, ‘eleventh’, ‘twelfth’]
for Day_No, Day_Name in enumerate(Days):
print(‘\nOn the ‘ + Day_Name + ‘ day of Christmas my true love gave to me ‘ + Present_List[Day_No])
for Present in reversed(range(Day_No)):
print(Present_List[Present])
#Print 12 Days of Christmas song using loops (my first ever Python program)
Present_List = [‘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’]
Days = [‘first’, ‘second’, ‘third’, ‘forth’, ‘fifth’, ‘sixth’, ‘seventh’,
‘eighth’, ‘ninth’, ‘tenth’, ‘eleventh’, ‘twelfth’]
for Day_No, Day_Name in enumerate(Days):
print(‘On the ‘ + Day_Name + ‘ day of Christmas my true love sent to me…’)
while Day_No >= 0:
print(‘…..’ + Present_List[Day_No])
Day_No -= 1
If I am alowed the inflect module, that was not part of the default Python instalation, but it easily downloaded using pip install inflect I get 476
import inflect as e
p=e.engine()
for i in range(12):print(“On the {} day of Christmas my true love gave to me\n”.format(p.number_to_words(p.ordinal(i+1)))+””.join([“twelve drummers drumming\n”,”eleven pipers piping\n”,”ten lords a-leaping\n”,”nine ladies dancing\n”,”eight maids a-milking\n”,”seven swans a-swimming\n”,”six geese a-laying\n”,”five gold rings\n”,”four calling birds\n”,”three French hens\n”,”two turtle doves\nand “,”a partridge in a pear tree\n”][11-i:]))
If I am alowed to write 1st instead of first, I do not need to call p.number_to_words() and get down to 457
If I compress that again, I get 427. (But this is with 1st, 2nd etc.)
import zlib,base64
exec(zlib.decompress(base64.b64decode(b’eJxFkc9OwzAMxu97CqunVmOVynESJySuPMDYwbRuakicyElXJsS7425sXPLn98mf4y8cUtQCLKOnvgBmoE16opbEsVDdbMaowKaDojiqu8dmn5Sl1NWrQJkIvn9gwDPEEZ4n5VyCeYQzFJ0JfDwROLSlRAj0JlVrfgFLndqoAwv6mrdd02yrqv2ILPWhKgt5Kxh0DoE0Xw8szoofKvJ0IoHEaZVsuwnFqDfLDLjzhHcuNgV4HJjMCaW/G7GbCgTkS0Vg/3lT8qVDXlBWJS/83z3zFziiTGsTPN/wyOuU0Q9gwbh8ZXFW6NF7I/DO9rDrMyclghcl6SeYSP7oEqHMWryNbYkZRBnABISEWpQHR+sX2JVQLVpaozweum7H+2PT/AITT5yx’)))
Sorry, I counted wrongly. The compressed version is only marginaly shorter at 456
On the other hand, as p is only used once, I do not need it, and cne save a few characters by incorporating the call to e.engine() into the print statement.
That brings me down to 452 with no compression.
The system messed up the single quotes, replae them with normal single quotes, and the code will run. e(b’eJ and ==’))
If you prefer the uncompressed version:
for i in range(12):print(“On the {} day of Christmas my true love gave to me\n”.format(“first,second,third,fourth,fifth,sixth,seventh,eighth,ninth,tenth,eleventh,twelfth”.split(“,”)[i])+””.join([“twelve drummers drumming\n”,”eleven pipers piping\n”,”ten lords a-leaping\n”,”nine ladies dancing\n”,”eight maids a-milking\n”,”seven swans a-swimming\n”,”six geese a-laying\n”,”five gold rings\n”,”four calling birds\n”,”three French hens\n”,”two turtle doves\nand “,”a partridge in a pear tree\n”][11-i:]))
Everything in one line, to avoid wasting characters on line breaks. (Yes, I know that line breakes are normally not a waste, but in this setting they are.)
This is impressively dense for being uncompressed. 503 characters vs 480 on your compressed version. Think you can squeeze this down below 480?
import zlib,base64
exec(zlib.decompress(base64.b64decode(b’eJxFUbtuwzAM/BVCU4w6BtIxa4Gu/YA0A2tRFls9DEqJGxT991Jxki6kdWc+7uiyAAMnEEwTbXbP3X4WTnVj3hJUT/DzCxYvkB28eOFSIxaIF6hyIgj5TDChhpoh0nsyg8sSUasdS6l9oTEn21fPYnuXT1J979hpLPzdIp0paSaevKbE7VFXKNy4ulDQCjOUObB27k134GP3ZMzwmTltDqb9oTtYOcVIUtYPTpPu05u1D8w8N0rTndAxKkBsAdwGwgeuS6gytEzaCdP4aNR2hIh8rYgcvu7MVQWUBVNjysL/01UmTESF2hC83GHHzbgcLKjXU1kxtQdGDEER+FDDVrh6IYJXoTR68JRu6JKhqp1BZesRFMRkQQmEGaUK24naVfVJKHotatc5Hna7Le+P0HV/Zu2xDw==’)))
Code should be readable and maintainable:
#! /usr/bin/python3
def xmas():
lyrics = [(1, ‘a partridge in a pear tree’,’first’),
(2, ‘two turtle doves’,’second’),
(3, ‘three French hens’,’third’),
(4, ‘four calling birds’,’fourth’),
(5, ‘five gold rings’,’fifth’),
(6, ‘six geese a-laying’,’sixth’),
(7, ‘seven swans a-swimming’,’seventh’),
(8, ‘eight maids a-milking’,’eight’),
(9, ‘nine ladies dancing’,’ninth’),
(10, ‘ten lords a-leaping’,’tenth’),
(11, ‘eleven pipers piping’,’eleventh’),
(12, ‘twelve drummers drumming’,’twelfth’)]
for (i, what, day) in lyrics:
print(“On the {} of Christmas my true love gave to me”.format(day))
for j in reversed(range(0, i)):
if i > 1 and j == 0:
print(‘and ‘, end=”)
print(lyrics[j][1])
print()
if __name__ == ‘__main__’:
xmas()
Still some room for improvement. Wait for my Ada example…
#! /usr/bin/python3
def day(i):
o = [‘first’, ‘second’, ‘third’, ‘fourth’,
‘fifth’, ‘sixth’, ‘seventh’, ‘eight’,
‘ninth’, ‘tenth’, ‘eleventh’, ‘twelfth’]
return “On the {} day of Christmas my true love gave to me”.format(o[i])
def what(i):
w = [‘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’]
return w[i]
def xmas():
for i in range(0, 12):
print(day(i))
for j in reversed(range(0, i+1)):
if i > 0 and j == 0:
print(‘and ‘ + what(j))
else:
print(what(j))
print()
if __name__ == ‘__main__’:
xmas()
+1 for readability. That is some SINTEF-quality over that piece of code!
Formatting was messed up…
I have a feeling this is not a winner,but it is possible to do it in 480 characters, without depending on external sources:
import zlib,base64
exec(zlib.decompress(base64.b64decode(b’eJxFUbtuwzAM/BVCU4w6BtIxa4Gu/YA0A2tRFls9DEqJGxT991Jxki6kdWc+7uiyAAMnEEwTbXbP3X4WTnVj3hJUT/DzCxYvkB28eOFSIxaIF6hyIgj5TDChhpoh0nsyg8sSUasdS6l9oTEn21fPYnuXT1J979hpLPzdIp0paSaevKbE7VFXKNy4ulDQCjOUObB27k134GP3ZMzwmTltDqb9oTtYOcVIUtYPTpPu05u1D8w8N0rTndAxKkBsAdwGwgeuS6gytEzaCdP4aNR2hIh8rYgcvu7MVQWUBVNjysL/01UmTESF2hC83GHHzbgcLKjXU1kxtQdGDEER+FDDVrh6IYJXoTR68JRu6JKhqp1BZesRFMRkQQmEGaUK24naVfVJKHotatc5Hna7Le+P0HV/Zu2xDw==’)))
The system muddles my single quotes. Put in a normal single quote in b’eJxFUbt and Dw==’))) and it will run.
import zlib,base64
exec(zlib.decompress(base64.b64decode(b’eJxFUbtuwzAM/BVCU4w6BtIxa4Gu/YA0A2tRFls9DEqJGxT9
91Jxki6kdWc+7uiyAAMnEEwTbXbP3X4WTnVj3hJUT/DzCxYvkB28eOFSIxaIF6hyIgj5TDChhpoh0nsyg8s
SUasdS6l9oTEn21fPYnuXT1J979hpLPzdIp0paSaevKbE7VFXKNy4ulDQCjOUObB27k134GP3ZMzwmTlt
Dqb9oTtYOcVIUtYPTpPu05u1D8w8N0rTndAxKkBsAdwGwgeuS6gytEzaCdP4aNR2hIh8rYgcvu7MVQW
UBVNjysL/01UmTESF2hC83GHHzbgcLKjXU1kxtQdGDEER+FDDVrh6IYJXoTR68JRu6JKhqp1BZesRFM
RkQQmEGaUK24naVfVJKHotatc5Hna7Le+P0HV/Zu2xDw==’)))
Does the entire lines survive? Or do you miss out on something? I will repsot once again with shorter lines:
import zlib,base64
exec(zlib.decompress(base64.b64decode(b’eJxFUbtuwzAM/BVCU4w6BtIxa4Gu/
YA0A2tRFls9DEqJGxT991Jxki6kdWc+7uiyAAMnEEwTbXbP3X4WTnVj3hJUT/Dz
CxYvkB28eOFSIxaIF6hyIgj5TDChhpoh0nsyg8sSUasdS6l9oTEn21fPYnuXT1J97
9hpLPzdIp0paSaevKbE7VFXKNy4ulDQCjOUObB27k134GP3ZMzwmTltDqb9oT
tYOcVIUtYPTpPu05u1D8w8N0rTndAxKkBsAdwGwgeuS6gytEzaCdP4aNR2hIh8
rYgcvu7MVQWUBVNjysL/01UmTESF2hC83GHHzbgcLKjXU1kxtQdGDEER+FD
DVrh6IYJXoTR68JRu6JKhqp1BZesRFMRkQQmEGaUK24naVfVJKHotatc5Hna7
Le+P0HV/Zu2xDw==’)))
Remember: Thereshould be no line breaks in the exec string
If you are allowed to read from an external source, why not assume a local copy of the lyrics in a file called a?
print(open(‘a’).read())
23 symbols
I feel like this is cheating, but I appreciate the creativity 😉
;-P
I made a solution, i dont know if this is allowed but here it is:
import bs4, requests; soup=bs4.BeautifulSoup(requests.get(“https://blog.sintef.com/digital-en/how-many-python-lines-do-you-need-to-generate-the-entire-lyrics-of-twelve-days-of-christmas/”).text, ‘lxml’)
for t in soup.find(“div”,{‘id’:’entry-content’}).findAll(“p”)[5:]:print(str(t).replace(“”, “”).replace(“”, “\n”).replace(“”, “”))
344 symbols in total
Lose the variable soup, and you cam do it in 331 characters.
import bs4,requests
for t in bs4.BeautifulSoup etc….
I can’t tell why, but this feels less like cheating than reading from file. Though you can probably also find a shorter url somewhere if you are counting characters.