DEV Community

Simon Green
Simon Green

Posted on

Weekly Challenge 137

Challenge, My solutions

So while Mohammad was commiserating the Indians losing to the Black Caps last night, as a Kiwi living in Australia I was a very happy boy. Well done to Kane Williamson and the lads.

TASK #1 › Long Year

Task

Write a script to find all the years between 1900 and 2100 which is a Long Year.

My solution

When we switched to the Gregorian calendar in 1752, they definitely didn't have computers in their mind. Date math really sucks. If we thought Y2K was serious, I suspect (the non-existent) 29/2/2100 is going to be even worse. We've got to deal with the 2038 date problem first. But I digress.

The terms 'long year' and '53 week years' aren't used at all in New Zealand and Australia, so I had to look up the meaning. According to this article "if the year starts on a Thursday or is a leap year that starts on a Wednesday, that particular year will have 53 numbered weeks. These week numbers are commonly used in some European and Asian countries; but not so much in the United States."

This seems rather simple exercise after that. We start with the fact that 1/1/1900 was a Monday. I set $year to 1900 and $day_of_week to 1 (where 0 = Sunday, 6 = Saturday). If day of week is 4 (Thursday) or 3 (Wednesday) in a leap year, I add it to the @long_years array.

The next fact is the first day of the next year is either one day (or two days for leap years) later than the current year. For example, 1/1/1900 was a Monday, so 1/1/1901 was a Tuesday. Remember 1900 was NOT a leap year. I change $year and $day_of_week as required, and keep running the loop until 2100.

Comparing the output to the example gives the same result, so hopefully it's all good.

Examples

$ ./ch-1.pl 
1903, 1908, 1914, 1920, 1925, 1931, 1936, 1942, 1948, 1953, 1959, 1964, 1970, 1976, 1981, 1987, 1992, 1998, 2004, 2009, 2015, 2020, 2026, 2032, 2037, 2043, 2048, 2054, 2060, 2065, 2071, 2076, 2082, 2088, 2093, 2099
Enter fullscreen mode Exit fullscreen mode

TASK #2 › Lychrel Number

Task

You are given a number, 10 ≤ $n ≤ 1000.

Write a script to find out if the given number is Lychrel number. To keep the task simple, we impose the following rules:

  • Stop if the number of iterations reached 500.
  • Stop if you end up with number >= 10,000,000.

My solution

If I thought date math was hard, number theory blows my mind. The Wikipedia page contains the equation below, which I don't even know where to begin!

Complex equation

So it's the brute force method for me. One great thing about Perl is that distinction between a number and a string that contains a number is almost non-existent. I know in the internals it's different, but from a coding point of view the transition between the two is seamless.

I check if the input is palindromic by comparing using the reverse function (which reverses the string in a scalar context). If it isn't I add the two numbers together and repeat the process until it is a match or we have reached the rules above.

Example

$ ./ch-2.pl 56
0

$ ./ch-2.pl 57
0

$ ./ch-2.pl 59
0

$ ./ch-2.pl 788
1
Enter fullscreen mode Exit fullscreen mode

Discussion (0)