aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-03-07 08:22:43 +0000
committerGitHub <noreply@github.com>2021-03-07 08:22:43 +0000
commit0236bae97a66ebbbf39dd5258e00c3fb06b4bc05 (patch)
treed5d810d695494401707a7041d88dcf0cacd5edfb
parent09b04967bc347bb598f36129f5d6da516e31b538 (diff)
parent1ecea841231b781354a4fc6f63bdd5dbd734c85c (diff)
downloadperlweeklychallenge-club-0236bae97a66ebbbf39dd5258e00c3fb06b4bc05.tar.gz
perlweeklychallenge-club-0236bae97a66ebbbf39dd5258e00c3fb06b4bc05.tar.bz2
perlweeklychallenge-club-0236bae97a66ebbbf39dd5258e00c3fb06b4bc05.zip
Merge pull request #3667 from arnesom/branch-for-challenge-102
Arne Sommer
-rw-r--r--challenge-102/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-102/arne-sommer/perl/ch-1.pl39
-rwxr-xr-xchallenge-102/arne-sommer/perl/ch-2.pl23
-rwxr-xr-xchallenge-102/arne-sommer/perl/hash-counting-string-perl23
-rwxr-xr-xchallenge-102/arne-sommer/perl/hash-counting-string-ternary-perl21
-rwxr-xr-xchallenge-102/arne-sommer/perl/rare-numbers-perl39
-rwxr-xr-xchallenge-102/arne-sommer/raku/ch-1.raku29
-rwxr-xr-xchallenge-102/arne-sommer/raku/ch-2.raku18
-rwxr-xr-xchallenge-102/arne-sommer/raku/hash-counting-string18
-rwxr-xr-xchallenge-102/arne-sommer/raku/hash-counting-string-ternary16
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers29
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers-sequence21
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers127
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers1027
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers230
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers331
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers432
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers532
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers627
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers729
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers829
-rwxr-xr-xchallenge-102/arne-sommer/raku/rare-numbers929
22 files changed, 570 insertions, 0 deletions
diff --git a/challenge-102/arne-sommer/blog.txt b/challenge-102/arne-sommer/blog.txt
new file mode 100644
index 0000000000..5b137fc1d1
--- /dev/null
+++ b/challenge-102/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/rare-counting.html
diff --git a/challenge-102/arne-sommer/perl/ch-1.pl b/challenge-102/arne-sommer/perl/ch-1.pl
new file mode 100755
index 0000000000..6515e7ff81
--- /dev/null
+++ b/challenge-102/arne-sommer/perl/ch-1.pl
@@ -0,0 +1,39 @@
+#! /usr/bin/env perl
+
+use strict;
+use feature 'say';
+use feature 'signatures';
+no warnings 'experimental::signatures';
+use Getopt::Long;
+
+my $verbose = 0;
+
+GetOptions("verbose" => \$verbose);
+
+my $N = shift(@ARGV) // die 'Please specify $N';
+
+die '$N is not a positive integer' unless $N =~ /^[1-9][0-9]*$/;
+
+my $lower = 1 . 0 x ($N -1);
+my $upper = 9 x $N;
+
+say ": Range: $lower - $upper" if $verbose;
+
+for my $candidate ($lower .. $upper)
+{
+ say $candidate if is_rare($candidate);
+}
+
+sub is_rare ($number)
+{
+ my $reverse = reverse $number;
+ my $add = $number + $reverse;
+ my $subtract = $number - $reverse;
+
+ return 0 if $add < 0 || $subtract < 0;
+
+ my $add_sqrt = sqrt($add);
+ my $sub_sqrt = sqrt($subtract);
+
+ return int($add_sqrt) == $add_sqrt && int($sub_sqrt) == $sub_sqrt;
+}
diff --git a/challenge-102/arne-sommer/perl/ch-2.pl b/challenge-102/arne-sommer/perl/ch-2.pl
new file mode 100755
index 0000000000..f2f84f78a8
--- /dev/null
+++ b/challenge-102/arne-sommer/perl/ch-2.pl
@@ -0,0 +1,23 @@
+#! /usr/bin/env perl
+
+use strict;
+use feature 'say';
+
+my $N = shift(@ARGV) // die 'Please specify $N';
+
+die '$N is not a positive integer' unless $N =~ /^[1-9][0-9]*$/;
+
+my $position = $N;
+my $string = "";
+
+while ($position > 1)
+{
+ my $prefix = $position . '#';
+
+ $string = $prefix . $string;
+ $position -= length($prefix);
+}
+
+length($string) == $N
+ ? say $string
+ : say "#$string";
diff --git a/challenge-102/arne-sommer/perl/hash-counting-string-perl b/challenge-102/arne-sommer/perl/hash-counting-string-perl
new file mode 100755
index 0000000000..f2f84f78a8
--- /dev/null
+++ b/challenge-102/arne-sommer/perl/hash-counting-string-perl
@@ -0,0 +1,23 @@
+#! /usr/bin/env perl
+
+use strict;
+use feature 'say';
+
+my $N = shift(@ARGV) // die 'Please specify $N';
+
+die '$N is not a positive integer' unless $N =~ /^[1-9][0-9]*$/;
+
+my $position = $N;
+my $string = "";
+
+while ($position > 1)
+{
+ my $prefix = $position . '#';
+
+ $string = $prefix . $string;
+ $position -= length($prefix);
+}
+
+length($string) == $N
+ ? say $string
+ : say "#$string";
diff --git a/challenge-102/arne-sommer/perl/hash-counting-string-ternary-perl b/challenge-102/arne-sommer/perl/hash-counting-string-ternary-perl
new file mode 100755
index 0000000000..5f4d8ee973
--- /dev/null
+++ b/challenge-102/arne-sommer/perl/hash-counting-string-ternary-perl
@@ -0,0 +1,21 @@
+#! /usr/bin/env perl
+
+use strict;
+use feature 'say';
+
+my $N = shift(@ARGV) // die 'Please specify $N';
+
+die '$N is not a positive integer' unless $N =~ /^[1-9][0-9]*$/;
+
+my $position = $N;
+my $string = "";
+
+while ($position > 0)
+{
+ my $prefix = $position != 1 ? $position . '#' : '#';
+
+ $string = $prefix . $string;
+ $position -= length($prefix);
+}
+
+say $string;
diff --git a/challenge-102/arne-sommer/perl/rare-numbers-perl b/challenge-102/arne-sommer/perl/rare-numbers-perl
new file mode 100755
index 0000000000..6515e7ff81
--- /dev/null
+++ b/challenge-102/arne-sommer/perl/rare-numbers-perl
@@ -0,0 +1,39 @@
+#! /usr/bin/env perl
+
+use strict;
+use feature 'say';
+use feature 'signatures';
+no warnings 'experimental::signatures';
+use Getopt::Long;
+
+my $verbose = 0;
+
+GetOptions("verbose" => \$verbose);
+
+my $N = shift(@ARGV) // die 'Please specify $N';
+
+die '$N is not a positive integer' unless $N =~ /^[1-9][0-9]*$/;
+
+my $lower = 1 . 0 x ($N -1);
+my $upper = 9 x $N;
+
+say ": Range: $lower - $upper" if $verbose;
+
+for my $candidate ($lower .. $upper)
+{
+ say $candidate if is_rare($candidate);
+}
+
+sub is_rare ($number)
+{
+ my $reverse = reverse $number;
+ my $add = $number + $reverse;
+ my $subtract = $number - $reverse;
+
+ return 0 if $add < 0 || $subtract < 0;
+
+ my $add_sqrt = sqrt($add);
+ my $sub_sqrt = sqrt($subtract);
+
+ return int($add_sqrt) == $add_sqrt && int($sub_sqrt) == $sub_sqrt;
+}
diff --git a/challenge-102/arne-sommer/raku/ch-1.raku b/challenge-102/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..d06b0367d6
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,29 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = (1 ~ 0 x ($N -1)).Int;
+my $upper = (9 x $N).Int;
+
+my ($reverse, $add, $subtract, $add-sqrt, $sub-sqrt);
+
+say ": Range: $lower - $upper" if $verbose;
+
+for $lower .. $upper -> $number
+{
+ $reverse = $number.flip.Int;
+
+ $add = $number + $reverse;
+ next if $add < 0;
+
+ $subtract = $number - $reverse;
+ next if $subtract < 0;
+
+ $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ $sub-sqrt = $subtract.sqrt;
+ say $number if $sub-sqrt.Int == $sub-sqrt;
+ }
+}
diff --git a/challenge-102/arne-sommer/raku/ch-2.raku b/challenge-102/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..ae353bd416
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,18 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0);
+
+my $position = $N;
+my $string = "";
+
+while ($position > 1)
+{
+ my $prefix = $position ~ '#';
+
+ $string = $prefix ~ $string;
+ $position -= $prefix.chars;
+}
+
+say $string.chars == $N
+ ?? $string
+ !! "#$string";
diff --git a/challenge-102/arne-sommer/raku/hash-counting-string b/challenge-102/arne-sommer/raku/hash-counting-string
new file mode 100755
index 0000000000..ae353bd416
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/hash-counting-string
@@ -0,0 +1,18 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0);
+
+my $position = $N;
+my $string = "";
+
+while ($position > 1)
+{
+ my $prefix = $position ~ '#';
+
+ $string = $prefix ~ $string;
+ $position -= $prefix.chars;
+}
+
+say $string.chars == $N
+ ?? $string
+ !! "#$string";
diff --git a/challenge-102/arne-sommer/raku/hash-counting-string-ternary b/challenge-102/arne-sommer/raku/hash-counting-string-ternary
new file mode 100755
index 0000000000..dafad526b1
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/hash-counting-string-ternary
@@ -0,0 +1,16 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0);
+
+my $position = $N;
+my $string = "";
+
+while ($position > 0)
+{
+ my $prefix = $position != 1 ?? $position ~ '#' !! '#';
+
+ $string = $prefix ~ $string;
+ $position -= $prefix.chars;
+}
+
+say $string;
diff --git a/challenge-102/arne-sommer/raku/rare-numbers b/challenge-102/arne-sommer/raku/rare-numbers
new file mode 100755
index 0000000000..d06b0367d6
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers
@@ -0,0 +1,29 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = (1 ~ 0 x ($N -1)).Int;
+my $upper = (9 x $N).Int;
+
+my ($reverse, $add, $subtract, $add-sqrt, $sub-sqrt);
+
+say ": Range: $lower - $upper" if $verbose;
+
+for $lower .. $upper -> $number
+{
+ $reverse = $number.flip.Int;
+
+ $add = $number + $reverse;
+ next if $add < 0;
+
+ $subtract = $number - $reverse;
+ next if $subtract < 0;
+
+ $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ $sub-sqrt = $subtract.sqrt;
+ say $number if $sub-sqrt.Int == $sub-sqrt;
+ }
+}
diff --git a/challenge-102/arne-sommer/raku/rare-numbers-sequence b/challenge-102/arne-sommer/raku/rare-numbers-sequence
new file mode 100755
index 0000000000..9ad6937bca
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers-sequence
@@ -0,0 +1,21 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0);
+
+my $rns = (1..Inf).grep( *.&is-rare );
+
+say $rns[^$N];
+
+sub is-rare ($number)
+{
+ my $reverse = $number.flip;
+ my $add = $number + $reverse;
+ my $subtract = $number - $reverse;
+
+ return False if any($add, $subtract) < 0;
+
+ my $add-sqrt = $add.sqrt;
+ my $sub-sqrt = $subtract.sqrt;
+
+ return $add.sqrt.Int == $add.sqrt && $sub-sqrt.Int == $sub-sqrt;
+}
diff --git a/challenge-102/arne-sommer/raku/rare-numbers1 b/challenge-102/arne-sommer/raku/rare-numbers1
new file mode 100755
index 0000000000..9a314a83cd
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers1
@@ -0,0 +1,27 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = 1 ~ 0 x ($N -1);
+my $upper = 9 x $N;
+
+say ": Range: $lower - $upper" if $verbose;
+
+for $lower .. $upper -> $candidate
+{
+ say $candidate if is-rare($candidate);
+}
+
+sub is-rare ($number)
+{
+ my $reverse = $number.flip;
+ my $add = $number + $reverse;
+ my $subtract = $number - $reverse;
+
+ return False if any($add, $subtract) < 0;
+
+ my $add-sqrt = $add.sqrt;
+ my $sub-sqrt = $subtract.sqrt;
+
+ return $add.sqrt.Int == $add.sqrt && $sub-sqrt.Int == $sub-sqrt;
+} \ No newline at end of file
diff --git a/challenge-102/arne-sommer/raku/rare-numbers10 b/challenge-102/arne-sommer/raku/rare-numbers10
new file mode 100755
index 0000000000..a3732bb47c
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers10
@@ -0,0 +1,27 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = (1 ~ 0 x ($N -1)).Int;
+my $upper = (9 x $N).Int;
+
+say ": Range: $lower - $upper" if $verbose;
+
+for $lower .. $upper -> $number
+{
+ my $reverse = $number.flip.Int;
+
+ my $add = $number + $reverse;
+ next if $add < 0;
+
+ my $subtract = $number - $reverse;
+ next if $subtract < 0;
+
+ my $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ my $sub-sqrt = $subtract.sqrt;
+ say $number if $sub-sqrt.Int == $sub-sqrt;
+ }
+}
diff --git a/challenge-102/arne-sommer/raku/rare-numbers2 b/challenge-102/arne-sommer/raku/rare-numbers2
new file mode 100755
index 0000000000..32600662bf
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers2
@@ -0,0 +1,30 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = 1 ~ 0 x ($N -1);
+my $upper = 9 x $N;
+
+say ": Range: $lower - $upper" if $verbose;
+
+for $lower .. $upper -> $candidate
+{
+ say $candidate if is-rare($candidate);
+}
+
+sub is-rare ($number)
+{
+ my $reverse = $number.flip;
+ my $add = $number + $reverse;
+ my $subtract = $number - $reverse;
+
+ return False if any($add, $subtract) < 0;
+
+ my $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ my $sub-sqrt = $subtract.sqrt;
+ return $sub-sqrt.Int == $sub-sqrt;
+ }
+}
diff --git a/challenge-102/arne-sommer/raku/rare-numbers3 b/challenge-102/arne-sommer/raku/rare-numbers3
new file mode 100755
index 0000000000..81137b468a
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers3
@@ -0,0 +1,31 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = 1 ~ 0 x ($N -1);
+my $upper = 9 x $N;
+
+say ": Range: $lower - $upper" if $verbose;
+
+for $lower .. $upper -> $candidate
+{
+ say $candidate if is-rare($candidate);
+}
+
+sub is-rare ($number)
+{
+ my $reverse = $number.flip;
+ my $add = $number + $reverse;
+ my $subtract = $number - $reverse;
+
+ return False if $add < 0;
+ return False if $subtract < 0;
+
+ my $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ my $sub-sqrt = $subtract.sqrt;
+ return $sub-sqrt.Int == $sub-sqrt;
+ }
+}
diff --git a/challenge-102/arne-sommer/raku/rare-numbers4 b/challenge-102/arne-sommer/raku/rare-numbers4
new file mode 100755
index 0000000000..5e6306c4c5
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers4
@@ -0,0 +1,32 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = 1 ~ 0 x ($N -1);
+my $upper = 9 x $N;
+
+say ": Range: $lower - $upper" if $verbose;
+
+for $lower .. $upper -> $candidate
+{
+ say $candidate if is-rare($candidate);
+}
+
+sub is-rare ($number)
+{
+ my $reverse = $number.flip;
+
+ my $add = $number + $reverse;
+ return False if $add < 0;
+
+ my $subtract = $number - $reverse;
+ return False if $subtract < 0;
+
+ my $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ my $sub-sqrt = $subtract.sqrt;
+ return $sub-sqrt.Int == $sub-sqrt;
+ }
+}
diff --git a/challenge-102/arne-sommer/raku/rare-numbers5 b/challenge-102/arne-sommer/raku/rare-numbers5
new file mode 100755
index 0000000000..289b0f8f6c
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers5
@@ -0,0 +1,32 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = 1 ~ 0 x ($N -1);
+my $upper = 9 x $N;
+
+say ": Range: $lower - $upper" if $verbose;
+
+for $lower .. $upper -> $candidate
+{
+ say $candidate if is-rare($candidate);
+}
+
+sub is-rare ($number)
+{
+ my $reverse = $number.flip.Int;
+
+ my $add = $number + $reverse;
+ return False if $add < 0;
+
+ my $subtract = $number - $reverse;
+ return False if $subtract < 0;
+
+ my $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ my $sub-sqrt = $subtract.sqrt;
+ return $sub-sqrt.Int == $sub-sqrt;
+ }
+}
diff --git a/challenge-102/arne-sommer/raku/rare-numbers6 b/challenge-102/arne-sommer/raku/rare-numbers6
new file mode 100755
index 0000000000..e5ed42d8c1
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers6
@@ -0,0 +1,27 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = 1 ~ 0 x ($N -1);
+my $upper = 9 x $N;
+
+say ": Range: $lower - $upper" if $verbose;
+
+for $lower .. $upper -> $number
+{
+ my $reverse = $number.flip.Int;
+
+ my $add = $number + $reverse;
+ next if $add < 0;
+
+ my $subtract = $number - $reverse;
+ next if $subtract < 0;
+
+ my $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ my $sub-sqrt = $subtract.sqrt;
+ say $number if $sub-sqrt.Int == $sub-sqrt;
+ }
+}
diff --git a/challenge-102/arne-sommer/raku/rare-numbers7 b/challenge-102/arne-sommer/raku/rare-numbers7
new file mode 100755
index 0000000000..f2160c1550
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers7
@@ -0,0 +1,29 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = 1 ~ 0 x ($N -1);
+my $upper = 9 x $N;
+
+say ": Range: $lower - $upper" if $verbose;
+
+say ($lower .. $upper).grep({ is-rare($_) }).join("\n");
+
+sub is-rare ($number)
+{
+ my $reverse = $number.flip.Int;
+
+ my $add = $number + $reverse;
+ return False if $add < 0;
+
+ my $subtract = $number - $reverse;
+ return False if $subtract < 0;
+
+ my $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ my $sub-sqrt = $subtract.sqrt;
+ return $sub-sqrt.Int == $sub-sqrt;
+ }
+} \ No newline at end of file
diff --git a/challenge-102/arne-sommer/raku/rare-numbers8 b/challenge-102/arne-sommer/raku/rare-numbers8
new file mode 100755
index 0000000000..b58c47e98a
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers8
@@ -0,0 +1,29 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = (1 ~ 0 x ($N -1)).Int;
+my $upper = (9 x $N).Int;
+
+say ": Range: $lower - $upper" if $verbose;
+
+say ($lower .. $upper).grep( *.&is-rare ).join("\n");
+
+sub is-rare ($number)
+{
+ my $reverse = $number.flip.Int;
+
+ my $add = $number + $reverse;
+ return False if $add < 0;
+
+ my $subtract = $number - $reverse;
+ return False if $subtract < 0;
+
+ my $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ my $sub-sqrt = $subtract.sqrt;
+ return $sub-sqrt.Int == $sub-sqrt;
+ }
+}
diff --git a/challenge-102/arne-sommer/raku/rare-numbers9 b/challenge-102/arne-sommer/raku/rare-numbers9
new file mode 100755
index 0000000000..70f883bc9c
--- /dev/null
+++ b/challenge-102/arne-sommer/raku/rare-numbers9
@@ -0,0 +1,29 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $N where $N > 0, :v(:$verbose));
+
+my $lower = (1 ~ 0 x ($N -1)).Int;
+my $upper = (9 x $N).Int;
+
+say ": Range: $lower - $upper" if $verbose;
+
+($lower .. $upper).hyper.grep( *.&is-rare )>>.say;
+
+sub is-rare ($number)
+{
+ my $reverse = $number.flip.Int;
+
+ my $add = $number + $reverse;
+ return False if $add < 0;
+
+ my $subtract = $number - $reverse;
+ return False if $subtract < 0;
+
+ my $add-sqrt = $add.sqrt;
+
+ if $add-sqrt.Int == $add-sqrt
+ {
+ my $sub-sqrt = $subtract.sqrt;
+ return $sub-sqrt.Int == $sub-sqrt;
+ }
+}