aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-04-08 00:34:47 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-04-08 00:34:47 +0200
commit9bd34c97d05499a9dc5922481470de04efa147aa (patch)
tree0fc272a07ff983655b716094b539190a6686d3b2
parent37bebb461450fa8eb8ace1015c9eccdb7a4f7844 (diff)
Split files
-rw-r--r--main.go121
-rw-r--r--ops.go82
-rw-r--r--verify.go47
3 files changed, 133 insertions, 117 deletions
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)
+}