aboutsummaryrefslogtreecommitdiff
path: root/challenge-059/javier-luque
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-05-05 10:38:34 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-05-05 10:38:34 +0100
commit6cc990ac20b40b91b48dc9ba1383415de5413c5b (patch)
treee201e5f91df3ce118624954c8f038aa41f98c419 /challenge-059/javier-luque
parent7c98c3f14235a3a3e7753e77828b8e98cbd26301 (diff)
downloadperlweeklychallenge-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.pl84
-rw-r--r--challenge-059/javier-luque/raku/ch-1.p686
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;
}