Initial Commit

This commit is contained in:
2016-08-13 18:20:14 -05:00
commit 50f4a86fd8
408 changed files with 15301 additions and 0 deletions

41
go/grains/README.md Normal file
View File

@@ -0,0 +1,41 @@
# Grains
Write a program that calculates the number of grains of wheat on a chessboard given that the number on each square doubles.
There once was a wise servant who saved the life of a prince. The king
promised to pay whatever the servant could dream up. Knowing that the
king loved chess, the servant told the king he would like to have grains
of wheat. One grain on the first square of a chess board. Two grains on
the next. Four on the third, and so on.
There are 64 squares on a chessboard.
Write a program that shows:
- how many grains were on each square, and
- the total number of grains
## For bonus points
Did you get the tests passing and the code clean? If you want to, these
are some additional things you could try:
- Optimize for speed.
- Optimize for readability.
Then please share your thoughts in a comment on the submission. Did this
experiment make the code better? Worse? Did you learn anything from it?
To run the tests simply run the command `go test` in the exercise directory.
If the test suite contains benchmarks, you can run these with the `-bench`
flag:
go test -bench .
For more detailed info about the Go track see the [help
page](http://help.exercism.io/getting-started-with-go.html).
## Source
JavaRanch Cattle Drive, exercise 6 [view source](http://www.javaranch.com/grains.jsp)

30
go/grains/grains.go Normal file
View File

@@ -0,0 +1,30 @@
package grains
import "errors"
// Square just takes 1 * 2^sq
func Square(sq int) (uint64, error) {
if sq > 0 && sq < 65 {
return (1 << uint(sq-1)), nil
}
return 0, errors.New("Invalid Square Requested")
}
// TotalForSquare calculates the total number
// for all squares up to sq (cause why not)
func TotalForSquare(sq int) (uint64, error) {
if sq < 0 || sq > 64 {
return 0, errors.New("Invalid Square Requested")
}
var ret uint64
for i := 0; i <= sq; i++ {
ret = (ret << 1) | 1
}
return ret, nil
}
// Total calculates the total for the entire board
func Total() uint64 {
ret, _ := TotalForSquare(64)
return ret
}

61
go/grains/grains_test.go Normal file
View File

@@ -0,0 +1,61 @@
package grains
import (
"testing"
)
var squareTests = []struct {
input int
expectedVal uint64
expectError bool
}{
{1, 1, false},
{2, 2, false},
{3, 4, false},
{4, 8, false},
{16, 32768, false},
{32, 2147483648, false},
{64, 9223372036854775808, false},
{65, 0, true},
{0, 0, true},
{-1, 0, true},
}
func TestSquare(t *testing.T) {
for _, test := range squareTests {
actualVal, actualErr := Square(test.input)
if actualVal != test.expectedVal {
t.Errorf("Square(%d) expected %d, Actual %d", test.input, test.expectedVal, actualVal)
}
// if we expect an error and there isn't one
if test.expectError && actualErr == nil {
t.Errorf("Square(%d) expected an error, but error is nil", test.input)
}
// if we don't expect an error and there is one
if !test.expectError && actualErr != nil {
t.Errorf("Square(%d) expected no error, but error is: %s", test.input, actualErr)
}
}
}
func TestTotal(t *testing.T) {
var expected uint64 = 18446744073709551615
if actual := Total(); actual != expected {
t.Errorf("Total() expected %d, Actual %d", expected, actual)
}
}
func BenchmarkSquare(b *testing.B) {
b.StopTimer()
for _, test := range squareTests {
b.StartTimer()
for i := 0; i < b.N; i++ {
Square(test.input)
}
b.StopTimer()
}
}