diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-05-05 10:38:34 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-05-05 10:38:34 +0100 |
| commit | 6cc990ac20b40b91b48dc9ba1383415de5413c5b (patch) | |
| tree | e201e5f91df3ce118624954c8f038aa41f98c419 /challenge-059/javier-luque | |
| parent | 7c98c3f14235a3a3e7753e77828b8e98cbd26301 (diff) | |
| download | perlweeklychallenge-club-6cc990ac20b40b91b48dc9ba1383415de5413c5b.tar.gz perlweeklychallenge-club-6cc990ac20b40b91b48dc9ba1383415de5413c5b.tar.bz2 perlweeklychallenge-club-6cc990ac20b40b91b48dc9ba1383415de5413c5b.zip | |
- Updated solutions by Javier Luque.
Diffstat (limited to 'challenge-059/javier-luque')
| -rw-r--r-- | challenge-059/javier-luque/perl/ch-1.pl | 84 | ||||
| -rw-r--r-- | challenge-059/javier-luque/raku/ch-1.p6 | 86 |
2 files changed, 82 insertions, 88 deletions
diff --git a/challenge-059/javier-luque/perl/ch-1.pl b/challenge-059/javier-luque/perl/ch-1.pl index 0672fdac2a..3bc8fb057d 100644 --- a/challenge-059/javier-luque/perl/ch-1.pl +++ b/challenge-059/javier-luque/perl/ch-1.pl @@ -57,57 +57,49 @@ sub create_list { 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; - } - } + my $passed_k = 0; + my $prev_node; + my $k_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; - } - } + while ($node) { + my $next_node = $node->next; + my $moved_node = 0; - # 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; + if ($node->value < $k && $passed_k) { + my $traverse_node = $self->first; + while ($traverse_node->next->value < $node->value) { + $traverse_node = $traverse_node->next; } + $prev_node->next($node->next); + $node->next($traverse_node->next); + $traverse_node->next($node); + $moved_node = 1; } - $node = $node->next; + # Other k's + if ($node->value == $k && $passed_k) { + my $temp = $k_node->next; + $prev_node->next($node->next); + $k_node->next($node); + $node->next($temp); + $moved_node = 1; + }; + + # First k encountered + if ($node->value == $k && !$passed_k) { + $passed_k = 1; + $k_node = $node; + }; + + # The prev node pointer only changes if we + # didn't move the node + $prev_node = $node unless ($moved_node); + + # Next node + $node = $next_node; } - - # 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 { @@ -138,4 +130,8 @@ say 'Before: ' . $ll->display_list; $ll->partition_list(3); say 'After: ' . $ll->display_list; - +say "\nDuplicate k's"; +$ll->create_list(1,4,3,2,5,2,3); +say 'Before: ' . $ll->display_list; +$ll->partition_list(3); +say 'After: ' . $ll->display_list; diff --git a/challenge-059/javier-luque/raku/ch-1.p6 b/challenge-059/javier-luque/raku/ch-1.p6 index ca4849b3a3..1a4843f812 100644 --- a/challenge-059/javier-luque/raku/ch-1.p6 +++ b/challenge-059/javier-luque/raku/ch-1.p6 @@ -27,58 +27,50 @@ class LinkedList { } } - method partition_list(Int $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; - + method partition-list(Int $k) { # Loop through the nodes my $node = self.first; + my $passed_k = False; + my $prev_node; + my $k_node; + 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; - } - } + my $next_node = $node.next; + my $moved_node = False; - # 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; + if ($node.value < $k && $passed_k) { + my $traverse_node = self.first; + while ($traverse_node.next.value < $node.value) { + $traverse_node = $traverse_node.next; } + $prev_node.next = $node.next; + $node.next = $traverse_node.next; + $traverse_node.next = $node; + $moved_node = True; } - # 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; - } - } + # Other k's + if ($node.value == $k && $passed_k) { + my $temp = $k_node.next; + $prev_node.next = $node.next; + $k_node.next = $node; + $node.next = $temp; + $moved_node = True; + }; + + # First k encountered + if ($node.value == $k && !$passed_k) { + $passed_k = 1; + $k_node = $node; + }; + + # The prev node pointer only changes if we + # didn't move the node + $prev_node = $node unless ($moved_node); - $node = $node.next; + # Next node + $node = $next_node; } - - # 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 = Nil; } method display-list { @@ -99,6 +91,12 @@ sub MAIN() { my $ll = LinkedList.new(); $ll.create-list(1,4,3,2,5,2); say 'Before: ' ~ $ll.display-list; - $ll.partition_list(3); + $ll.partition-list(3); + say 'After: ' ~ $ll.display-list; + + say "\nDuplicate k's"; + $ll.create-list(1,4,3,2,5,2,3); + say 'Before: ' ~ $ll.display-list; + $ll.partition-list(3); say 'After: ' ~ $ll.display-list; } |
