diff options
| author | Luis Mochan <mochan@fis.unam.mx> | 2021-05-22 18:27:59 -0500 |
|---|---|---|
| committer | Luis Mochan <mochan@fis.unam.mx> | 2021-05-22 18:27:59 -0500 |
| commit | aeb8b9d9ae6edc3fda69089dcc79040df46caae8 (patch) | |
| tree | 21a1138d3568e92ed44d08ad48bd15ceb7373a78 | |
| parent | 1720995a5127b6d99fad5334b6ba8983c06693b2 (diff) | |
| download | perlweeklychallenge-club-aeb8b9d9ae6edc3fda69089dcc79040df46caae8.tar.gz perlweeklychallenge-club-aeb8b9d9ae6edc3fda69089dcc79040df46caae8.tar.bz2 perlweeklychallenge-club-aeb8b9d9ae6edc3fda69089dcc79040df46caae8.zip | |
Solutions to pwc 113
| -rw-r--r-- | challenge-113/wlmb/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-113/wlmb/perl/ch-1.pl | 33 | ||||
| -rwxr-xr-x | challenge-113/wlmb/perl/ch-2.pl | 37 |
3 files changed, 71 insertions, 0 deletions
diff --git a/challenge-113/wlmb/blog.txt b/challenge-113/wlmb/blog.txt new file mode 100644 index 0000000000..3fc9997009 --- /dev/null +++ b/challenge-113/wlmb/blog.txt @@ -0,0 +1 @@ +https://wlmb.github.io/2021/05/22/PWC113/ diff --git a/challenge-113/wlmb/perl/ch-1.pl b/challenge-113/wlmb/perl/ch-1.pl new file mode 100755 index 0000000000..ee570a3e52 --- /dev/null +++ b/challenge-113/wlmb/perl/ch-1.pl @@ -0,0 +1,33 @@ +#!/usr/bin/env perl +# Perl weekly challenge 113 +# Task 1: Represent integer. +# +# See https://wlmb.github.io/2021/05/22/PWC113/#task-1-represent-integer +use strict; +use warnings; +use v5.12; +use List::Util qw(sum0); +use POSIX qw(floor); + +my ($N, $D)=@ARGV; #get arguments from command line. + die "Usage: ./ch-1.pl positive-integer digit" + unless defined $N and defined $D and $N>=0 and $D=~m/^\d$/ and $N==floor $N; +my $next=subsets(grep {m/$D/} (1..$N)); +while(my @subset=$next->()){ + say("Inputs: N=$N D=$D: Output: 1 as $N=", join "+", @subset), exit + if sum0(@subset)==$N; +} +say "Inputs: N=$N D=$D: Output: 0"; + +sub subsets { + my @set=@_; + my $subset_counter=2**@set; # Total number of subsets + my $done=0; + sub { + return () if $done; + --$subset_counter; + $done=1, return () unless $subset_counter; + my @subset=grep {defined $_} map {$subset_counter&(1<<$_)?$set[$_]:undef} 0..@set-1; + return @subset; + } +} diff --git a/challenge-113/wlmb/perl/ch-2.pl b/challenge-113/wlmb/perl/ch-2.pl new file mode 100755 index 0000000000..1c5cfba7fb --- /dev/null +++ b/challenge-113/wlmb/perl/ch-2.pl @@ -0,0 +1,37 @@ +#!/usr/bin/env perl +# Perl weekly challenge 113 +# Task 2: Recreate binary tree. +# +# See https://wlmb.github.io/2021/05/22/PWC113/#task-2-recreate-binary-tree +use strict; +use warnings; +use v5.12; +use List::Util qw(sum0); + +while(my $tree_string=shift @ARGV){ + say "Input: $tree_string"; + die "Suspicious tree $tree_string" unless $tree_string=~m{^[][,\-+\d\.\se]*$}; + my $tree=eval $tree_string; + die "Bad expression: @!" if @!; + say "Output: ", stringify_tree(subtract_tree($tree, sum_tree($tree))); +} + +sub sum_tree { #sum and do some rough validation + my $node=shift; + die "Wrong format" unless ref($node) eq "ARRAY"; + return 0 if @$node==0; + return $node->[0]+sum0 map {sum_tree($node->[$_])} (1,2) if @$node==3; + die "Wrong format"; +} + +sub subtract_tree { + my ($node, $from)=@_; + return [] if @$node==0; + return [$from-$node->[0], map {subtract_tree($node->[$_], $from)} (1,2)]; +} + +sub stringify_tree { + my $node=shift; + return "[]" if @$node==0; + return sprintf("[%s,%s,%s]", $node->[0], map {stringify_tree($node->[$_])} (1,2)); +} |
