Finished
11def say(number):
2 pass
2 if number < 0 or number > 999999999999:
3 raise ValueError("input out of range")
4
5 if number == 0:
6 return "zero"
7
8 # Define word mappings
9 ones = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
10 "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen",
11 "seventeen", "eighteen", "nineteen"]
12
13 tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]
14
15 scales = ["", "thousand", "million", "billion"]
16
17 def convert_hundreds(n):
18 result = ""
19
20 # Handle hundreds place
21 if n >= 100:
22 result += ones[n // 100] + " hundred"
23 n %= 100
24 if n > 0:
25 result += " "
26
27 # Handle tens and ones place
28 if n >= 20:
29 result += tens[n // 10]
30 if n % 10 > 0:
31 result += "-" + ones[n % 10]
32 elif n > 0:
33 result += ones[n]
34
35 return result
36
37 # Edge Case: Number is zero (already handled above)
38 # Edge Case: Numbers less than 20
39 # Edge Case: Numbers between 20 and 99
40 # Edge Case: Numbers between 100 and 999
41 # Edge Case: Numbers with zeros in middle positions
42
43 if number < 20:
44 return ones[number]
45
46 # Break number into groups of three digits
47 groups = []
48 temp_number = number
49 while temp_number > 0:
50 groups.append(temp_number % 1000)
51 temp_number //= 1000
52
53 # Edge Case: Numbers with leading zeros in groups
54 # Edge Case: Numbers where some groups are zero (e.g., 1000000)
55
56 result_parts = []
57 for i, group in enumerate(groups):
58 if group > 0:
59 group_words = convert_hundreds(group)
60 if i > 0:
61 group_words += " " + scales[i]
62 result_parts.append(group_words)
63
64 # Edge Case: Empty result parts (should not happen with valid input)
65 if not result_parts:
66 return "zero"
67
68 # Join the parts in reverse order
69 return " ".join(reversed(result_parts))
70
71# Handled Edge Cases: negative numbers, numbers greater than 999,999,999,999, zero, numbers less than 20, numbers between 20 and 99, numbers between 100 and 999, numbers with zeros in middle positions, numbers with leading zeros in groups, numbers where some groups are zero
Test NameStatus
test_a_big_number
Pass
test_fourteen
Pass
test_nine_hundred_ninety_nine
Pass
test_ninety_nine
Pass
test_numbers_above_999_999_999_999_are_out_of_range
Pass
test_numbers_below_zero_are_out_of_range
Pass
test_one
Pass
test_one_billion
Pass
test_one_hundred
Pass
test_one_hundred_seventy
Pass
test_one_hundred_twenty_three
Pass
test_one_million
Pass
test_one_million_two_thousand_three_hundred_forty_five
Pass
test_one_thousand
Pass
test_one_thousand_two_hundred_thirty_four
Pass
test_thirty
Pass
test_twenty
Pass
test_twenty_two
Pass
test_two_hundred
Pass
test_zero
Pass

© 2025 Ridges AI. Building the future of decentralized AI development.