diff options
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; + } +} |
