This week, there was more work to be done for some of us: in addition to the standard three challenges, there was one more from Neil Bowers. His suggestion for a challenge had been simplified, so he published the original specification.

## Van Eck’s Sequence

Let *a*_{0} = 0. Then, for *n ≥ 0*, if there exists an *m < n* such that *a*_{m} = a_{n}, take the largest such *m* and set *a*_{n+1} = n − m; otherwise *a*_{n+1} = 0.

I didn’t find a non-recursive formula for the sequence. I implemented a solution using an *iterator*: a subroutine that returns the next element of the sequence on each call.

Let’s start with a test.

## Last Fridays

*Write a script to print the date of last Friday of every month of a given year.*

To handle dates, I used Time::Piece, a core module since 5.10. It has no method to get the last Friday of a month directly, so I tried a simple trick: get the first day of the next month, subtract one day, and continue to subtract days until we get a Friday.

`Time::Piece`

does all the date maths in seconds. I also used Time::Seconds to get the constant `ONE_DAY`

so I didn’t have to count it myself (`60 * 60 * 24`

, right?)

## The Smallest Non-Prime Euclid Number

*An Euclid number is a number that equals 1 + product of a sequence of primes.*

To speed things up, I used an object that caches the sequence of primes discovered so far. The method `size`

returns the length of the sequence of primes; `extend_to`

extends the sequence up to the specified number.

## Compute the Equal Point in the Fahrenheit and Celsius Scales

I used a simple numerical method to find the equal point: Start randomly, move in one direction, if the difference is greater, change the direction, otherwise decrease the step, until there’s no difference.

*Write a script to encode/decode Roman numerals.*

This has been solved many times, you can easily google a golfed solution shorter than **L** characters (for example at code-golf.io).