From 7405ae1ca49258e9fd777171062db56cc73647ae Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 18 Mar 2018 20:47:25 +0100 Subject: add numerical representations --- internal/num/roman.go | 18 ++++++++++++++++++ internal/num/roman_test.go | 25 +++++++++++++++++++++++++ internal/num/signed.go | 12 ++++++++++++ internal/num/signed_test.go | 22 ++++++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 internal/num/roman.go create mode 100644 internal/num/roman_test.go create mode 100644 internal/num/signed.go create mode 100644 internal/num/signed_test.go diff --git a/internal/num/roman.go b/internal/num/roman.go new file mode 100644 index 0000000..16bfe16 --- /dev/null +++ b/internal/num/roman.go @@ -0,0 +1,18 @@ +package num + +var ( + m0 = []string{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"} + m1 = []string{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"} + m2 = []string{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"} + m3 = []string{"", "M", "MM", "MMM"} +) + +// Roman numeral in interval 0 < x < 4000 +type Roman int + +func (n Roman) String() string { + if n <= 0 || n >= 4000 { + return "" + } + return m3[n/1000] + m2[n%1000/100] + m1[n%100/10] + m0[n%10] +} diff --git a/internal/num/roman_test.go b/internal/num/roman_test.go new file mode 100644 index 0000000..cdb8f6d --- /dev/null +++ b/internal/num/roman_test.go @@ -0,0 +1,25 @@ +package num + +import "testing" + +func TestRoman(t *testing.T) { + testCases := []struct { + r Roman + s string + }{ + {0, ""}, + {1990, "MCMXC"}, + {2008, "MMVIII"}, + {1666, "MDCLXVI"}, + {1e3 - 1, "CMXCIX"}, + {2e3 - 1, "MCMXCIX"}, + {4e3 - 1, "MMMCMXCIX"}, + } + for _, tc := range testCases { + t.Run(tc.s, func(t *testing.T) { + if tc.r.String() != tc.s { + t.Errorf("got %v, want %v", tc.r, tc.s) + } + }) + } +} diff --git a/internal/num/signed.go b/internal/num/signed.go new file mode 100644 index 0000000..d0c88f0 --- /dev/null +++ b/internal/num/signed.go @@ -0,0 +1,12 @@ +package num + +import "fmt" + +type Signed int + +func (s Signed) String() string { + if s == 0 { + return "" + } + return fmt.Sprintf("%+d", int(s)) +} diff --git a/internal/num/signed_test.go b/internal/num/signed_test.go new file mode 100644 index 0000000..19a82db --- /dev/null +++ b/internal/num/signed_test.go @@ -0,0 +1,22 @@ +package num + +import "testing" + +func TestSigned(t *testing.T) { + testCases := []struct { + i Signed + s string + }{ + {0, ""}, + {1, "+1"}, + {-1, "-1"}, + } + + for _, tc := range testCases { + t.Run(tc.s, func(t *testing.T) { + if tc.i.String() != tc.s { + t.Errorf("got %v, want %v", tc.i, tc.s) + } + }) + } +} -- cgit v1.2.3