diff options
| -rw-r--r-- | challenge-068/javier-luque/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-068/javier-luque/perl/ch-1.pl | 74 | ||||
| -rw-r--r-- | challenge-068/javier-luque/perl/ch-2.pl | 113 | ||||
| -rw-r--r-- | challenge-068/javier-luque/raku/ch-1.p6 | 67 | ||||
| -rw-r--r-- | challenge-068/javier-luque/raku/ch-2.p6 | 80 |
5 files changed, 335 insertions, 0 deletions
diff --git a/challenge-068/javier-luque/blog.txt b/challenge-068/javier-luque/blog.txt new file mode 100644 index 0000000000..55c57f86bd --- /dev/null +++ b/challenge-068/javier-luque/blog.txt @@ -0,0 +1 @@ +https://perlchallenges.wordpress.com/2020/07/06/perl-weekly-challenge-068/ diff --git a/challenge-068/javier-luque/perl/ch-1.pl b/challenge-068/javier-luque/perl/ch-1.pl new file mode 100644 index 0000000000..99a5d4a3a1 --- /dev/null +++ b/challenge-068/javier-luque/perl/ch-1.pl @@ -0,0 +1,74 @@ +#!/usr/bin/perl +# Test: ./ch-1.pl +use Modern::Perl; +use Algorithm::Combinatorics qw(combinations); + +my $m1 = [ [1, 0, 1], + [1, 1, 1], + [1, 1, 1], ]; + +my $m2 = [ [1, 0, 1], + [1, 1, 1], + [1, 0, 1], ]; + +for my $m ($m1, $m2) { + say "Input:"; + print_matrix($m); + + say "Output:"; + print_matrix(zero($m)); +} + +# Zero our columns and rows +sub zero { + my $m = shift; + + # Lengths of the matrix + my $l1 = scalar(@$m); + my $l2 = scalar(@{$m->[0]}); + + # Initialize new matrix + my $m2 = []; + for (my $i = 0; $i < $l1; $i++) { + $m2->[$i] = []; + for (my $j = 0; $j < $l2; $j++) { + $m2->[$i][$j] = 1; + } + } + + # Process each element of the matrix + for (my $i = 0; $i < $l1; $i++) { + for (my $j = 0; $j < $l2; $j++) { + if ($m->[$i][$j] == 0) { + # zero our rows + $m2->[$i][$_] = 0 + for (0 .. $l2- 1 ); + + # zero our cols + $m2->[$_][$j] = 0 # + for (0 .. $l1 - 1) + } + } + } + + # Return new matrix + return $m2; +} + +# Print the matrix +sub print_matrix { + my $m = shift; + my $l1 = scalar(@$m); + my $l2 = scalar(@{$m->[0]}); + + # Process each element of the matrix + for (my $i = 0; $i < $l1; $i++) { + print '[ '; + for (my $j = 0; $j < $l2; $j++) { + printf ('%3s', $m->[$i][$j]); + } + say ' ]'; + } + + say ''; +} diff --git a/challenge-068/javier-luque/perl/ch-2.pl b/challenge-068/javier-luque/perl/ch-2.pl new file mode 100644 index 0000000000..8c3c771970 --- /dev/null +++ b/challenge-068/javier-luque/perl/ch-2.pl @@ -0,0 +1,113 @@ +#!/usr/bin/perl +# Test: ./ch-2.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 reorder_list { + my ($self, $k) = @_; + + # Loop through the nodes + my $node = $self->first; + + # Process each node + while ($node) { + my $next_node = $node->next; + my $traverse_node = $node; + my $last_node = $node; + + # Traverse Linked list + while ($traverse_node->next) { + $last_node = $traverse_node; + $traverse_node = $traverse_node->next; + } + + $node->next($traverse_node); + + if ($next_node && $next_node->next) { + $traverse_node->next($next_node); + $last_node->next(undef); + } else { + $traverse_node->next(undef); + } + + $node = $next_node; + } +} + +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 Modern::Perl; +use LinkedList; + +my $ll = LinkedList->new(); +$ll->create_list(1,2,3,4); +say 'Before: ' . $ll->display_list; +$ll->reorder_list(); +say 'After: ' . $ll->display_list; diff --git a/challenge-068/javier-luque/raku/ch-1.p6 b/challenge-068/javier-luque/raku/ch-1.p6 new file mode 100644 index 0000000000..c55841ef52 --- /dev/null +++ b/challenge-068/javier-luque/raku/ch-1.p6 @@ -0,0 +1,67 @@ +# Test: perl6 ch-1.p6 +sub MAIN() { + my @m1 = [ [1, 0, 1], + [1, 1, 1], + [1, 1, 1], ]; + + my @m2 = [ [1, 0, 1], + [1, 1, 1], + [1, 0, 1], ]; + + for (@m1, @m2) -> $m { + say "Input:"; + print-matrix($m); + + say "Output:"; + print-matrix(zero($m)); + } +} + +# Zero our columns and rows +sub zero(@m) { + # Initialize new matrix + my $m2 = []; + for (^@m) -> $i { + $m2.[$i] = []; + for (^@m.[0]) -> $j { + $m2.[$i][$j] = 1; + } + } + + # Process each element of the matrix + for (^@m) -> $i { + for (^@m.[0]) -> $j { + if (@m.[$i][$j] == 0) { + # zero our rows + for (^@m) -> $k { + $m2.[$k][$j] = 0; + } + + # zero out cols + for (^@m.[0]) -> $k { + $m2.[$i][$k] = 0; + } + } + } + } + + # Return new matrix + return $m2; +} + +# Print the matrix +sub print-matrix(@m) { + my $l1 = @m.elems; + my $l2 = @m.[0].elems; + + # Process each element of the matrix + for (^@m) -> $i { + print '[ '; + for (^@m.[0]) -> $j { + '%3s'.printf(@m.[$i][$j].perl); + } + say ' ]'; + } + + say ''; +} diff --git a/challenge-068/javier-luque/raku/ch-2.p6 b/challenge-068/javier-luque/raku/ch-2.p6 new file mode 100644 index 0000000000..49d77e573b --- /dev/null +++ b/challenge-068/javier-luque/raku/ch-2.p6 @@ -0,0 +1,80 @@ +# Test: perl6 ch-2.p6 +class LinkedList::Node { + has Int $.value is rw; + has LinkedList::Node $.next is rw; +} + +class LinkedList { + has LinkedList::Node $.first is rw; + + # Create the list + method create-list(*@values) { + my $prev_node; + + # Populate the list + for @values -> $value { + my $node = LinkedList::Node.new(value => $value); + + # Populate first and next nodes + if ($prev_node) { + $prev_node.next = $node + } else { + self.first = $node; + } + + # Next node + $prev_node = $node; + } + } + + method reorder-list(Int $k) { + # Loop through the nodes + my $node = self.first; + + # Process each node + while ($node) { + my $next_node = $node.next; + my $traverse_node = $node; + my $last_node = $node; + + # Traverse Linked list + while ($traverse_node.next) { + $last_node = $traverse_node; + $traverse_node = $traverse_node.next; + } + + # Move the nodes around + $node.next = $traverse_node; + if ($next_node && $next_node.next) { + $traverse_node.next = $next_node; + $last_node.next = Nil; + } else { + $traverse_node.next = Nil; + } + + # Next node + $node = $next_node; + } + } + + method display-list { + my $node = self.first; + my @keys; + + while ($node) { + @keys.push($node.value); + $node = $node.next; + } + + return @keys.join(" → "); + } +} + + +sub MAIN() { + my $ll = LinkedList.new(); + $ll.create-list(1,2,3,4); + say 'Before: ' ~ $ll.display-list; + $ll.reorder-list(3); + say 'After: ' ~ $ll.display-list; +} |
