aboutsummaryrefslogtreecommitdiff
path: root/challenge-059/javier-luque/perl
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-05-04 09:19:12 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-05-04 09:19:12 +0100
commit856f56ef0cfd271b4c82090f140f65ce163ea709 (patch)
tree280fc1f6579071a15739cbb15541d4999992106d /challenge-059/javier-luque/perl
parent67cdd35efcf8c026c738ede53dcf8662282fbe29 (diff)
downloadperlweeklychallenge-club-856f56ef0cfd271b4c82090f140f65ce163ea709.tar.gz
perlweeklychallenge-club-856f56ef0cfd271b4c82090f140f65ce163ea709.tar.bz2
perlweeklychallenge-club-856f56ef0cfd271b4c82090f140f65ce163ea709.zip
- Added solutions by Javier Luque.
Diffstat (limited to 'challenge-059/javier-luque/perl')
-rw-r--r--challenge-059/javier-luque/perl/ch-1.pl141
-rw-r--r--challenge-059/javier-luque/perl/ch-2.pl32
2 files changed, 173 insertions, 0 deletions
diff --git a/challenge-059/javier-luque/perl/ch-1.pl b/challenge-059/javier-luque/perl/ch-1.pl
new file mode 100644
index 0000000000..0672fdac2a
--- /dev/null
+++ b/challenge-059/javier-luque/perl/ch-1.pl
@@ -0,0 +1,141 @@
+#!/usr/bin/perl
+# Test: ./ch-1.pl
+package LinkedList::Node; # Linked list
+use Mouse;
+
+has 'value' => (
+ is => 'rw',
+ isa => 'Maybe[Int]',
+ default => sub {
+ return undef;
+ }
+);
+
+has 'next' => (
+ is => 'rw',
+ isa => 'Maybe[LinkedList::Node]',
+ default => sub {
+ return undef
+ }
+);
+
+__PACKAGE__->meta->make_immutable();
+
+package LinkedList;
+
+use Mouse;
+use feature qw /say/;
+use LinkedList::Node;
+
+has 'first' => (
+ is => 'rw',
+ isa => 'Maybe[LinkedList::Node]',
+ default => sub {
+ return undef
+ }
+);
+
+# Create the list
+sub create_list {
+ my ($self, @values) = @_;
+ my $prev_node;
+
+ # Populate the list
+ for my $value (@values) {
+ my $node = LinkedList::Node->new(value => $value);
+
+ # Populate first and next nodes
+ ($prev_node) ?
+ $prev_node->next($node) :
+ $self->first($node);
+
+ # Next
+ $prev_node = $node;
+ }
+}
+
+sub partition_list {
+ my ($self, $k) = @_;
+
+ # Temp variables to store node locations
+ my $k_node_current;
+ my $k_node_first;
+ my $before_node_current;
+ my $before_node_first;
+ my $after_node_current;
+ my $after_node_first;
+
+ # Loop through the nodes
+ my $node = $self->first;
+ while ($node) {
+ if ($node->value == $k) {
+ if ($k_node_current) {
+ $k_node_current->next($node);
+ $k_node_current = $node;
+ } else {
+ $k_node_first = $node;
+ $k_node_current = $node;
+ }
+ }
+
+ # Process the nodex lower than k
+ if ($node->value < $k) {
+ if ($before_node_current) {
+ $before_node_current->next($node);
+ $before_node_current = $node;
+ } else {
+ $before_node_first = $node;
+ $before_node_current = $node;
+ }
+ }
+
+ # Process the nodex higher than k
+ if ($node->value > $k) {
+ if ($after_node_current) {
+ $after_node_current->next($node);
+ $after_node_current = $node;
+ } else {
+ $after_node_first = $node;
+ $after_node_current = $node;
+ }
+ }
+
+ $node = $node->next;
+ }
+
+ # link the chains
+ $self->first($before_node_first);
+ $before_node_current->next($k_node_first);
+ $k_node_current->next($after_node_first);
+ $after_node_current->next(undef);
+}
+
+sub display_list {
+ my $self = shift;
+
+ my $node = $self->first;
+ my @keys;
+
+ while ($node) {
+ push @keys, $node->value;
+ $node = $node->next;
+ }
+
+ return join ' → ', @keys;
+}
+
+__PACKAGE__->meta->make_immutable();
+
+package main;
+
+use strict;
+use warnings;
+use LinkedList;
+
+my $ll = LinkedList->new();
+$ll->create_list(1,4,3,2,5,2);
+say 'Before: ' . $ll->display_list;
+$ll->partition_list(3);
+say 'After: ' . $ll->display_list;
+
+
diff --git a/challenge-059/javier-luque/perl/ch-2.pl b/challenge-059/javier-luque/perl/ch-2.pl
new file mode 100644
index 0000000000..c7ea428308
--- /dev/null
+++ b/challenge-059/javier-luque/perl/ch-2.pl
@@ -0,0 +1,32 @@
+#!/usr/bin/perl
+# Test: ./ch-2.pl 2 3 4
+
+use strict;
+use warnings;
+use feature qw /say/;
+use Algorithm::Combinatorics qw /combinations/;
+
+my $answer = 0;
+
+my $combinations = combinations(\@ARGV, 2);
+while (my $v = $combinations->next) {
+ $answer += f(@$v);
+}
+
+say $answer;
+
+sub f {
+ return calculate_true_bits(int(shift) ^ int(shift));
+}
+
+# Calculate the number of true bits
+sub calculate_true_bits {
+ my $number = shift;
+ my $count = 0;
+
+ do {
+ $count++ if ($number & 1);
+ } while ($number = $number >> 1);
+
+ return $count;
+}