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)