aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-04-07 21:51:32 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-04-07 21:51:32 +0200
commit56e41d3752923eed5e9ab0f0179b787a27ea77ea (patch)
tree0d4d92bbb925d88a07710341a172f4c88f11a98a
Initial import
-rw-r--r--main.go130
1 files changed, 130 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..c53e2a3
--- /dev/null
+++ b/main.go
@@ -0,0 +1,130 @@
+package main
+
+import (
+ "fmt"
+ "log"
+)
+
+type testCase struct {
+ First, Second, Expect string
+}
+
+var (
+ alphabet = []string{
+ "zero",
+ "one",
+ "two",
+ "tree",
+ "four",
+ "five",
+ "six",
+ "seven",
+ "eight",
+ "nine",
+ "ten",
+ "eleven",
+ "twelve",
+ "thirteen",
+ "fourteen",
+ "fifteen",
+ "sixteen",
+ "seventeen",
+ "eighteen",
+ "nineteen",
+ "twenty",
+ }
+ zero = alphabet[0]
+ one = alphabet[1]
+ casesAdd = []testCase{
+ testCase{"two", "two", "four"},
+ testCase{"two", "five", "seven"},
+ testCase{"two", "zero", "two"},
+ }
+ casesTimes = []testCase{
+ testCase{"two", "two", "four"},
+ testCase{"two", "tree", "six"},
+ }
+ casesPot = []testCase{
+ testCase{"one", "two", "one"},
+ testCase{"two", "two", "four"},
+ testCase{"two", "tree", "eight"},
+ }
+ casesSub = []testCase{
+ testCase{"seven", "five", "two"},
+ testCase{"two", "zero", "two"},
+ testCase{"four", "two", "two"},
+ }
+)
+
+// next returns next char in alphabet
+func next(n string) string {
+ for i, v := range alphabet {
+ if i == len(alphabet)-1 {
+ log.Fatal("out of range")
+ }
+ if v == n {
+ return alphabet[i+1]
+ }
+ }
+ return zero
+}
+
+// prev returns previous char in alphabet
+func prev(n string) string {
+ if n == zero {
+ return zero
+ }
+ for i, v := range alphabet {
+ if v == n {
+ return alphabet[i-1]
+ }
+ }
+ return zero
+}
+
+// add defines addition
+func add(m, n string) string {
+ if m == zero {
+ return n
+ }
+ return next(add(prev(m), n))
+}
+
+// times defines mutiplication
+func times(m, n string) string {
+ if m == zero {
+ return zero
+ }
+ return add(times(prev(m), n), n)
+}
+
+// pot defines power function
+func pot(m, n string) string {
+ if n == zero {
+ return one
+ }
+ return times(pot(m, prev(n)), m)
+}
+
+// sub defines substraction
+func sub(m, n string) string {
+ if n == zero {
+ return m
+ }
+ return prev(sub(m, prev(n)))
+}
+
+// test permoms tests
+func test(f func(string, string) string, op string, cases []testCase) {
+ for _, c := range cases {
+ r := f(c.First, c.Second)
+ fmt.Println(r == c.Expect, c.First, op, c.Second, "=", r)
+ }
+}
+
+func main() {
+ test(add, "+", casesAdd)
+ test(times, "*", casesTimes)
+ test(pot, "^", casesPot)
+ test(sub, "-", casesSub)
+}