Jim Infield
6 years ago
commit
506c52e353
5 changed files with 125 additions and 0 deletions
-
1.exercism/metadata.json
-
67README.md
-
17cases_test.go
-
18leap.go
-
22leap_test.go
@ -0,0 +1 @@ |
|||
{"track":"go","exercise":"leap","id":"395651d5e2594caca279b138a2b7701b","url":"https://exercism.io/my/solutions/395651d5e2594caca279b138a2b7701b","handle":"jinfield","is_requester":true,"auto_approve":false} |
@ -0,0 +1,67 @@ |
|||
# Leap |
|||
|
|||
Given a year, report if it is a leap year. |
|||
|
|||
The tricky thing here is that a leap year in the Gregorian calendar occurs: |
|||
|
|||
```text |
|||
on every year that is evenly divisible by 4 |
|||
except every year that is evenly divisible by 100 |
|||
unless the year is also evenly divisible by 400 |
|||
``` |
|||
|
|||
For example, 1997 is not a leap year, but 1996 is. 1900 is not a leap |
|||
year, but 2000 is. |
|||
|
|||
If your language provides a method in the standard library that does |
|||
this look-up, pretend it doesn't exist and implement it yourself. |
|||
|
|||
## Notes |
|||
|
|||
Though our exercise adopts some very simple rules, there is more to |
|||
learn! |
|||
|
|||
For a delightful, four minute explanation of the whole leap year |
|||
phenomenon, go watch [this youtube video][video]. |
|||
|
|||
[video]: http://www.youtube.com/watch?v=xX96xng7sAE |
|||
|
|||
You will see a `cases_test.go` file in this exercise. This holds the test |
|||
cases used in the `leap_test.go`. You can mostly ignore this file. |
|||
|
|||
However, if you are interested... we sometimes generate the test data from a |
|||
[cross language repository][problem-specifications-leap]. In that repo |
|||
exercises may have a [.json file][problem-specifications-leap-json] that |
|||
contains common test data. Some of our local exercises have an |
|||
[intermediary program][local-leap-gen] that takes the problem specification |
|||
JSON and turns in into Go structs that are fed into the `<exercise>_test.go` |
|||
file. The Go specific transformation of that data lives in the `cases_test.go` file. |
|||
|
|||
[problem-specifications-leap]: https://github.com/exercism/problem-specifications/tree/master/exercises/leap |
|||
[problem-specifications-leap-json]: https://github.com/exercism/problem-specifications/blob/master/exercises/leap/canonical-data.json |
|||
[local-leap-gen]: https://github.com/exercism/go/blob/master/exercises/leap/.meta/gen.go |
|||
|
|||
|
|||
## Running the tests |
|||
|
|||
To run the tests run the command `go test` from within the exercise directory. |
|||
|
|||
If the test suite contains benchmarks, you can run these with the `--bench` and `--benchmem` |
|||
flags: |
|||
|
|||
go test -v --bench . --benchmem |
|||
|
|||
Keep in mind that each reviewer will run benchmarks on a different machine, with |
|||
different specs, so the results from these benchmark tests may vary. |
|||
|
|||
## Further information |
|||
|
|||
For more detailed information about the Go track, including how to get help if |
|||
you're having trouble, please visit the exercism.io [Go language page](http://exercism.io/languages/go/resources). |
|||
|
|||
## Source |
|||
|
|||
JavaRanch Cattle Drive, exercise 3 [http://www.javaranch.com/leap.jsp](http://www.javaranch.com/leap.jsp) |
|||
|
|||
## Submitting Incomplete Solutions |
|||
It's possible to submit an incomplete solution so you can see how others have completed the exercise. |
@ -0,0 +1,17 @@ |
|||
package leap |
|||
|
|||
// Source: exercism/problem-specifications
|
|||
// Commit: 3134d31 leap 1.4.0: negative test: year divisible by 200, not by 400
|
|||
// Problem Specifications Version: 1.4.0
|
|||
|
|||
var testCases = []struct { |
|||
year int |
|||
expected bool |
|||
description string |
|||
}{ |
|||
{2015, false, "year not divisible by 4: common year"}, |
|||
{1996, true, "year divisible by 4, not divisible by 100: leap year"}, |
|||
{2100, false, "year divisible by 100, not divisible by 400: common year"}, |
|||
{2000, true, "year divisible by 400: leap year"}, |
|||
{1800, false, "year divisible by 200, not divisible by 400: common year"}, |
|||
} |
@ -0,0 +1,18 @@ |
|||
package leap |
|||
|
|||
const testVersion = 2 |
|||
|
|||
// IsLeapYear receives an integer year value and returns a boolean indicating
|
|||
// whether the year is a leap year or not.
|
|||
func IsLeapYear(year int) bool { |
|||
switch { |
|||
case year%400 == 0: |
|||
return true |
|||
case year%100 == 0: |
|||
return false |
|||
case year%4 == 0: |
|||
return true |
|||
default: |
|||
return false |
|||
} |
|||
} |
@ -0,0 +1,22 @@ |
|||
package leap |
|||
|
|||
import "testing" |
|||
|
|||
func TestLeapYears(t *testing.T) { |
|||
for _, test := range testCases { |
|||
observed := IsLeapYear(test.year) |
|||
if observed != test.expected { |
|||
t.Fatalf("IsLeapYear(%d) = %t, want %t (%s)", |
|||
test.year, observed, test.expected, test.description) |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Benchmark 400 year interval to get fair weighting of different years.
|
|||
func Benchmark400(b *testing.B) { |
|||
for i := 0; i < b.N; i++ { |
|||
for y := 1600; y < 2000; y++ { |
|||
IsLeapYear(y) |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue