diff --git a/extra/project-euler/019/019.factor b/extra/project-euler/019/019.factor new file mode 100644 index 0000000000..26ea74e689 --- /dev/null +++ b/extra/project-euler/019/019.factor @@ -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