-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
61 lines (53 loc) · 1.68 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package main;
import(
"ballclock/src"
"fmt"
"strconv"
"os"
"time"
"math"
"github.com/docopt/docopt-go"
)
func float_div(n int64, d int64) float64 {
return float64(n) / float64(d)
}
func mode1_output(nball int64, halfdays int64, elapsed time.Duration) {
fmt.Printf("%v balls cycle after %v days.\n", nball, float_div(halfdays, 2))
fmt.Printf("Completed in %v millseconds (%s seconds)\n",
math.Round(float64(elapsed.Nanoseconds()) * float_div(int64(time.Nanosecond), int64(time.Millisecond))),
strconv.FormatFloat(elapsed.Seconds(), 'f', 6, 64))
}
func mode2_output(c *ballclock.Clock) {
fmt.Println(string(c.ToJson()))
}
func main() {
argv := os.Args[1:]
usage := `
Ball-Clock. Implements a Ball-Clock Simulation.
Usage:
ballclock <nball>
ballclock <nball> [--min=<minutes>]
ballclock -h | --help
ballclock --version
Options:
-h --help Show this screen.
--version Show version.
--min=<minutes> Minutes to run [default: 60 * 24 * 30 = 43200].`
arguments, _ := docopt.ParseArgs(usage, argv, "0.0.1")
i := arguments["<nball>"]
min := arguments["--min"]
nball, err_nball := strconv.ParseInt(i.(string), 0, 64)
minVal, errMin := strconv.ParseInt(min.(string), 0, 64)
if err_nball != nil || nball < int64(27) || nball > int64(127) {
fmt.Println("<nball> must be integer in interval [27,127]")
return
}
if errMin != nil {
start := time.Now()
c := ballclock.RunComplete(nball)
elapsed := time.Since(start)
mode1_output(nball, c.Halfdays(), elapsed)
} else {
mode2_output(ballclock.RunMinutes(nball, minVal))
}
}