aboutsummaryrefslogtreecommitdiff
path: root/main.go
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 /main.go
parent37bebb461450fa8eb8ace1015c9eccdb7a4f7844 (diff)
Split files
Diffstat (limited to 'main.go')
-rw-r--r--main.go121
1 files changed, 4 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)
}
}