In honor of January 13, 2012, a Friday the 13th, I thought it might be fun to use Factor to explore similar dates in past and future history. According to Wikipedia, such a day "occurs at least once, but at most three times a year".
friday-13th?
A day is "Friday the 13th" if it is both (a) Friday and (b) the 13th:
: friday-13th? ( timestamp -- ? ) [ day>> 13 = ] [ friday? ] bi and ;
Trying it for today and tomorrow, to make sure it works:
IN: scratchpad now friday-13th? . t IN: scratchpad : tomorrow ( -- timestamp ) now 1 days time+ ; tomorrow friday-13th? . f
friday-13ths
Getting all Friday the 13th's for a given year:
: friday-13ths ( year -- seq ) 12 [0,b) [ 13 <date> dup friday? [ drop f ] unless ] with map sift ;
Or, for a range of years:
: all-friday-13ths ( start-year end-year -- seq ) [a,b] [ friday-13ths ] map concat ;
Trying it for 2012:
IN: scratchpad 2012 friday-13ths . { T{ timestamp { year 2012 } { month 1 } { day 13 } } T{ timestamp { year 2012 } { month 4 } { day 13 } } T{ timestamp { year 2012 } { month 7 } { day 13 } } }
next-friday-13th
We can iterate, looking for the next Friday the 13th:
: next-friday-13th ( timestamp -- date ) dup day>> 13 >= [ 1 months time+ ] when 13 >>day [ dup friday? not ] [ 1 months time+ ] while ;
Trying it for today, shows the next Friday the 13th is April, 13, 2012:
IN: scratchpad now next-friday-13th . T{ timestamp { year 2012 } { month 4 } { day 13 } }
The code (and some tests) for this is on my Github.
2 comments:
I really appreciate your posts on Factor; really nice job.
There's just one thing scaring me about Factor: is Slava still active in the developpement ? The Factor's blog seems dead till a year.
See you.
@kib: Thanks for the nice comments! Slava seems to be busy with work these days, but every once in awhile he does some Factor work.
A bunch of work has been done in the master branch over November and December. We're hoping to get an 0.95 release out soon with all the great changes in the last year and a half (since 0.94).
Best,
John.
Post a Comment