diff options
| author | boblied <boblied@gmail.com> | 2021-06-13 16:42:08 -0500 |
|---|---|---|
| committer | boblied <boblied@gmail.com> | 2021-06-13 16:42:08 -0500 |
| commit | 8a58a1551f08217bae4cc3d1d72dcf26b8ae2751 (patch) | |
| tree | 8ecd7a151a6f3459dfc20380a085ffa0722d1133 /challenge-116 | |
| parent | e4073369e502bd205400ae46fd695727f9c10cdb (diff) | |
| download | perlweeklychallenge-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/README | 4 | ||||
| -rw-r--r-- | challenge-116/bob-lied/perl/ch-1.pl | 88 | ||||
| -rw-r--r-- | challenge-116/bob-lied/perl/ch-2.pl | 64 |
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; +} + |
