summaryrefslogtreecommitdiff
path: root/go/leap
diff options
context:
space:
mode:
Diffstat (limited to 'go/leap')
-rw-r--r--go/leap/README.md45
-rw-r--r--go/leap/cases_test.go17
-rw-r--r--go/leap/leap.go8
-rw-r--r--go/leap/leap_test.go32
4 files changed, 102 insertions, 0 deletions
diff --git a/go/leap/README.md b/go/leap/README.md
new file mode 100644
index 0000000..9205866
--- /dev/null
+++ b/go/leap/README.md
@@ -0,0 +1,45 @@
+# Leap
+
+Write a program that will take a year and report if it is a leap year.
+
+The tricky thing here is that a leap year in the Gregorian calendar occurs:
+
+```plain
+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
+
+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://exercism.io/languages/go).
+
+## Source
+
+JavaRanch Cattle Drive, exercise 3 [http://www.javaranch.com/leap.jsp](http://www.javaranch.com/leap.jsp)
+
+## Submitting Incomplete Problems
+It's possible to submit an incomplete solution so you can see how others have completed the exercise.
+
diff --git a/go/leap/cases_test.go b/go/leap/cases_test.go
new file mode 100644
index 0000000..d1af40f
--- /dev/null
+++ b/go/leap/cases_test.go
@@ -0,0 +1,17 @@
+package leap
+
+// Source: exercism/x-common
+// Commit: 945d08e Merge pull request #50 from soniakeys/master
+
+var testCases = []struct {
+ year int
+ expected bool
+ description string
+}{
+ {1996, true, "leap year"},
+ {1997, false, "non-leap year"},
+ {1998, false, "non-leap even year"},
+ {1900, false, "century"},
+ {2400, true, "fourth century"},
+ {2000, true, "Y2K"},
+}
diff --git a/go/leap/leap.go b/go/leap/leap.go
new file mode 100644
index 0000000..75908eb
--- /dev/null
+++ b/go/leap/leap.go
@@ -0,0 +1,8 @@
+package leap
+
+const testVersion = 2
+
+// IsLeapYear reports if it year is a leap year
+func IsLeapYear(y int) bool {
+ return y%4 == 0 && y%100 != 0 || y%400 == 0
+}
diff --git a/go/leap/leap_test.go b/go/leap/leap_test.go
new file mode 100644
index 0000000..974d79e
--- /dev/null
+++ b/go/leap/leap_test.go
@@ -0,0 +1,32 @@
+package leap
+
+import "testing"
+
+// Define a function IsLeapYear(int) bool.
+//
+// Also define a testVersion with a value that matches
+// the targetTestVersion here.
+
+const targetTestVersion = 2
+
+func TestLeapYears(t *testing.T) {
+ if testVersion != targetTestVersion {
+ t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
+ }
+ 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)
+ }
+ }
+}