aboutsummaryrefslogtreecommitdiff
path: root/challenge-059
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-059')
-rwxr-xr-xchallenge-059/dave-jacoby/perl/ch-1.1.pl114
1 files changed, 114 insertions, 0 deletions
diff --git a/challenge-059/dave-jacoby/perl/ch-1.1.pl b/challenge-059/dave-jacoby/perl/ch-1.1.pl
new file mode 100755
index 0000000000..73158774f8
--- /dev/null
+++ b/challenge-059/dave-jacoby/perl/ch-1.1.pl
@@ -0,0 +1,114 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use utf8;
+use feature qw{ postderef say signatures state switch };
+no warnings qw{ experimental };
+
+my $i;
+my $k = 3;
+my $head;
+my $above;
+my $below;
+
+# create a linked list!
+for my $i ( 1, 4, 3, 2, 5, 2 ) {
+ add_node( \$head, $i );
+}
+say 'BEFORE';
+display_list($head);
+say '';
+
+# undo first linked list, create before & after
+while ( defined $head ) {
+ my $node = pop_head( \$head );
+ my $l = $node->value;
+ if ( $l < $k ) { add_node( \$below, $l ) }
+ else { add_node( \$above, $l ) }
+}
+
+# combine below and above
+my $blast = get_last($below);
+$blast->next($above);
+
+say 'AFTER';
+display_list($below);
+say '';
+
+exit;
+
+sub pop_head ( $node ) {
+ my $h = $$node;
+ $$node = $$node->next;
+ return $h;
+}
+
+sub add_node ( $node, $i ) {
+ if ( defined $$node ) {
+ my $last = get_last($$node);
+ my $new = Node->new($i);
+ $last->next($new);
+ }
+ else {
+ my $new = Node->new($i);
+ $$node = $new;
+ }
+}
+
+sub get_last( $node ) {
+ return get_last( $node->next ) if $node->next;
+ return $node;
+}
+
+sub display_list( $node ) {
+ return if !defined $node;
+ print $node->value if $node;
+ if ( $node->next ) {
+ print ' -> ';
+ display_list( $node->next );
+ }
+ else { say '' }
+}
+
+######### ######### ######### ######### ######### ######### #########
+# The same old Node code, but instead of left and right,
+# it just has next
+
+package Node;
+
+sub new ( $class, $value = 0 ) {
+ my $self = {};
+ $self->{value} = $value;
+ $self->{next} = undef;
+ $self->{parent} = undef;
+ return bless $self, $class;
+}
+
+sub value ( $self ) {
+ return $self->{value};
+}
+
+sub is_root ( $self ) {
+ return defined $self->{parent} ? 0 : 1;
+}
+
+sub is_leaf ( $self ) {
+ return ( !defined $self->{left} && !defined $self->{right} )
+ ? 1
+ : 0;
+}
+
+sub next ( $self, $node = undef ) {
+ if ( defined $node ) {
+ $self->{next} = $node;
+ $node->{parent} = $self;
+ }
+ else {
+ return $self->{next};
+ }
+}
+
+sub parent ($self ) {
+ return $self->{parent};
+}