monorepo/number-speller/number_speller.py
dogeystamp d479365a94
[number-speller] fixes
- if name == main added
- problematic filename for imports changed
- added caser.py
2024-05-23 19:22:02 -04:00

135 lines
1.9 KiB
Python

import math
pows = """
thousand
million
billion
trillion
quadrillion
quintillion
sextillion
septillion
octillion
nonillion
decillion
undecillion
duodecillion
tredecillion
quattuordecillion
quindecillion
sexdecillion
septendecillion
octodecillion
novemdecillion
vigintillion
unvigintillion
duovigintillion
trevigintillion
quattuorvigintillion
quinvigintillion
sexvigintillion
septenvigintillion
octovigintillion
novemvigintillion
trigintillion
untrigintillion
duotrigintillion
tretrigintillion
quattuortrigintillion
quintrigintillion
sextrigintillion
septentrigintillion
octatrigintillion
novemtrigintillion
quadragintillion
""".split()
nums = """
zero
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
thirteen
fourteen
fifteen
sixteen
seventeen
eighteen
nineteen
""".split()
tens = """
ten
twenty
thirty
fourty
fifty
sixty
seventy
eighty
ninety
""".split()
def fmt_unit(x: int, single=False) -> list[str]:
if x == 0 and not single:
return []
return [nums[x]]
def fmt_tens(x: int) -> list[str]:
ans: list[str] = []
if x >= 20:
ans.append(tens[x // 10 - 1])
x -= (x // 10) * 10
if x > 0:
ans += fmt_unit(x)
else:
ans += fmt_unit(x)
return ans
def fmt_hundreds(x: int) -> list[str]:
ans: list[str] = []
if x < 100:
ans = fmt_tens(x)
else:
ans += fmt_unit(x // 100)
ans += ["hundred"]
x -= (x // 100) * 100
ans += fmt_tens(x)
return ans
def fmt_num(x: int) -> list[str]:
ans: list[str] = []
if x == 0:
return ["zero"]
p: int = math.ceil(math.log10(x) // 3) * 3
while p >= 3:
val = x // (10**p)
if val > 0:
ans += fmt_hundreds(val)
ans += [pows[p // 3 - 1]]
x -= val * 10**p
p -= 3
ans += fmt_hundreds(x)
return ans
if __name__ == "__main__":
i = int(input())
print(" ".join(fmt_num(i)))