diff --git a/17_number_letter_count/main.go b/17_number_letter_count/main.go new file mode 100644 index 0000000..ea35d4e --- /dev/null +++ b/17_number_letter_count/main.go @@ -0,0 +1,78 @@ +package main + +import "fmt" + +func main() { + count := 0 + for i := 1; i <= 1000; i++ { + count += CountNumberLetter(i) + } + fmt.Println("count:", count) +} + +var numberToLetter = map[int]string{ + 1: "one", + 2: "two", + 3: "three", + 4: "four", + 5: "five", + 6: "six", + 7: "seven", + 8: "eight", + 9: "nine", + 10: "ten", + 11: "eleven", + 12: "twelve", + 13: "thirteen", + 14: "fourteen", + 15: "fifteen", + 16: "sixteen", + 17: "seventeen", + 18: "eighteen", + 19: "nineteen", + 20: "twenty", + 30: "thirty", + 40: "forty", + 50: "fifty", + 60: "sixty", + 70: "seventy", + 80: "eighty", + 90: "ninety", + 100: "hundred", + 1000: "thousand", +} + +func CountNumberLetter(input int) int { + n := input + num := "" + if input <= 20 { + num += numberToLetter[input] + fmt.Println("input:", n, "num:", num, len(num)) + return len(num) + } + if input/1000 > 0 { + num += "onethousand" + input = input % 1000 + } + hundred := input / 100 + if hundred != 0 { + num += numberToLetter[hundred] + "hundred" + } + input = input % 100 + one := input % 10 + ten := input / 10 + if one == 0 && hundred == 0 { + num += numberToLetter[input] + } else { + if hundred > 0 && (one > 0 || ten > 0) { + num += "and" + } + if ten == 1 { + num += numberToLetter[input] + } else { + num += numberToLetter[ten*10] + numberToLetter[one] + } + } + fmt.Println("input:", n, "num:", num, "len:", len(num)) + return len(num) +} diff --git a/17_number_letter_count/number_letter_count_test.go b/17_number_letter_count/number_letter_count_test.go new file mode 100644 index 0000000..d03628b --- /dev/null +++ b/17_number_letter_count/number_letter_count_test.go @@ -0,0 +1,93 @@ +package main + +import ( + "testing" +) + +func TestCountNumberLetter(t *testing.T) { + tt := []struct { + name string + input int + want int + }{ + { + "1", + 1, + 3, + }, + { + "15", + 15, + 7, + }, + { + "90", + 90, + 6, + }, + { + "100", + 100, + 10, + }, + { + "300", + 300, + 12, + }, + { + "23", + 23, + 11, + }, + { + "123", + 123, + 24, + }, + { + "120", + 120, + 19, + }, + { + "115", + 115, + 20, + }, + { + "320", + 320, + 21, + }, + { + "444", + 444, + 23, + }, + { + "499", + 499, + 24, + }, + { + "342", + 342, + 23, + }, + { + "110", + 110, + 16, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + got := CountNumberLetter(tc.input) + if got != tc.want { + t.Errorf("CountNumberLetter(%d)=%d, want %d", tc.input, got, tc.want) + } + }) + } +}