summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2018-03-18 20:47:25 +0100
committerDimitri Sokolyuk <demon@dim13.org>2018-03-18 20:47:25 +0100
commit7405ae1ca49258e9fd777171062db56cc73647ae (patch)
tree821d56c3914a4b75d146f4dfec35fae7fd475b35
parentadf0350662e3f875c92a37c7ca054c6a3964d45b (diff)
add numerical representations
-rw-r--r--internal/num/roman.go18
-rw-r--r--internal/num/roman_test.go25
-rw-r--r--internal/num/signed.go12
-rw-r--r--internal/num/signed_test.go22
4 files changed, 77 insertions, 0 deletions
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)
+ }
+ })
+ }
+}