T
oday's question is:
In the Quarante Republic, every month contains 40 days, numbered 1 to 40. Any day whose number is divisible by 6 is a holiday, and any day whose number is a prime is also a holiday. How many times in a month does a single working day occur between two holidays?
This lends itself very well to a Forth program.
The first interesting challenge is to write a ?prime word in Forth. I don't remember doing this before. Google tells me that someone has published a Forth program for exactly this word but it looks unnecessarily complex for our purposes today.
I didn't know this, but you can find out whether a number is prime by trying to divide it by each prime up to the square root of your number. In our case that's only 2, 3 and 5. And only then if those primes are smaller than our number.
The solution I have right now is less efficient, but does the job. I'll be looking to improve this. Please share your own code if you have something more elegant than this that works for numbers 2-39.
After that we need a ?hol word, which also requires a ?div6 word:
Note that I'm making use of exit and leave, with the original number on the stack. In this program we know we won't be sending 0 to any of these tests, so when we want to leave with 'true' on the stack, we don't need to drop the original number and put 'true'.
And finally the 'run' word which has a few nested 'if's (note starting at day 2. Due to the nature of Forth do loops, the last day tested will be 39)
I'm going to keep looking for ways to reduce all that nesting.So there's our answer, there's one day and it's day 4.It occurred to me late in the day that day 1 and day 40 do in fact each have a day before and a day after, so do we need to check those?
Is 1 a prime number? It has no divisors other than 1 or itself. But Google says no, 1 is not prime. That makes day 1 a workday. Using ?hol tells us that days 39 and 40 are workdays, so no, this isn't a trick question, neither day 40 or day 1 are days that we're interested in and so I'll stick to my Minstrel's answer of 1 day - day 4.
Comments
Post a Comment