Initial Commit
This commit is contained in:
41
go/grains/README.md
Normal file
41
go/grains/README.md
Normal 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
30
go/grains/grains.go
Normal 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
61
go/grains/grains_test.go
Normal 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()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user