Skip to content

Instantly share code, notes, and snippets.

@Techcable
Last active March 15, 2022 03:51
Show Gist options
  • Select an option

  • Save Techcable/93abdc99e61d3bfc8ae859a79cbb43e8 to your computer and use it in GitHub Desktop.

Select an option

Save Techcable/93abdc99e61d3bfc8ae859a79cbb43e8 to your computer and use it in GitHub Desktop.
Simple script for naming the integers <10,000 (used in my math/proofs class)
from math import floor, log10
import sys
WORDS = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four',
5: 'five',
6: 'six',
7: 'seven',
8: 'eight',
9: 'nine',
10: 'ten',
11: 'eleven',
12: 'tweleve',
13: 'thirteen',
14: 'fourteen',
15: 'fifteen',
16: 'sixteen',
17: 'seventeen',
18: 'eighteen',
19: 'nineteen',
# meaning & logic changes here
20: 'twenty',
30: 'thirty',
40: 'fourty',
50: 'fifty',
60: 'sixty',
70: 'seventy',
80: 'eighty',
90: 'ninety',
# meaning & logic changes here
100: 'hundred',
1000: 'thousand'
}
def name_number(i: int):
if not isinstance(i, int):
raise TypeError("Can only name the integers")
if i < 0:
return f"negative {name_number(-i)}"
try:
return WORDS[i]
except KeyError:
pass
assert i > 20
if i < 100:
ones_place = i % 10
assert ones_place in range(0, 10)
tens_place = i - ones_place
assert tens_place % 10 == 0
res = [WORDS[tens_place]]
if ones_place != 0:
res.append(WORDS[ones_place])
return ' '.join(res)
else:
floor_log = floor(log10(i))
# ie 100, 1000
floor_power = 10**floor_log
try:
floor_power_name = WORDS[floor_power]
except KeyError:
raise ValueError(f"Number >=10**{floor_power} is too large to represent")
multiple, leftover = divmod(i, floor_power)
assert multiple in range(1, 10)
assert leftover >= 0
res = [WORDS[multiple], floor_power_name]
if leftover != 0:
leftover_name = name_number(leftover)
if 'and' not in leftover_name:
res.append('and')
res.append(leftover_name)
return ' '.join(res)
def main():
try:
number = int(sys.argv[1])
except IndexError:
print("Insufficent arguments! Please specify a single integer", file=sys.stderr)
sys.exit(1)
except ValueError:
print(f"Must specify a valid integer: {sys.argv[1]!r}", file=sys.stderr)
sys.exit(1)
try:
print(name_number(number))
except ValueError as e:
print(str(e), file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment