diff options
| author | Dave Jacoby <jacoby.david@gmail.com> | 2021-09-06 18:07:40 -0400 |
|---|---|---|
| committer | Dave Jacoby <jacoby.david@gmail.com> | 2021-09-06 18:07:40 -0400 |
| commit | 1d3051ceaf6cd0e9ecd577506530d09928e26493 (patch) | |
| tree | 9693683db76be10d9e529da26c01962fd719227f /challenge-129 | |
| parent | 6ee7e9d0a9b5f5b7bbe928a118a52d65b04e59e9 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-129/dave-jacoby/perl/ch-1.pl | 130 | ||||
| -rw-r--r-- | challenge-129/dave-jacoby/perl/ch-2.pl | 144 |
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}; +} |
