aboutsummaryrefslogtreecommitdiff
path: root/challenge-129
diff options
context:
space:
mode:
authorDave Jacoby <jacoby.david@gmail.com>2021-09-06 18:07:40 -0400
committerDave Jacoby <jacoby.david@gmail.com>2021-09-06 18:07:40 -0400
commit1d3051ceaf6cd0e9ecd577506530d09928e26493 (patch)
tree9693683db76be10d9e529da26c01962fd719227f /challenge-129
parent6ee7e9d0a9b5f5b7bbe928a118a52d65b04e59e9 (diff)
downloadperlweeklychallenge-club-1d3051ceaf6cd0e9ecd577506530d09928e26493.tar.gz
perlweeklychallenge-club-1d3051ceaf6cd0e9ecd577506530d09928e26493.tar.bz2
perlweeklychallenge-club-1d3051ceaf6cd0e9ecd577506530d09928e26493.zip
Node Twice in one Challenge!
Diffstat (limited to 'challenge-129')
-rw-r--r--challenge-129/dave-jacoby/blog.txt1
-rw-r--r--challenge-129/dave-jacoby/perl/ch-1.pl130
-rw-r--r--challenge-129/dave-jacoby/perl/ch-2.pl144
3 files changed, 275 insertions, 0 deletions
diff --git a/challenge-129/dave-jacoby/blog.txt b/challenge-129/dave-jacoby/blog.txt
new file mode 100644
index 0000000000..e41cbce3ce
--- /dev/null
+++ b/challenge-129/dave-jacoby/blog.txt
@@ -0,0 +1 @@
+https://jacoby.github.io/2021/09/06/list-aint-nothin-but-tree-misspelled-the-perl-weekly-challenge-129.html
diff --git a/challenge-129/dave-jacoby/perl/ch-1.pl b/challenge-129/dave-jacoby/perl/ch-1.pl
new file mode 100644
index 0000000000..c93c827e40
--- /dev/null
+++ b/challenge-129/dave-jacoby/perl/ch-1.pl
@@ -0,0 +1,130 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature qw{ say postderef signatures };
+no warnings qw{ experimental };
+
+# Planting the first tree
+my %nodes;
+for my $n ( 1 .. 6 ) {
+ my $node = Node->new($n);
+ $nodes{$n} = $node;
+}
+$nodes{1}->left( $nodes{2} );
+$nodes{1}->right( $nodes{3} );
+$nodes{3}->right( $nodes{4} );
+$nodes{4}->left( $nodes{5} );
+$nodes{4}->right( $nodes{6} );
+
+say uc 'tree 1';
+for my $n ( 1 .. 6 ) {
+ my $d = root_distanced( \%nodes, $n );
+ say qq{ Node: $n};
+ say qq{ Distance: $d};
+ say '';
+}
+
+# Planting the second tree
+%nodes = ();
+for my $n ( 1 .. 9 ) {
+ my $node = Node->new($n);
+ $nodes{$n} = $node;
+}
+$nodes{1}->left( $nodes{2} );
+$nodes{1}->right( $nodes{3} );
+$nodes{2}->left( $nodes{4} );
+$nodes{3}->right( $nodes{5} );
+$nodes{4}->right( $nodes{6} );
+$nodes{5}->left( $nodes{7} );
+$nodes{6}->right( $nodes{8} );
+$nodes{6}->right( $nodes{9} );
+
+say uc 'tree 2';
+for my $n ( 1 .. 9 ) {
+ my $d = root_distanced( \%nodes, $n );
+ say qq{ Node: $n};
+ say qq{ Distance: $d};
+ say '';
+}
+
+exit;
+
+# it's fairly simple. If the node is not the root,
+# we travel up (down?) the tree until we find the root.
+sub root_distanced ( $nodes, $n ) {
+ my $d = 0;
+ my $node = $nodes->{$n};
+ while ( !$node->is_root() ) {
+ $d++;
+ $node = $node->parent();
+ }
+ return $d;
+}
+
+# OF COURSE I pull out my Node code!
+
+package Node;
+
+sub new ( $class, $value = 0 ) {
+ my $self = {};
+ $self->{value} = $value;
+ $self->{left} = undef;
+ $self->{right} = undef;
+ $self->{horizontal} = undef;
+ $self->{parent} = undef;
+ return bless $self, $class;
+}
+
+sub value ( $self, $value = undef ) {
+ if ( defined $value ) {
+ $self->{value} = $value;
+ }
+ else {
+ 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 left ( $self, $node = undef ) {
+ if ( defined $node ) {
+ $self->{left} = $node;
+ $node->{parent} = $self;
+ }
+ else {
+ return $self->{left};
+ }
+}
+
+sub right ( $self, $node = undef ) {
+ if ( defined $node ) {
+ $self->{right} = $node;
+ $node->{parent} = $self;
+ }
+ else {
+ return $self->{right};
+ }
+}
+
+sub horizontal ( $self, $node = undef ) {
+ if ( defined $node ) {
+ $self->{horizontal} = $node;
+ $node->{parent} = $self;
+ }
+ else {
+ return $self->{horizontal};
+ }
+}
+
+sub parent ($self ) {
+ return $self->{parent};
+}
diff --git a/challenge-129/dave-jacoby/perl/ch-2.pl b/challenge-129/dave-jacoby/perl/ch-2.pl
new file mode 100644
index 0000000000..aa016c5aeb
--- /dev/null
+++ b/challenge-129/dave-jacoby/perl/ch-2.pl
@@ -0,0 +1,144 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature qw{ say postderef signatures };
+no warnings qw{ experimental };
+
+use JSON;
+my $json = JSON->new;
+
+my @examples;
+push @examples, [ [ 1, 2, 3 ], [ 3, 2, 1 ], ];
+push @examples, [ [ 1, 2, 3, 4, 5 ], [ 6, 5, 5 ], ];
+
+for my $e (@examples) {
+ my ( $l1, $l2 ) = $e->@*;
+ my $ll1 = create_linked_list($l1);
+ my $ll2 = create_linked_list($l2);
+ my $added = add_linked_lists( $ll1, $ll2 );
+ print 'L1: ';
+ print_list($ll1);
+ print 'L2: ';
+ print_list($ll2);
+ print 'Output: ';
+ print_list($added);
+ say '';
+}
+
+sub add_linked_lists ( $ll1, $ll2 ) {
+ my $root;
+ my $remainder = 0;
+ while ( defined $ll1 ) {
+ my $v1;
+ my $v2;
+ if ( defined $ll1 ) {
+ $v1 = $ll1->value();
+ $ll1 = $ll1->right();
+ }
+ else { $v1 = 0; }
+
+ if ( defined $ll2 ) {
+ $v2 = $ll2->value();
+ $ll2 = $ll2->right();
+ }
+ else { $v2 = 0; }
+
+ my $vv = $v1 + $v2 + $remainder;
+ my $v = $vv % 10;
+ $remainder = int( $vv / 10 );
+
+ my $node = Node->new($v);
+ $node->right($root);
+ $root = $node;
+
+ }
+ return $root;
+}
+
+sub create_linked_list( $ref ) {
+ my $root;
+ for my $v ( $ref->@* ) {
+ my $node = Node->new($v);
+ $node->right($root);
+ $root = $node;
+ }
+ return $root;
+}
+
+sub print_list ( $node ) {
+ print '>> ';
+ while ( defined $node ) {
+ print $node->value();
+ print ' -> ' if defined $node->right();
+ $node = $node->right();
+ }
+ say ' <<';
+}
+
+# if we ignore left() and parent(), Node works as a singly-linked list
+
+package Node;
+
+sub new ( $class, $value = 0 ) {
+ my $self = {};
+ $self->{value} = $value;
+ $self->{left} = undef;
+ $self->{right} = undef;
+ $self->{horizontal} = undef;
+ $self->{parent} = undef;
+ return bless $self, $class;
+}
+
+sub value ( $self, $value = undef ) {
+ if ( defined $value ) {
+ $self->{value} = $value;
+ }
+ else {
+ 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 left ( $self, $node = undef ) {
+ if ( defined $node ) {
+ $self->{left} = $node;
+ $node->{parent} = $self;
+ }
+ else {
+ return $self->{left};
+ }
+}
+
+sub right ( $self, $node = undef ) {
+ if ( defined $node ) {
+ $self->{right} = $node;
+ $node->{parent} = $self;
+ }
+ else {
+ return $self->{right};
+ }
+}
+
+sub horizontal ( $self, $node = undef ) {
+ if ( defined $node ) {
+ $self->{horizontal} = $node;
+ $node->{parent} = $self;
+ }
+ else {
+ return $self->{horizontal};
+ }
+}
+
+sub parent ($self ) {
+ return $self->{parent};
+}