generated from mwc/problemset_numberwords
resubmission
at the end I couldn't stop getting errors until i realized that the error was on the last line of the test_numberwords.py code!
This commit is contained in:
parent
25f89eadc4
commit
10d64214d2
|
@ -0,0 +1,39 @@
|
|||
# nw.py
|
||||
# ------
|
||||
# Implements a simple number-to-text command-line interface.
|
||||
# Ex: python nw.py 145
|
||||
|
||||
from argparse import ArgumentParser
|
||||
from numberwords import int_under_1000000_to_str
|
||||
|
||||
|
||||
|
||||
def int_under_1000000_to_str(number):
|
||||
if number < 0 or number >= 1000000:
|
||||
return "Number out of range"
|
||||
|
||||
units = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
|
||||
teens = ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen",
|
||||
"seventeen", "eighteen", "nineteen"]
|
||||
tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]
|
||||
|
||||
def number_to_words(n):
|
||||
if n < 10:
|
||||
return units[n]
|
||||
elif 10 <= n < 20:
|
||||
return teens[n - 10]
|
||||
elif n < 100:
|
||||
return tens[n // 10] + ('' if n % 10 == 0 else '-' + units[n % 10])
|
||||
elif n < 1000:
|
||||
return units[n // 100] + ' hundred' + (' and ' + number_to_words(n % 100) if n % 100 != 0 else '')
|
||||
elif n < 1000000:
|
||||
return (number_to_words(n // 1000) + ' thousand' +
|
||||
('' if n % 1000 == 0 else ' ' + number_to_words(n % 1000)))
|
||||
|
||||
return number_to_words(number)
|
||||
|
||||
parser = ArgumentParser("Print out a number as it is spoken in English.")
|
||||
parser.add_argument("number", type=int)
|
||||
args = parser.parse_args()
|
||||
text = int_under_1000000_to_str(args.number)
|
||||
print(text)
|
|
@ -15,19 +15,51 @@ TENS_NAMES = [
|
|||
]
|
||||
|
||||
def int_under_1000000_to_str(number):
|
||||
return "umm..."
|
||||
if number < 1000:
|
||||
return int_under_1000_to_str(number)
|
||||
else:
|
||||
thousands = number // 1000
|
||||
remainder = number % 1000
|
||||
thousands_name = int_under_1000_to_str(thousands) + ' thousand'
|
||||
if remainder == 0:
|
||||
return thousands_name
|
||||
else:
|
||||
return thousands_name + ' ' + int_under_1000_to_str(remainder)
|
||||
|
||||
|
||||
def int_under_1000_to_str(number):
|
||||
return "umm..."
|
||||
if number < 100 :
|
||||
return int_under_100_to_str(number)
|
||||
else:
|
||||
hundreds = number // 100
|
||||
remainder = number % 100
|
||||
hundreds_names = int_under_10_to_str(hundreds) + ' hundred'
|
||||
if remainder == 0:
|
||||
return hundreds_names
|
||||
else:
|
||||
return hundreds_names + ' and ' + int_under_100_to_str(remainder)
|
||||
|
||||
def int_under_100_to_str(number):
|
||||
return "umm..."
|
||||
if number <20:
|
||||
return int_under_20_to_str(number)
|
||||
else:
|
||||
tens = number // 10
|
||||
units = number % 10
|
||||
if units == 0:
|
||||
return TENS_NAMES[tens]
|
||||
else:
|
||||
return TENS_NAMES[tens] + '-' + int_under_10_to_str(units)
|
||||
|
||||
|
||||
def int_under_20_to_str(number):
|
||||
return "umm..."
|
||||
if number <10:
|
||||
return int_under_10_to_str(number)
|
||||
else:
|
||||
return TWEEN_AND_TEEN_NAMES [number-10]
|
||||
|
||||
|
||||
def int_under_10_to_str(number):
|
||||
return "umm..."
|
||||
return DIGIT_NAMES [number]
|
||||
|
||||
def divide_with_remainder(dividend, divisor):
|
||||
"""Divides one number by another, using whole-number division.
|
||||
|
|
20
planning.md
20
planning.md
|
@ -21,6 +21,11 @@ elif number == 1:
|
|||
return "one"
|
||||
elif number == 1:
|
||||
return "two"
|
||||
if n < 10:
|
||||
return units[n]
|
||||
n % 10
|
||||
n% 100
|
||||
n % 1000
|
||||
```
|
||||
|
||||
A cleaner way to do this would be to make a list of digit names, from zero to nine.
|
||||
|
@ -35,21 +40,32 @@ return digit_names[number]
|
|||
```
|
||||
|
||||
## Integers under 20
|
||||
If the integer is under 10, then use the procedure described above.
|
||||
Otherwise, ... (this is where you take over!)
|
||||
if n < 10:
|
||||
return units[n]
|
||||
|
||||
## Integers under 100
|
||||
n < 100:
|
||||
return tens[n // 10] + ('' if n % 10 == 0 else '-' + units[n % 10])
|
||||
|
||||
|
||||
|
||||
## Integers under 1000
|
||||
n < 1000:
|
||||
return units[n // 100] + ' hundred' + (' and ' + number_to_words(n % 100) if n % 100 != 0 else '')
|
||||
|
||||
|
||||
## Integers under 1000000
|
||||
n < 1000000:
|
||||
return (number_to_words(n // 1000) + ' thousand' +
|
||||
('' if n % 1000 == 0 else ' ' + number_to_words(n % 1000)))
|
||||
|
||||
|
||||
## Negative integers down to -1 million
|
||||
We won't deal with negative integers in this problem set,
|
||||
but how would you deal with a negative integer, using the
|
||||
functions above?
|
||||
if number < 0:
|
||||
|
||||
return "negative " + int_under_1000000_to_str(-number)
|
||||
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ class TestIntToStr(unittest.TestCase):
|
|||
[int_under_1000000_to_str, 1001, 'one thousand one'],
|
||||
[int_under_1000000_to_str, 1672, 'one thousand six hundred and seventy-two'],
|
||||
[int_under_1000000_to_str, 10000, 'ten thousand'],
|
||||
[int_under_1000000_to_str, 588567, 'five hundred and ninety-eight thousand five hundred and sixty-seven'],
|
||||
[int_under_1000000_to_str, 588567, 'five hundred and eighty-eight thousand five hundred and sixty-seven'],
|
||||
]
|
||||
|
||||
def test_converts_integer_to_string(self):
|
||||
|
|
Loading…
Reference in New Issue