Last active
March 15, 2022 03:51
-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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