Initial commit
This commit is contained in:
commit
a9420a1a07
11
collatz.go
Normal file
11
collatz.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"collatz/collatz"
|
||||||
|
"collatz/io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
calculator := collatz.NewCalculator(new(io.Cliargs))
|
||||||
|
calculator.Collatz()
|
||||||
|
}
|
54
collatz/calculator.go
Normal file
54
collatz/calculator.go
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package collatz
|
||||||
|
|
||||||
|
import (
|
||||||
|
"collatz/io"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"math/big"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Calculator struct {
|
||||||
|
parser *io.Cliargs
|
||||||
|
three *big.Int
|
||||||
|
two *big.Int
|
||||||
|
one *big.Int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCalculator(parser *io.Cliargs) Calculator {
|
||||||
|
r := Calculator{
|
||||||
|
parser: parser,
|
||||||
|
three: new(big.Int).SetInt64(3),
|
||||||
|
two: new(big.Int).SetInt64(2),
|
||||||
|
one: new(big.Int).SetInt64(1),
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o Calculator) Collatz() {
|
||||||
|
err := o.parser.Parse()
|
||||||
|
if err != nil {
|
||||||
|
log.Panicf("Couldn't parse input: %s\n", err)
|
||||||
|
}
|
||||||
|
number := o.parser.GetNumber()
|
||||||
|
fmt.Print(number.Text(10))
|
||||||
|
o.nextNumber(number)
|
||||||
|
fmt.Println()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o Calculator) nextNumber(in *big.Int) {
|
||||||
|
if in.Cmp(o.one) < 0 {
|
||||||
|
log.Panicln("Must be greater than 0")
|
||||||
|
}
|
||||||
|
if in.Cmp(o.one) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var newNumber *big.Int
|
||||||
|
if new(big.Int).And(in, o.one).Cmp(o.one) == 0 {
|
||||||
|
newNumber = new(big.Int).Add(new(big.Int).Mul(in, o.three), o.one)
|
||||||
|
} else {
|
||||||
|
newNumber = new(big.Int).Div(in, o.two)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf(" -> %s", newNumber.Text(10))
|
||||||
|
o.nextNumber(newNumber)
|
||||||
|
}
|
28
io/cliargs.go
Normal file
28
io/cliargs.go
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package io
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"math/big"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Cliargs struct {
|
||||||
|
value *big.Int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (arg *Cliargs) Parse() error {
|
||||||
|
args := os.Args[1:]
|
||||||
|
if len(args) != 1 {
|
||||||
|
return errors.New("only expected 1 arg")
|
||||||
|
}
|
||||||
|
num, success := new(big.Int).SetString(args[0], 10)
|
||||||
|
if !success {
|
||||||
|
return errors.New("argument is not an integer")
|
||||||
|
}
|
||||||
|
arg.value = num
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (arg *Cliargs) GetNumber() *big.Int {
|
||||||
|
return arg.value
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user