From 9bd34c97d05499a9dc5922481470de04efa147aa Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 8 Apr 2015 00:34:47 +0200 Subject: Split files --- main.go | 121 +++----------------------------------------------------------- ops.go | 82 ++++++++++++++++++++++++++++++++++++++++++ verify.go | 47 ++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 117 deletions(-) create mode 100644 ops.go create mode 100644 verify.go diff --git a/main.go b/main.go index f62cfb2..62e50db 100644 --- a/main.go +++ b/main.go @@ -1,123 +1,10 @@ package main -import ( - "container/list" - "fmt" - "log" - "math/rand" - "time" -) - -var ( - alphabet *list.List - zero, one *list.Element -) - -// next returns next char in alphabet -func next(n *list.Element) *list.Element { - if nxt := n.Next(); nxt != nil { - return nxt - } - log.Fatal("out of range", n.Value) - return nil -} - -// prev returns previous char in alphabet -func prev(n *list.Element) *list.Element { - if prv := n.Prev(); prv != nil { - return prv - } - return zero -} - -// add defines addition -func add(m, n *list.Element) *list.Element { - if m == zero { - return n - } - return next(add(prev(m), n)) -} - -// times defines mutiplication -func times(m, n *list.Element) *list.Element { - if m == zero { - return zero - } - return add(times(prev(m), n), n) -} - -// pot defines power function -func pot(m, n *list.Element) *list.Element { - if n == zero { - return one - } - return times(pot(m, prev(n)), m) -} - -// sub defines substraction -func sub(m, n *list.Element) *list.Element { - if n == zero { - return m - } - return prev(sub(m, prev(n))) -} - -type function func(*list.Element, *list.Element) *list.Element - -// test perfoms tests -func test(op string, f function) { - var mm, nn int - switch op { - case "+": - mm = rand.Intn(100) - nn = rand.Intn(100) - case "-": - mm = rand.Intn(100) - nn = rand.Intn(100) - if nn > mm { - mm, nn = nn, mm - } - case "*": - mm = rand.Intn(10) - nn = rand.Intn(10) - case "^": - mm = rand.Intn(10) - nn = rand.Intn(3) - } - m := scan(mm) - n := scan(nn) - r := f(m, n) - fmt.Println(m.Value, op, n.Value, "=", r.Value) -} - -// scan lookups element representation -func scan(n int) *list.Element { - if n > alphabet.Len() { - log.Fatal("out of range") - return nil - } - e := alphabet.Front() - for i := 0; i < n; i++ { - e = e.Next() - } - return e -} - -func init() { - alphabet = list.New() - for i := 0; i <= 1000; i++ { - alphabet.PushBack(fmt.Sprint(i)) - } - zero = alphabet.Front() - one = zero.Next() - rand.Seed(time.Now().Unix()) -} - func main() { for i := 0; i < 3; i++ { - test("+", add) - test("-", sub) - test("*", times) - test("^", pot) + verify("+", add) + verify("-", sub) + verify("*", times) + verify("^", pot) } } diff --git a/ops.go b/ops.go new file mode 100644 index 0000000..5fd61cc --- /dev/null +++ b/ops.go @@ -0,0 +1,82 @@ +package main + +import ( + "container/list" + "log" +) + +var ( + alphabet *list.List + zero, one *list.Element +) + +func init() { + alphabet = list.New() + for i := 0; i <= 1000; i++ { + alphabet.PushBack(i) + } + zero = alphabet.Front() + one = zero.Next() +} + +// next returns next char in alphabet +func next(n *list.Element) *list.Element { + if nxt := n.Next(); nxt != nil { + return nxt + } + log.Fatal("out of range", n.Value) + return nil +} + +// prev returns previous char in alphabet +func prev(n *list.Element) *list.Element { + if prv := n.Prev(); prv != nil { + return prv + } + return zero +} + +// add defines addition +func add(m, n *list.Element) *list.Element { + if m == zero { + return n + } + return next(add(prev(m), n)) +} + +// times defines mutiplication +func times(m, n *list.Element) *list.Element { + if m == zero { + return zero + } + return add(times(prev(m), n), n) +} + +// pot defines power function +func pot(m, n *list.Element) *list.Element { + if n == zero { + return one + } + return times(pot(m, prev(n)), m) +} + +// sub defines substraction +func sub(m, n *list.Element) *list.Element { + if n == zero { + return m + } + return prev(sub(m, prev(n))) +} + +// scan lookups element representation +func scan(n int) *list.Element { + if n > alphabet.Len() { + log.Fatal("out of range") + return nil + } + e := alphabet.Front() + for i := 0; i < n; i++ { + e = e.Next() + } + return e +} diff --git a/verify.go b/verify.go new file mode 100644 index 0000000..8d09b1e --- /dev/null +++ b/verify.go @@ -0,0 +1,47 @@ +package main + +import ( + "container/list" + "fmt" + "math" + "math/rand" + "time" +) + +type function func(*list.Element, *list.Element) *list.Element + +func init() { + rand.Seed(time.Now().Unix()) +} + +// verify perfoms tests +func verify(op string, f function) { + var mm, nn, rr int + switch op { + case "+": + mm = rand.Intn(100) + nn = rand.Intn(100) + rr = mm + nn + case "-": + mm = rand.Intn(100) + nn = rand.Intn(100) + if nn > mm { + mm, nn = nn, mm + } + rr = mm - nn + case "*": + mm = rand.Intn(10) + nn = rand.Intn(10) + rr = mm * nn + case "^": + mm = rand.Intn(10) + nn = rand.Intn(3) + rr = int(math.Pow(float64(mm), float64(nn))) + } + m := scan(mm) + n := scan(nn) + r := f(m, n) + expected := scan(rr) + fmt.Println(m.Value, op, n.Value, "=", r.Value, + r.Value == expected.Value) +} -- cgit v1.2.3