def unfold(f, x):
xs = f(x)
while xs:
yield xs[0]
xs = f(xs[1])
digitNames = {
0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
}
numbers = [16, 58, 510]
def number_to_string(number):
return reduce(lambda x,y : y + x,
unfold(lambda n: None if n <= 0
else (digitNames[n % 10], n // 10),
number),
'')
strings = [number_to_string(number) for number in numbers]
for s in strings:
print(s)
ZGVmIHVuZm9sZChmLCB4KToKICAgIHhzID0gZih4KQogICAgd2hpbGUgeHM6CiAgICAgICAgeWllbGQgeHNbMF0KICAgICAgICB4cyA9IGYoeHNbMV0pCgoKZGlnaXROYW1lcyA9IHsKICAgIDA6ICJaZXJvIiwgMTogIk9uZSIsIDI6ICJUd28iLCAgIDM6ICJUaHJlZSIsIDQ6ICJGb3VyIiwKICAgIDU6ICJGaXZlIiwgNjogIlNpeCIsIDc6ICJTZXZlbiIsIDg6ICJFaWdodCIsIDk6ICJOaW5lIgp9Cm51bWJlcnMgPSBbMTYsIDU4LCA1MTBdCiAKIApkZWYgbnVtYmVyX3RvX3N0cmluZyhudW1iZXIpOgogICAgcmV0dXJuIHJlZHVjZShsYW1iZGEgeCx5IDogeSArIHgsIAogICAgICAgICAgICAgICAgICB1bmZvbGQobGFtYmRhIG46IE5vbmUgaWYgbiA8PSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIChkaWdpdE5hbWVzW24gJSAxMF0sIG4gLy8gMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyKSwKICAgICAgICAgICAgICAgICAgJycpCnN0cmluZ3MgPSBbbnVtYmVyX3RvX3N0cmluZyhudW1iZXIpIGZvciBudW1iZXIgaW4gbnVtYmVyc10KIApmb3IgcyBpbiBzdHJpbmdzOgogICAgcHJpbnQocyk=