aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Manring <michael@manring>2022-03-16 01:07:38 +0700
committerMichael Manring <michael@manring>2022-03-16 01:29:41 +0700
commitc14a49440f7a7c9ac1d70f817d5c7a12aa25dba4 (patch)
tree0f3278170edf718af063ec2143178db786b142ad
parent1354cf80de7115334f0f499a0f09bdcc020de0cc (diff)
downloadperlweeklychallenge-club-c14a49440f7a7c9ac1d70f817d5c7a12aa25dba4.tar.gz
perlweeklychallenge-club-c14a49440f7a7c9ac1d70f817d5c7a12aa25dba4.tar.bz2
perlweeklychallenge-club-c14a49440f7a7c9ac1d70f817d5c7a12aa25dba4.zip
pwc156 solution in perl
-rw-r--r--challenge-156/pokgopun/perl/ch-1.pl30
-rw-r--r--challenge-156/pokgopun/perl/ch-2.pl66
2 files changed, 96 insertions, 0 deletions
diff --git a/challenge-156/pokgopun/perl/ch-1.pl b/challenge-156/pokgopun/perl/ch-1.pl
new file mode 100644
index 0000000000..1a6d96c0ee
--- /dev/null
+++ b/challenge-156/pokgopun/perl/ch-1.pl
@@ -0,0 +1,30 @@
+use strict;
+use warnings;
+use Math::Prime::Util qw/is_prime/;
+
+my $n = shift;
+$n = 10 unless $n && $n =~ /^\d+$/;
+my $i;
+my %is_prime;
+my @prime;
+{
+ my $j = ++$i;
+ my $sum;
+ {
+ $sum += $j % 2;
+ $j = int($j / 2);
+ redo if $j;
+ }
+ if (defined $is_prime{$sum})
+ {
+ push @prime, $i if $is_prime{$sum};
+ } else {
+ $is_prime{$sum} = 0;
+ if (is_prime($sum)){
+ $is_prime{$sum} = 1;
+ push @prime, $i
+ }
+ }
+ redo if @prime < $n;
+}
+printf "%s\n", join(", ",@prime);
diff --git a/challenge-156/pokgopun/perl/ch-2.pl b/challenge-156/pokgopun/perl/ch-2.pl
new file mode 100644
index 0000000000..eff159f7e6
--- /dev/null
+++ b/challenge-156/pokgopun/perl/ch-2.pl
@@ -0,0 +1,66 @@
+use strict;
+use warnings;
+use Data::Dumper;
+
+my $n = shift;
+$n = 12 unless $n && $n =~ /^\d+$/;
+
+my @d = &getDivisors($n);
+#printf "%s\n", join(", ", @d);
+my $sum = eval(join(" + ",@d));
+my $o = 0;
+{
+ last unless $sum > $n;
+ $o = 1;
+ for my $i (2..$#d) {
+ my $ds = [];
+ &cTree([],$i,[@d],$ds);
+ if (&isSumsEqualN($n,$ds)){
+ $o = 0;
+ last;
+ }
+ }
+}
+#printf "Input: \$n = %s, Output: %s\n", $n, $o;
+printf "Input: \$n = %s\n", $n;
+printf "Output: %s\n", $o;
+
+sub isSumsEqualN{
+ my($n,$ds) = @_;
+ for (@$ds) {
+ my $sum = eval(join(" + ", @$_));
+ if ($sum == $n){
+ return 1;
+ }
+ }
+ return 0;
+}
+sub cTree {
+ my($c,$n,$e,$res) = @_;
+ if ( @$c == $n || @$c + @$e == $n ) {
+ my @res = @{[@$c,@$e]}[0..$n-1];
+ if ($res) {
+ push @$res, \@res;
+ } else {
+ printf "%s\n", join(", ",@res);
+ }
+ } else {
+ {
+ my $ct = [@$c,@{$e}[0]];
+ shift @$e if @$e;
+ &cTree($ct,$n,[@$e],$res);
+ redo if @$ct + @$e > $n;
+ }
+ }
+ }
+sub getDivisors() {
+ my $n = shift;
+ my @d;
+ my $i;
+ {
+ $i++;
+ push @d, $i unless $n % $i;
+ redo if $i < int($n/2);
+ }
+ return @d;
+}