# Swift's closure
# https://d...content-available-to-author-only...e.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html
def __unfoldl_string_rec__(b, f):
pair = f(b)
if pair is None:
return ""
else:
a, b1 = pair
return unfoldl_string(b1, f) + a
def __unfoldl_string_while__(b, f):
s = ""
pair = f(b)
while not(pair is None):
a, b1 = pair
s += a
pair = f(b1)
return s
# unfoldl_string = __unfoldl_string_rec__
unfoldl_string = __unfoldl_string_while__
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 unfoldl_string(
number,
lambda num:
None
if num <= 0 else
(digitNames[num % 10], num / 10)
)
strings = [number_to_string(number) for number in numbers]
for s in strings:
print(s)
IyBTd2lmdCdzIGNsb3N1cmUKIyAgIGh0dHBzOi8vZC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vbGlicmFyeS9pb3MvZG9jdW1lbnRhdGlvbi9Td2lmdC9Db25jZXB0dWFsL1N3aWZ0X1Byb2dyYW1taW5nX0xhbmd1YWdlL0Nsb3N1cmVzLmh0bWwKCgpkZWYgX191bmZvbGRsX3N0cmluZ19yZWNfXyhiLCBmKToKICAgIHBhaXIgPSBmKGIpCgogICAgaWYgcGFpciBpcyBOb25lOgogICAgICAgIHJldHVybiAiIgogICAgZWxzZToKICAgICAgICBhLCBiMSA9IHBhaXIKCiAgICAgICAgcmV0dXJuIHVuZm9sZGxfc3RyaW5nKGIxLCBmKSArIGEKCgpkZWYgX191bmZvbGRsX3N0cmluZ193aGlsZV9fKGIsIGYpOgogICAgcyAgICA9ICIiCiAgICBwYWlyID0gZihiKQoKICAgIHdoaWxlIG5vdChwYWlyIGlzIE5vbmUpOgogICAgICAgIGEsIGIxID0gcGFpcgoKICAgICAgICBzICAgICs9IGEKICAgICAgICBwYWlyID0gZihiMSkKCiAgICByZXR1cm4gcwoKCiMgdW5mb2xkbF9zdHJpbmcgPSBfX3VuZm9sZGxfc3RyaW5nX3JlY19fCnVuZm9sZGxfc3RyaW5nICAgPSBfX3VuZm9sZGxfc3RyaW5nX3doaWxlX18KCgpkaWdpdE5hbWVzID0gewogICAgMDogIlplcm8iLCAxOiAiT25lIiwgMjogIlR3byIsICAgMzogIlRocmVlIiwgNDogIkZvdXIiLAogICAgNTogIkZpdmUiLCA2OiAiU2l4IiwgNzogIlNldmVuIiwgODogIkVpZ2h0IiwgOTogIk5pbmUiCn0KbnVtYmVycyA9IFsxNiwgNTgsIDUxMF0KCgpkZWYgbnVtYmVyX3RvX3N0cmluZyhudW1iZXIpOgogICAgcmV0dXJuIHVuZm9sZGxfc3RyaW5nKAogICAgICAgIG51bWJlciwKICAgICAgICBsYW1iZGEgbnVtOgogICAgICAgICAgICAgICAgTm9uZQogICAgICAgICAgICBpZiBudW0gPD0gMCBlbHNlCiAgICAgICAgICAgICAgICAoZGlnaXROYW1lc1tudW0gJSAxMF0sIG51bSAvIDEwKQogICAgKQpzdHJpbmdzID0gW251bWJlcl90b19zdHJpbmcobnVtYmVyKSBmb3IgbnVtYmVyIGluIG51bWJlcnNdCgoKZm9yIHMgaW4gc3RyaW5nczoKICAgIHByaW50KHMp