ETOOBUSY 🚀 minimal blogging for the impatient
PWC137 - Lychrel Number
TL;DR
On with TASK #2 from The Weekly Challenge #137. Enjoy!
The challenge
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:
a. Stop if the number of iterations reached 500. b. Stop if you end up with number >= 10_000_000.
According to wikipedia:
A Lychrel number is a natural number that cannot form a palindrome through the iterative process of repeatedly reversing its digits and adding the resulting numbers.
Example 1
Input: $n = 56 Output: 0 After 1 iteration, we found palindrome number. 56 + 65 = 121
Example 2
Input: $n = 57 Output: 0 After 2 iterations, we found palindrome number. 57 + 75 = 132 132 + 231 = 363
Example 3
Input: $n = 59 Output: 0 After 3 iterations, we found palindrome number. 59 + 95 = 154 154 + 451 = 605 605 + 506 = 1111
The questions
The only real question is… what should we return if the number is suspected to be a Lycherel? I’ll return 1.
It’s interesting the limit at 500 iterations - I guess that with the other limit at 10 millions, it will never be hit.
The solution
We’ll start with Perl here. The reverse function flips a string, and an integer in Perl has a dual-life as a string, so it basically works:
#!/usr/bin/env perl
use v5.24;
use warnings;
use experimental 'signatures';
no warnings 'experimental::signatures';
say maybe_lychrel(shift || 196);
sub maybe_lychrel ($n) {
while ($n < 10_000_000) {
my $r = reverse $n;
return 0 if $n eq $r;
$n += $r;
}
return 1;
}
In Raku it’s basically the same. We can have more input checks for free, of course:
#!/usr/bin/env raku
use v6;
sub MAIN (Int:D $x where 10 <= * <= 1000 = 196) { maybe-lychrel($x).put }
sub maybe-lychrel (Int:D $n is copy where * > 0) {
while $n < 10000000 {
my $r = $n.flip;
return 0 if $n eq $r;
$n += $r;
}
return 1;
}
This time the right sub/method is flip, because reverse is for listy stuff. Apart from this… it’s a copy.
Stay safe everybody!