aboutsummaryrefslogtreecommitdiff
path: root/challenge-059
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-05-08 12:51:46 +0100
committerGitHub <noreply@github.com>2020-05-08 12:51:46 +0100
commit46e991a1ea1054329eadf4d95eac9be04c4c7800 (patch)
tree1497ec6907c9613179d948ecafde23e47fe34d4c /challenge-059
parent3c50fe703dd17a6f2d945fe2e51ac40ef9d2c507 (diff)
parentf08bd246f0e8653d4eeb9a085ee1c9381e688b89 (diff)
downloadperlweeklychallenge-club-46e991a1ea1054329eadf4d95eac9be04c4c7800.tar.gz
perlweeklychallenge-club-46e991a1ea1054329eadf4d95eac9be04c4c7800.tar.bz2
perlweeklychallenge-club-46e991a1ea1054329eadf4d95eac9be04c4c7800.zip
Merge pull request #1684 from sangeetkar/ch59
Added solution to the weekly challenge 059
Diffstat (limited to 'challenge-059')
-rw-r--r--challenge-059/sangeet-kar/perl/Listy.pm47
-rw-r--r--challenge-059/sangeet-kar/perl/ch-1.pl47
-rw-r--r--challenge-059/sangeet-kar/perl/ch-2.pl16
3 files changed, 110 insertions, 0 deletions
diff --git a/challenge-059/sangeet-kar/perl/Listy.pm b/challenge-059/sangeet-kar/perl/Listy.pm
new file mode 100644
index 0000000000..eeb08c4d61
--- /dev/null
+++ b/challenge-059/sangeet-kar/perl/Listy.pm
@@ -0,0 +1,47 @@
+use strict;
+use warnings;
+use experimental qw(signatures);
+
+#List node class
+package Node;
+
+sub new ($class, $val, $next_node=undef) {
+ bless {val => $val, next_node => $next_node}, $class;
+}
+
+#LinkedList class
+package Listy;
+
+sub new ($class, $list) {
+ my $head = my $last = undef;
+
+ for (@$list) {
+ my $node = Node->new ($_);
+ if (defined $last) {
+ $last->{next_node} = $node;
+ $last = $node;
+ }
+ else {
+ $head = $last = $node;
+ }
+ }
+ bless {head => $head, last1 => $last}, $class
+}
+
+sub is_empty ($self) {
+ not defined $self->{head};
+}
+
+sub print_list ($self) {
+ if ($self->is_empty) {
+ print "empty";
+ }
+ else {
+ for (my $i = $self->{head}; defined $i; $i = $i->{next_node}) {
+ print $i->{val};
+ print "->" unless $i == $self->{last1};
+ }
+ }
+}
+
+1; \ No newline at end of file
diff --git a/challenge-059/sangeet-kar/perl/ch-1.pl b/challenge-059/sangeet-kar/perl/ch-1.pl
new file mode 100644
index 0000000000..31586ff9ec
--- /dev/null
+++ b/challenge-059/sangeet-kar/perl/ch-1.pl
@@ -0,0 +1,47 @@
+use strict;
+use warnings;
+use File::Basename;
+use lib dirname (__FILE__);
+use experimental qw(signatures);
+
+use Listy;
+
+sub find_parent ($lst, $node, $start_node=undef) {
+ $start_node //= $lst->{head};
+ return $start_node if $start_node == $node;
+
+ $start_node = $start_node->{next_node} while $start_node->{next_node} != $node;
+ return $start_node;
+}
+
+sub shift_list ($lst, $i, $j) {
+ my $parent_i = find_parent $lst, $i;
+ my $parent_j = find_parent $lst, $j, $i;
+
+ $parent_j->{next_node} = $j->{next_node};
+ $lst->{last1} = $parent_j if $j == $lst->{last1};
+ $j->{next_node} = $i;
+ if ($parent_i == $i) {
+ $lst->{head} = $j;
+ }
+ else {
+ $parent_i->{next_node} = $j;
+ }
+}
+
+sub partition_list {
+ my ($lst, $k) = @_;
+ my $i = $lst->{head};
+ $i = $i->{next_node} if defined $i && $i->{val} < $k;
+ return $lst unless defined $i;
+
+ while (1) {
+ my $j = $i->{next_node};
+ $j = $j->{next_node} while defined $j && $j->{val} >= $k;
+ return $lst unless defined $j;
+ shift_list($lst, $i, $j);
+ }
+}
+
+my $lst = Listy->new ([1, 4, 3, 2, 5, 2]);
+partition_list ($lst, 3) -> print_list;
diff --git a/challenge-059/sangeet-kar/perl/ch-2.pl b/challenge-059/sangeet-kar/perl/ch-2.pl
new file mode 100644
index 0000000000..44af4aa8aa
--- /dev/null
+++ b/challenge-059/sangeet-kar/perl/ch-2.pl
@@ -0,0 +1,16 @@
+use 5.30.0;
+use warnings;
+
+use List::Util qw(sum);
+use Algorithm::Combinatorics qw(combinations);
+
+sub helper {
+ my ( $a, $b ) = @_;
+ sum( split //, sprintf( "%b", $a ) ^ sprintf( "%b", $b ) );
+}
+
+sub bitsum {
+ sum map {helper @$_} combinations \@ARGV, 2
+}
+
+print bitsum;