aboutsummaryrefslogtreecommitdiff
path: root/challenge-116
diff options
context:
space:
mode:
authorboblied <boblied@gmail.com>2021-06-13 16:42:08 -0500
committerboblied <boblied@gmail.com>2021-06-13 16:42:08 -0500
commit8a58a1551f08217bae4cc3d1d72dcf26b8ae2751 (patch)
tree8ecd7a151a6f3459dfc20380a085ffa0722d1133 /challenge-116
parente4073369e502bd205400ae46fd695727f9c10cdb (diff)
downloadperlweeklychallenge-club-8a58a1551f08217bae4cc3d1d72dcf26b8ae2751.tar.gz
perlweeklychallenge-club-8a58a1551f08217bae4cc3d1d72dcf26b8ae2751.tar.bz2
perlweeklychallenge-club-8a58a1551f08217bae4cc3d1d72dcf26b8ae2751.zip
Solutions for PWC 116
Diffstat (limited to 'challenge-116')
-rw-r--r--challenge-116/bob-lied/README4
-rw-r--r--challenge-116/bob-lied/perl/ch-1.pl88
-rw-r--r--challenge-116/bob-lied/perl/ch-2.pl64
3 files changed, 154 insertions, 2 deletions
diff --git a/challenge-116/bob-lied/README b/challenge-116/bob-lied/README
index 8417e3a7f7..bbaa2cbbcb 100644
--- a/challenge-116/bob-lied/README
+++ b/challenge-116/bob-lied/README
@@ -1,3 +1,3 @@
-Solutions to weekly challenge 103 by Bob Lied.
+Solutions to weekly challenge 116 by Bob Lied.
-https://perlweeklychallenge.org/blog/perl-weekly-challenge-103/
+https://perlweeklychallenge.org/blog/perl-weekly-challenge-116/
diff --git a/challenge-116/bob-lied/perl/ch-1.pl b/challenge-116/bob-lied/perl/ch-1.pl
new file mode 100644
index 0000000000..d650f427b4
--- /dev/null
+++ b/challenge-116/bob-lied/perl/ch-1.pl
@@ -0,0 +1,88 @@
+#!/usr/bin/env perl
+# vim:set ts=4 sw=4 sts=4 et ai wm=0 nu:
+#=============================================================================
+# ch-1.pl
+#=============================================================================
+# Copyright (c) 2021, Bob Lied
+#=============================================================================
+# Perl Weekly Challenge 116, Task #1 Number Sequence
+# You are given a number $N >= 10.
+# Write a script to split the given number such that the difference between
+# two consecutive numbers is always 1 and it shouldn’t have leading 0.
+# Print the given number if it impossible to split the number.
+# Example
+# Input: $N = 1234 Output: 1,2,3,4
+# Input: $N = 91011 Output: 9,10,11
+# Input: $N = 10203 Output: 10203 as it is impossible to split satisfying the conditions.
+#=============================================================================
+
+use strict;
+use warnings;
+use v5.30;
+
+use experimental qw/ signatures /;
+no warnings "experimental::signatures";
+
+sub usage() { "Usage: $0 N, N>=10" };
+
+use Getopt::Long;
+my $Verbose = 0;
+my $DoTest = 0;
+
+GetOptions("test" => \$DoTest, "verbose" => \$Verbose);
+
+my $N = shift;
+die usage() unless defined $N && $N >= 10;
+
+exit(!runTest()) if $DoTest;
+
+sub seqUpToLen($first, $maxLen)
+{
+ my @seq = ( $first );
+ my $str = $first;
+ while ( length($str) < $maxLen )
+ {
+ push @seq, ++$first;
+ $str .= $first
+ }
+ return \@seq;
+}
+
+sub numberSequence($N)
+{
+ # Generate prefixes of every useful length from N.
+ # The longest prefix we need is half the string.
+ for my $n ( 1 .. int(length($N)/2) )
+ {
+ my $p = substr($N, 0, $n);
+ say $p;
+
+ # Generate the seqence starting from p, making the
+ # number as long as N
+ my $seq = seqUpToLen($p, length($N));
+ my $str = join("", @$seq);
+ say "p=$p seq=(@$seq) $str";
+
+ if ( $str eq $N )
+ {
+ return join(",", @$seq);
+ }
+ }
+ return $N;
+}
+
+sub runTest
+{
+ use Test::More;
+
+ is_deeply(seqUpToLen(1, 2), [ 1, 2 ], "seqUpToLen 1 2");
+ is_deeply(seqUpToLen(1, 4), [ 1, 2, 3, 4 ], "seqUpToLen 1 4");
+ is_deeply(seqUpToLen(11, 5), [ 11, 12, 13 ], "seqUpToLen 11 5");
+
+ is(numberSequence(1234), "1,2,3,4", "N=1234");
+ is(numberSequence(91011), "9,10,11", "N=91011");
+ is(numberSequence(10203), "10203", "N=10203");
+
+ done_testing;
+}
+
diff --git a/challenge-116/bob-lied/perl/ch-2.pl b/challenge-116/bob-lied/perl/ch-2.pl
new file mode 100644
index 0000000000..b871d34c7a
--- /dev/null
+++ b/challenge-116/bob-lied/perl/ch-2.pl
@@ -0,0 +1,64 @@
+#!/usr/bin/env perl
+# vim:set ts=4 sw=4 sts=4 et ai wm=0 nu:
+#=============================================================================
+# ch-2.pl
+#=============================================================================
+# Copyright (c) 2021, Bob Lied
+#=============================================================================
+# Perl Weekly Challenge 116 Task #2 Sum Of Squares
+# You are given a number $N >= 10.
+# Write a script to find out if the given number $N is such that sum of
+# squares of all digits is a perfect square. Print 1 if it is otherwise 0.
+# Example
+# Input: $N = 34 Output: 1 as 3^2 + 4^2 => 9 + 16 => 25 => 5^2
+# Input: $N = 50 Output: 1 as 5^2 + 0^2 => 25 + 0 => 25 => 5^2
+# Input: $N = 52 Output: 0 as 5^2 + 2^2 => 25 + 4 => 29
+#
+#=============================================================================
+
+use strict;
+use warnings;
+use v5.30;
+
+use experimental qw/ signatures /;
+no warnings "experimental::signatures";
+
+
+use Getopt::Long;
+my $Verbose = 0;
+my $DoTest = 0;
+
+GetOptions("test" => \$DoTest, "verbose" => \$Verbose);
+
+my $N = shift;
+die usage() unless defined $N && $N >= 10;
+
+exit(!runTest()) if $DoTest;
+
+sub sumOfSquares($N)
+{
+ my @digit = split(//, $N);
+
+ my @square = map { $_ * $_ } @digit;
+
+ my $sum = 0;
+ $sum += $_ foreach @square;
+
+ my $root = sqrt($sum);
+
+ say "(@square) = > $sum => $root" if ( $Verbose );
+
+ return ( $root == int($root) ? 1 : 0 );
+}
+
+sub runTest
+{
+ use Test::More;
+
+ is(sumOfSquares(34), 1, "N=34");
+ is(sumOfSquares(50), 1, "N=34");
+ is(sumOfSquares(52), 0, "N=52");
+
+ done_testing;
+}
+