From 56e41d3752923eed5e9ab0f0179b787a27ea77ea Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 7 Apr 2015 21:51:32 +0200 Subject: Initial import --- main.go | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 main.go 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) +} -- cgit v1.2.3