]> gitweb.factorcode.org Git - factor.git/commitdiff
Factor solution to project Euler problem 19
authorSamuel Tardieu <sam@rfc1149.net>
Sun, 23 Dec 2007 12:45:46 +0000 (13:45 +0100)
committerSamuel Tardieu <sam@rfc1149.net>
Sun, 23 Dec 2007 12:45:46 +0000 (13:45 +0100)
extra/project-euler/019/019.factor [new file with mode: 0644]

diff --git a/extra/project-euler/019/019.factor b/extra/project-euler/019/019.factor
new file mode 100644 (file)
index 0000000..26ea74e
--- /dev/null
@@ -0,0 +1,41 @@
+! Copyright (c) 2007 Samuel Tardieu.
+! See http://factorcode.org/license.txt for BSD license.
+USING: calendar combinators combinators.lib kernel math.ranges sequences ;
+IN: project-euler.019
+
+! http://projecteuler.net/index.php?section=problems&id=19
+
+! DESCRIPTION
+! -----------
+
+! You are given the following information, but you may prefer to do some
+! research for yourself.
+
+!     * 1 Jan 1900 was a Monday.
+!     * Thirty days has September,
+!       April, June and November.
+!       All the rest have thirty-one,
+!       Saving February alone,
+!       Which has twenty-eight, rain or shine.
+!       And on leap years, twenty-nine.
+!     * A leap year occurs on any year evenly divisible by 4, but not
+!       on a century unless it is divisible by 400.
+
+! How many Sundays fell on the first of the month during the twentieth
+! century (1 Jan 1901 to 31 Dec 2000)?
+
+! SOLUTION
+! --------
+
+! Use Zeller congruence, which is implemented in the "calendar" module
+! already, as "zeller-congruence ( year month day -- n )" where n is
+! the day of the week (Sunday is 0).
+
+: euler019 ( -- count )
+  1901 2000 [a,b] [ 12 [1,b] [ 1 zeller-congruence ] 1 map-withn ] map concat
+  [ 0 = ] subset length ;
+
+! [ euler019 ] 100 ave-time
+! 1 ms run / 0 ms GC ave time - 100 trials
+
+MAIN: euler019