Removing stuff I extracted into github.com/meatballhat/algs4
This commit is contained in:
parent
4505d31471
commit
e427f23c90
@ -1,31 +0,0 @@
|
||||
REPO_BASE := github.com/meatballhat/box-o-sand/algs4/src/go
|
||||
TARGETS := \
|
||||
$(REPO_BASE)/algs4 \
|
||||
$(REPO_BASE)/algs4/algs4-binarysearch \
|
||||
$(REPO_BASE)/algs4/algs4-flips \
|
||||
$(REPO_BASE)/algs4/algs4-gcd \
|
||||
$(REPO_BASE)/algs4/algs4-rolls \
|
||||
$(REPO_BASE)/algs4/algs4-randomseq \
|
||||
$(REPO_BASE)/algs4/algs4-average \
|
||||
$(REPO_BASE)/algs4/algs4-interval2d \
|
||||
$(REPO_BASE)/algs4/algs4-date \
|
||||
$(REPO_BASE)/algs4/algs4-test-accumulator \
|
||||
$(REPO_BASE)/algs4/algs4-stats
|
||||
|
||||
|
||||
test: build
|
||||
go test -x $(TARGETS)
|
||||
|
||||
build: deps
|
||||
go install -x $(TARGETS)
|
||||
|
||||
fmt:
|
||||
go fmt -x $(TARGETS)
|
||||
|
||||
deps:
|
||||
go get -x -n $(TARGETS)
|
||||
|
||||
clean:
|
||||
go clean -x -x $(TARGETS)
|
||||
|
||||
.PHONY: test build deps clean fmt
|
@ -1,28 +0,0 @@
|
||||
package algs4
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Accumulator struct {
|
||||
total float64
|
||||
n int
|
||||
}
|
||||
|
||||
func NewAccumulator() *Accumulator {
|
||||
return &Accumulator{
|
||||
float64(0.0),
|
||||
0,
|
||||
}
|
||||
}
|
||||
|
||||
func (me *Accumulator) AddDataValue(val float64) {
|
||||
me.n++
|
||||
me.total += val
|
||||
}
|
||||
|
||||
func (me *Accumulator) Mean() float64 {
|
||||
return me.total / float64(me.n)
|
||||
}
|
||||
|
||||
func (me *Accumulator) String() string {
|
||||
return fmt.Sprintf("Mean (%d values): %7.5f", me.n, me.Mean())
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
func die(err error) {
|
||||
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func main() {
|
||||
sum := 0.0
|
||||
cnt := 0
|
||||
|
||||
for {
|
||||
d, err := algs4.Stdin.ReadDouble()
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
sum += d
|
||||
cnt++
|
||||
}
|
||||
|
||||
fmt.Printf("Average is %.5f\n", sum/float64(cnt))
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"sort"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
const USAGE string = `Usage: algs4-binarysearch <whitelist-file>
|
||||
|
||||
You must also provide input on stdin.`
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println(USAGE)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
whiteListFile, err := os.Open(string(os.Args[1]))
|
||||
if err != nil {
|
||||
fmt.Println("Failed to open whitelist file:", err)
|
||||
}
|
||||
|
||||
whiteList, err := algs4.ReadInts(bufio.NewReader(whiteListFile))
|
||||
if err != nil {
|
||||
fmt.Println("UGH: ", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
sort.Ints(whiteList)
|
||||
|
||||
inputs, err := algs4.ReadInts(bufio.NewReader(os.Stdin))
|
||||
if err != nil {
|
||||
fmt.Println("Failed to read inputs:", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
for _, key := range inputs {
|
||||
if algs4.BinarySearchRank(key, whiteList) == -1 {
|
||||
fmt.Println(key)
|
||||
}
|
||||
}
|
||||
}
|
@ -1,39 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
func die(err error) {
|
||||
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 4 {
|
||||
die(errors.New("We need 3 ints!"))
|
||||
}
|
||||
|
||||
m, err := strconv.Atoi(os.Args[1])
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
d, err := strconv.Atoi(os.Args[2])
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
y, err := strconv.Atoi(os.Args[3])
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
date := algs4.NewDate(m, d, y)
|
||||
fmt.Println(date)
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"math/rand"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
const USAGE string = "Usage: algs4-flips <nflips>"
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println(USAGE)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
rand.Seed(time.Now().UTC().UnixNano())
|
||||
|
||||
nflips, err := strconv.Atoi(os.Args[1])
|
||||
if err != nil {
|
||||
fmt.Println("Wat.", err)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
heads := algs4.NewCounter("heads")
|
||||
tails := algs4.NewCounter("tails")
|
||||
|
||||
for t := 0; t < nflips; t++ {
|
||||
if rand.Float64() > 0.5 {
|
||||
heads.Increment()
|
||||
} else {
|
||||
tails.Increment()
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println(heads)
|
||||
fmt.Println(tails)
|
||||
|
||||
d := heads.Tally() - tails.Tally()
|
||||
|
||||
fmt.Printf("delta: %d\n", int(math.Abs(float64(d))))
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
const USAGE string = `Usage: algs4-gcd <uint> <uint>`
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 3 {
|
||||
fmt.Println(USAGE)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
p, err := strconv.ParseUint(os.Args[1], 10, 0)
|
||||
if err != nil {
|
||||
fmt.Println("Wherps: ", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
q, err := strconv.ParseUint(os.Args[2], 10, 0)
|
||||
if err != nil {
|
||||
fmt.Println("Wherps: ", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Println(algs4.Gcd(p, q))
|
||||
}
|
@ -1,77 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
func die(err error) {
|
||||
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 6 {
|
||||
die(errors.New("We need 4 floats and an int!"))
|
||||
}
|
||||
|
||||
rand.Seed(time.Now().UTC().UnixNano())
|
||||
|
||||
xlo, err := strconv.ParseFloat(os.Args[1], 32)
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
xhi, err := strconv.ParseFloat(os.Args[2], 32)
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
ylo, err := strconv.ParseFloat(os.Args[3], 32)
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
yhi, err := strconv.ParseFloat(os.Args[4], 32)
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
npoints, err := strconv.Atoi(os.Args[5])
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
xint := algs4.NewInterval1D(xlo, xhi)
|
||||
yint := algs4.NewInterval1D(ylo, yhi)
|
||||
box := algs4.NewInterval2D(xint, yint, nil)
|
||||
box.Draw()
|
||||
|
||||
c := algs4.NewCounter("hits")
|
||||
for t := 0; t < npoints; t++ {
|
||||
x := rand.Float64()
|
||||
y := rand.Float64()
|
||||
p := algs4.NewPoint2D(x, y, nil)
|
||||
if box.Contains(p) {
|
||||
c.Increment()
|
||||
} else {
|
||||
p.Draw()
|
||||
}
|
||||
}
|
||||
|
||||
err = algs4.Draw()
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
fmt.Println(c)
|
||||
fmt.Printf("area = %.2f\n", box.Area())
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
func die(err error) {
|
||||
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 4 {
|
||||
die(errors.New("We need an int and two floats!"))
|
||||
}
|
||||
n, err := strconv.Atoi(os.Args[1])
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
lo, err := strconv.ParseFloat(os.Args[2], 32)
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
hi, err := strconv.ParseFloat(os.Args[3], 32)
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
x := algs4.RandomUniform(lo, hi)
|
||||
fmt.Printf("%.2f\n", x)
|
||||
}
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
const (
|
||||
USAGE = "Usage: algs4-rolls <nrolls>"
|
||||
SIDES = 6
|
||||
)
|
||||
|
||||
func die(err error) {
|
||||
fmt.Println("Wat.", err)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println(USAGE)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
nrolls, err := strconv.Atoi(os.Args[1])
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
for _, roll := range algs4.Rolls(nrolls) {
|
||||
fmt.Println(roll)
|
||||
}
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
func die(err error) {
|
||||
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func main() {
|
||||
numbers := algs4.NewBag()
|
||||
|
||||
for !algs4.Stdin.IsEmpty() {
|
||||
d, err := algs4.Stdin.ReadDouble()
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
numbers.Add(d)
|
||||
}
|
||||
|
||||
n := numbers.Size()
|
||||
sum := float64(0.0)
|
||||
|
||||
for x := range numbers.Each() {
|
||||
if val, ok := x.(float64); ok {
|
||||
sum += val
|
||||
} else {
|
||||
fmt.Fprintf(os.Stderr, "%v is not a float64!", x)
|
||||
}
|
||||
}
|
||||
|
||||
mean := sum / float64(n)
|
||||
|
||||
sum = float64(0.0)
|
||||
for x := range numbers.Each() {
|
||||
if val, ok := x.(float64); ok {
|
||||
sum += (val - mean) * (val - mean)
|
||||
} else {
|
||||
fmt.Fprintf(os.Stderr, "%v is not a float64!", x)
|
||||
}
|
||||
}
|
||||
|
||||
std := math.Sqrt(sum / (float64(n) - float64(1)))
|
||||
|
||||
fmt.Printf("Mean: %.2f\n", mean)
|
||||
fmt.Printf("Std dev: %.2f\n", std)
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
func die(err error) {
|
||||
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
die(errors.New("We need an int!"))
|
||||
}
|
||||
|
||||
nValues, err := strconv.Atoi(os.Args[1])
|
||||
if err != nil {
|
||||
die(err)
|
||||
}
|
||||
|
||||
a := algs4.NewAccumulator()
|
||||
for t := 0; t < nValues; t++ {
|
||||
a.AddDataValue(algs4.Random())
|
||||
}
|
||||
|
||||
fmt.Println(a)
|
||||
return
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
package algs4
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
type Bag struct {
|
||||
items map[string]interface{}
|
||||
}
|
||||
|
||||
type Item struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
func NewBag() *Bag {
|
||||
return &Bag{
|
||||
items: map[string]interface{}{},
|
||||
}
|
||||
}
|
||||
|
||||
func (me *Bag) Add(item interface{}) {
|
||||
me.items[me.hashItem(item)] = item
|
||||
}
|
||||
|
||||
func (me *Bag) IsEmpty() bool {
|
||||
return len(me.items) == 0
|
||||
}
|
||||
|
||||
func (me *Bag) Size() int {
|
||||
return len(me.items)
|
||||
}
|
||||
|
||||
func (me *Bag) Each() <-chan interface{} {
|
||||
out := make(chan interface{})
|
||||
|
||||
go func() {
|
||||
defer close(out)
|
||||
for _, item := range me.items {
|
||||
out <- item
|
||||
}
|
||||
}()
|
||||
|
||||
return (<-chan interface{})(out)
|
||||
}
|
||||
|
||||
func (me *Bag) hashItem(item interface{}) string {
|
||||
t := reflect.TypeOf(item)
|
||||
return fmt.Sprintf("%s%s%v", t.Name(), t.String(), &t)
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
package algs4
|
||||
|
||||
func BinarySearchRank(key int, a []int) int {
|
||||
lo := 0
|
||||
hi := len(a) - 1
|
||||
|
||||
var mid int
|
||||
|
||||
for lo <= hi {
|
||||
mid = lo + (hi-lo)/2
|
||||
if key < a[mid] {
|
||||
hi = mid - 1
|
||||
} else if key > a[mid] {
|
||||
lo = mid + 1
|
||||
} else {
|
||||
return mid
|
||||
}
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
package algs4_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
func TestBinarySearchRank(t *testing.T) {
|
||||
arr := [...]int{0, 2, 9, 14, 23}
|
||||
|
||||
if algs4.BinarySearchRank(9, arr[:]) != 2 {
|
||||
t.Error("Failed to find 9 in", arr)
|
||||
}
|
||||
|
||||
if algs4.BinarySearchRank(0, arr[:]) != 0 {
|
||||
t.Error("Failed to find 0 in", arr)
|
||||
}
|
||||
}
|
@ -1,159 +0,0 @@
|
||||
package algs4
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"image"
|
||||
"image/draw"
|
||||
"math"
|
||||
"os"
|
||||
|
||||
"code.google.com/p/x-go-binding/ui"
|
||||
"code.google.com/p/x-go-binding/ui/x11"
|
||||
)
|
||||
|
||||
var (
|
||||
DefaultCanvas, DefaultCanvasError = NewCanvas(512, 512,
|
||||
float64(0.0), float64(1.0), float64(0.0), float64(1.0))
|
||||
|
||||
halfWidthNegativeError = errors.New("half width can't be negative")
|
||||
halfHeightNegativeError = errors.New("half height can't be negative")
|
||||
)
|
||||
|
||||
func init() {
|
||||
if DefaultCanvasError != nil {
|
||||
fmt.Fprintf(os.Stderr,
|
||||
"Failed to initialize DefaultCanvas: %v\n", DefaultCanvasError)
|
||||
panic(DefaultCanvasError)
|
||||
}
|
||||
}
|
||||
|
||||
type Canvas struct {
|
||||
Height int
|
||||
Width int
|
||||
Xmin float64
|
||||
Xmax float64
|
||||
Ymin float64
|
||||
Ymax float64
|
||||
|
||||
img *image.RGBA
|
||||
window ui.Window
|
||||
}
|
||||
|
||||
func NewCanvas(height, width int, xmin, xmax, ymin, ymax float64) (*Canvas, error) {
|
||||
canvas := &Canvas{
|
||||
Height: height,
|
||||
Width: width,
|
||||
Xmin: xmin,
|
||||
Xmax: xmax,
|
||||
Ymin: ymin,
|
||||
Ymax: ymax,
|
||||
|
||||
img: image.NewRGBA(image.Rect(0, 0, height, width)),
|
||||
window: nil,
|
||||
}
|
||||
|
||||
return canvas, nil
|
||||
}
|
||||
|
||||
func (me *Canvas) ensureHasWindow() error {
|
||||
if me.window != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
window, err := x11.NewWindow()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
me.window = window
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *Canvas) Image() *image.RGBA {
|
||||
return me.img
|
||||
}
|
||||
|
||||
func (me *Canvas) Bounds() image.Rectangle {
|
||||
return me.img.Bounds()
|
||||
}
|
||||
|
||||
func (me *Canvas) Rectangle(x, y, halfWidth, halfHeight float64) error {
|
||||
if halfWidth < 0 {
|
||||
return halfWidthNegativeError
|
||||
}
|
||||
|
||||
if halfHeight < 0 {
|
||||
return halfHeightNegativeError
|
||||
}
|
||||
|
||||
f2 := float64(2.0)
|
||||
|
||||
xs := me.scaleX(x)
|
||||
ys := me.scaleY(y)
|
||||
ws := me.factorX(f2 * halfWidth)
|
||||
hs := me.factorY(f2 * halfHeight)
|
||||
|
||||
if ws <= 1 && hs <= 1 {
|
||||
me.Pixel(x, y)
|
||||
return nil
|
||||
}
|
||||
|
||||
originX, originY := int(xs-ws/f2), int(ys-hs/f2)
|
||||
draw.Draw(me.img,
|
||||
image.Rect(originX, originY, originX+int(ws), originY+int(hs)),
|
||||
&image.Uniform{image.White}, image.ZP, draw.Src)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *Canvas) Pixel(x, y float64) error {
|
||||
err := me.ensureHasWindow()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
originX, originY := int(me.scaleX(x)), int(me.scaleY(y))
|
||||
draw.Draw(me.img, image.Rect(originX, originY, originX+1, originY+1),
|
||||
&image.Uniform{image.White}, image.ZP, draw.Src)
|
||||
me.window.FlushImage()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *Canvas) Draw() error {
|
||||
err := me.ensureHasWindow()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
draw.Draw(me.window.Screen(), me.window.Screen().Bounds(), me.img, image.ZP, draw.Src)
|
||||
me.window.FlushImage()
|
||||
|
||||
for evt := range me.window.EventChan() {
|
||||
switch evt := evt.(type) {
|
||||
case ui.KeyEvent:
|
||||
if evt.Key == 'q' {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *Canvas) scaleX(x float64) float64 {
|
||||
return float64(me.Width) * (x - me.Xmin) / (me.Xmax - me.Xmin)
|
||||
}
|
||||
|
||||
func (me *Canvas) scaleY(y float64) float64 {
|
||||
return float64(me.Height) * (me.Ymax - y) / (me.Ymax - me.Ymin)
|
||||
}
|
||||
|
||||
func (me *Canvas) factorX(w float64) float64 {
|
||||
return w * float64(me.Width) / math.Abs(me.Xmax-me.Xmin)
|
||||
}
|
||||
|
||||
func (me *Canvas) factorY(h float64) float64 {
|
||||
return h * float64(me.Height) / math.Abs(me.Ymax-me.Ymin)
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
package algs4
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type Counter struct {
|
||||
name string
|
||||
count int
|
||||
}
|
||||
|
||||
func NewCounter(name string) *Counter {
|
||||
counter := &Counter{}
|
||||
counter.name = name
|
||||
return counter
|
||||
}
|
||||
|
||||
func (c *Counter) Increment() {
|
||||
c.count += 1
|
||||
}
|
||||
|
||||
func (c *Counter) Tally() int {
|
||||
return c.count
|
||||
}
|
||||
|
||||
func (c *Counter) String() string {
|
||||
return fmt.Sprintf("%d %s", c.count, c.name)
|
||||
}
|
||||
|
||||
func (c *Counter) Cmp(other *Counter) int {
|
||||
if c.count < other.count {
|
||||
return -1
|
||||
} else if c.count > other.count {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
package algs4
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type Date struct {
|
||||
Month int
|
||||
Day int
|
||||
Year int
|
||||
}
|
||||
|
||||
func NewDate(m, d, y int) *Date {
|
||||
return &Date{
|
||||
Month: m,
|
||||
Day: d,
|
||||
Year: y,
|
||||
}
|
||||
}
|
||||
|
||||
func (me *Date) String() string {
|
||||
return fmt.Sprintf("%d/%d/%d", me.Month, me.Day, me.Year)
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
package algs4
|
||||
|
||||
func Draw() error {
|
||||
return DefaultCanvas.Draw()
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package algs4
|
||||
|
||||
func Gcd(p, q uint64) uint64 {
|
||||
if q == 0 {
|
||||
return p
|
||||
}
|
||||
r := p % q
|
||||
return Gcd(q, r)
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
package algs4_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
func TestGcd(t *testing.T) {
|
||||
d := algs4.Gcd(uint64(81), uint64(72))
|
||||
if d != 9 {
|
||||
t.Error("WRONG")
|
||||
}
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
package algs4
|
||||
|
||||
type Interval1D struct {
|
||||
Left float64
|
||||
Right float64
|
||||
}
|
||||
|
||||
func NewInterval1D(left, right float64) *Interval1D {
|
||||
return &Interval1D{
|
||||
Left: left,
|
||||
Right: right,
|
||||
}
|
||||
}
|
||||
|
||||
func (me *Interval1D) Contains(x float64) bool {
|
||||
return me.Left <= x && x <= me.Right
|
||||
}
|
||||
|
||||
func (me *Interval1D) Length() float64 {
|
||||
return me.Right - me.Left
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
package algs4
|
||||
|
||||
type Interval2D struct {
|
||||
Xint *Interval1D
|
||||
Yint *Interval1D
|
||||
Canvas *Canvas
|
||||
}
|
||||
|
||||
func NewInterval2D(xint, yint *Interval1D, canvas *Canvas) *Interval2D {
|
||||
if canvas == nil {
|
||||
canvas = DefaultCanvas
|
||||
}
|
||||
|
||||
return &Interval2D{
|
||||
Xint: xint,
|
||||
Yint: yint,
|
||||
Canvas: canvas,
|
||||
}
|
||||
}
|
||||
|
||||
func (me *Interval2D) Contains(p *Point2D) bool {
|
||||
return me.Xint.Contains(p.X) && me.Yint.Contains(p.Y)
|
||||
}
|
||||
|
||||
func (me *Interval2D) Draw() {
|
||||
xc := (me.Xint.Left + me.Xint.Right) / 2.0
|
||||
yc := (me.Yint.Left + me.Yint.Right) / 2.0
|
||||
me.Canvas.Rectangle(xc, yc, me.Xint.Length()/2.0, me.Yint.Length()/2.0)
|
||||
}
|
||||
|
||||
func (me *Interval2D) Area() float64 {
|
||||
return me.Xint.Length() * me.Yint.Length()
|
||||
}
|
@ -1,76 +0,0 @@
|
||||
package algs4
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"io"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type inputWrapper struct {
|
||||
Inbuf *bufio.Reader
|
||||
}
|
||||
|
||||
var (
|
||||
Stdin = &inputWrapper{}
|
||||
)
|
||||
|
||||
func init() {
|
||||
Stdin.Inbuf = bufio.NewReader(os.Stdin)
|
||||
}
|
||||
|
||||
func (in *inputWrapper) ReadDouble() (float64, error) {
|
||||
line, err := in.Inbuf.ReadString('\n')
|
||||
|
||||
if err != nil {
|
||||
return float64(0), err
|
||||
}
|
||||
|
||||
dbl, err := strconv.ParseFloat(strings.TrimSpace(line), 64)
|
||||
if err != nil {
|
||||
return float64(0), err
|
||||
}
|
||||
|
||||
return dbl, nil
|
||||
}
|
||||
|
||||
func (in *inputWrapper) IsEmpty() bool {
|
||||
_, err := in.Inbuf.Peek(1)
|
||||
if err != nil {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func ReadInts(inbuf io.Reader) ([]int, error) {
|
||||
ints := make([]int, 0)
|
||||
|
||||
var i64 int64
|
||||
|
||||
fileReader := bufio.NewReader(inbuf)
|
||||
line, err := fileReader.ReadString('\n')
|
||||
|
||||
for err == nil {
|
||||
line = strings.TrimSpace(line)
|
||||
|
||||
if len(line) > 0 {
|
||||
i64, err = strconv.ParseInt(line, 10, 32)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ints = append(ints, int(i64))
|
||||
}
|
||||
|
||||
line, err = fileReader.ReadString('\n')
|
||||
}
|
||||
|
||||
if err != nil && err != io.EOF {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ints, nil
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
package algs4_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||
)
|
||||
|
||||
const INTS_STRING = `
|
||||
999
|
||||
848
|
||||
-7271
|
||||
7384
|
||||
71878
|
||||
92
|
||||
0
|
||||
0
|
||||
0
|
||||
-99
|
||||
`
|
||||
|
||||
func TestReadInts(t *testing.T) {
|
||||
ints, err := algs4.ReadInts(strings.NewReader(INTS_STRING))
|
||||
|
||||
if err != nil {
|
||||
t.Error("Wrong wrong wrong: ", err)
|
||||
}
|
||||
|
||||
if ints == nil {
|
||||
t.Error("Nothing in the ints!: ", ints)
|
||||
}
|
||||
|
||||
fmt.Println("ints =", ints)
|
||||
|
||||
if ints[0] != 999 {
|
||||
t.Error("fail on 0: 999 !=", ints[0])
|
||||
}
|
||||
|
||||
if ints[4] != 71878 {
|
||||
t.Error("fail on 4: 71878 !=", ints[4])
|
||||
}
|
||||
|
||||
if ints[6] != 0 {
|
||||
t.Error("fail on 6: 0 !=", ints[6])
|
||||
}
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
package algs4
|
||||
|
||||
type Point2D struct {
|
||||
X float64
|
||||
Y float64
|
||||
|
||||
canvas *Canvas
|
||||
}
|
||||
|
||||
func NewPoint2D(x, y float64, canvas *Canvas) *Point2D {
|
||||
if canvas == nil {
|
||||
canvas = DefaultCanvas
|
||||
}
|
||||
|
||||
return &Point2D{
|
||||
X: x,
|
||||
Y: y,
|
||||
|
||||
canvas: canvas,
|
||||
}
|
||||
}
|
||||
|
||||
func (me *Point2D) Draw() {
|
||||
me.canvas.Pixel(me.X, me.Y)
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
package algs4
|
||||
|
||||
type Queue struct {
|
||||
items []interface{}
|
||||
}
|
||||
|
||||
func NewQueue() *Queue {
|
||||
return &Queue{
|
||||
items: []interface{}{},
|
||||
}
|
||||
}
|
||||
|
||||
func (me *Queue) Enqueue(item interface{}) {
|
||||
me.items = append(me.items, item)
|
||||
}
|
||||
|
||||
func (me *Queue) Dequeue() interface{} {
|
||||
if me.IsEmpty() {
|
||||
return nil
|
||||
}
|
||||
|
||||
ret := me.items[0]
|
||||
me.items = me.items[1:]
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func (me *Queue) Size() int {
|
||||
return len(me.items)
|
||||
}
|
||||
|
||||
func (me *Queue) IsEmpty() bool {
|
||||
return len(me.items) == 0
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
package algs4
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
||||
func init() {
|
||||
rand.Seed(time.Now().UTC().UnixNano())
|
||||
}
|
||||
|
||||
func RandomUniform(min, max float64) float64 {
|
||||
return rand.Float64()*(max-min) + min
|
||||
}
|
||||
|
||||
func Random() float64 {
|
||||
return rand.Float64()
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
package algs4
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
const ROLL_SIDES = 6
|
||||
|
||||
func Rolls(nrolls int) []*Counter {
|
||||
var rolls []*Counter
|
||||
|
||||
for i := 0; i < ROLL_SIDES; i++ {
|
||||
rolls = append(rolls, NewCounter(fmt.Sprintf("%d's", i+1)))
|
||||
}
|
||||
|
||||
randMax := float64(ROLL_SIDES)
|
||||
zero := float64(0.0)
|
||||
|
||||
for t := 0; t < nrolls; t++ {
|
||||
result := int(RandomUniform(zero, randMax))
|
||||
rolls[result].Increment()
|
||||
}
|
||||
|
||||
return rolls
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
package algs4
|
||||
|
||||
type Stack struct {
|
||||
items []interface{}
|
||||
}
|
||||
|
||||
func NewStack() *Stack {
|
||||
return &Stack{
|
||||
items: []interface{}{},
|
||||
}
|
||||
}
|
||||
|
||||
func (me *Stack) Push(item interface{}) {
|
||||
me.items = append(me.items, item)
|
||||
}
|
||||
|
||||
func (me *Stack) Pop() interface{} {
|
||||
if me.IsEmpty() {
|
||||
return nil
|
||||
}
|
||||
|
||||
lastIdx := me.Size() - 1
|
||||
lastItem := me.items[lastIdx]
|
||||
me.items = me.items[:lastIdx]
|
||||
|
||||
return lastItem
|
||||
}
|
||||
|
||||
func (me *Stack) IsEmpty() bool {
|
||||
return len(me.items) == 0
|
||||
}
|
||||
|
||||
func (me *Stack) Size() int {
|
||||
return len(me.items)
|
||||
}
|
Loading…
Reference in New Issue
Block a user