aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-06-08 10:48:57 +0100
committerGitHub <noreply@github.com>2021-06-08 10:48:57 +0100
commite254e8a0d160ce938bd9af471dce05d2fdcc49aa (patch)
treeaf2220a2bdd77b21bef3077fa767475072d78ee0
parent6c5da9f86d3e871257533368cea3f2a98a895a6b (diff)
parent27620f26cd32fe8e55bed679bbbb594c40e55094 (diff)
downloadperlweeklychallenge-club-e254e8a0d160ce938bd9af471dce05d2fdcc49aa.tar.gz
perlweeklychallenge-club-e254e8a0d160ce938bd9af471dce05d2fdcc49aa.tar.bz2
perlweeklychallenge-club-e254e8a0d160ce938bd9af471dce05d2fdcc49aa.zip
Merge pull request #4228 from PerlBoy1967/branch-for-challenge-116
Task 1 & 2
-rwxr-xr-xchallenge-116/perlboy1967/perl/ch-1.pl49
-rwxr-xr-xchallenge-116/perlboy1967/perl/ch-2.pl63
2 files changed, 112 insertions, 0 deletions
diff --git a/challenge-116/perlboy1967/perl/ch-1.pl b/challenge-116/perlboy1967/perl/ch-1.pl
new file mode 100755
index 0000000000..2dc60805c7
--- /dev/null
+++ b/challenge-116/perlboy1967/perl/ch-1.pl
@@ -0,0 +1,49 @@
+#!/usr/bin/perl
+
+# Perl Weekly Challenge - 116
+# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-116/#TASK1
+#
+# Task 1 - Number Sequence
+#
+# Author: Niels 'PerlBoy' van Dijke
+
+use v5.16;
+use strict;
+use warnings;
+
+use POSIX qw(ceil);
+
+use Test::More;
+
+my %tests = (
+ '1234' => 1,
+ '91011' => 1,
+ '102030' => 0,
+ '102103104' => 1,
+ '123456123458' => 0,
+ '8910111213141589101112131416' => 1,
+);
+
+foreach my $test (sort keys %tests) {
+ printf "$test\n" unless is(isNumberSequence($test),$tests{$test});
+}
+
+done_testing();
+
+sub isNumberSequence {
+ my ($n) = @_;
+
+ my $len = 1;
+
+ do {
+ my ($startNumber,$l) = (substr($n,0,$len),$len);
+ my ($next,$s) = ($startNumber+1);
+ while ($s = substr($n,$l) and $s =~ m#^$next#) {
+ return 1 if ($' eq '');
+ $l += length($next++);
+ }
+ $len++;
+ } while ($len <= ceil(length($n)/2));
+
+ return 0;
+}
diff --git a/challenge-116/perlboy1967/perl/ch-2.pl b/challenge-116/perlboy1967/perl/ch-2.pl
new file mode 100755
index 0000000000..5114e7f93c
--- /dev/null
+++ b/challenge-116/perlboy1967/perl/ch-2.pl
@@ -0,0 +1,63 @@
+#!/usr/bin/perl
+
+# Perl Weekly Challenge - 116
+# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-116/#TASK2
+#
+# Task 2 - Sum of Squares
+#
+# Author: Niels 'PerlBoy' van Dijke
+
+use v5.16;
+use strict;
+use warnings;
+
+use List::Util qw(sum);
+
+use Test::More;
+
+# Prototype(s)
+sub isSumOfSquares($);
+
+my %tests = (
+ 34 => 1,
+ 50 => 1,
+ 52 => 0,
+ 2021 => 1,
+ 1234563 => 1,
+);
+
+my %iSqr = (0,0);
+
+foreach my $test (sort keys %tests) {
+ is(isSumOfSquares($test),$tests{$test});
+}
+
+done_testing;
+
+
+sub isSumOfSquares($) {
+ my ($n) = @_;
+
+ return isIntSqr(sum(map{$_**2}split(//,$n)));
+}
+
+
+sub isIntSqr ($) {
+ my ($i) = @_;
+
+ state $maxSqr //= $iSqr{0};
+
+ return 1 if (defined $iSqr{$i});
+ return 0 if ($maxSqr > $i);
+
+ my ($m,$sqr) = ($iSqr{$maxSqr});
+ do {
+ $sqr = ++$m**2;
+ $iSqr{$sqr} = $m;
+ } while ($iSqr{$sqr} <= $i);
+
+ $maxSqr = $sqr;
+
+ return 1 if (defined $iSqr{$i});
+ return 0;
+}