diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-05-04 09:19:12 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-05-04 09:19:12 +0100 |
| commit | 856f56ef0cfd271b4c82090f140f65ce163ea709 (patch) | |
| tree | 280fc1f6579071a15739cbb15541d4999992106d /challenge-059/javier-luque/perl | |
| parent | 67cdd35efcf8c026c738ede53dcf8662282fbe29 (diff) | |
| download | perlweeklychallenge-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.pl | 141 | ||||
| -rw-r--r-- | challenge-059/javier-luque/perl/ch-2.pl | 32 |
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; +} |
