# Re: Factor

Factor: the language, the theory, and the practice.

## Friday the 13th

Friday, January 13, 2012

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+ ;

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.