aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-094/james-smith/perl/LL.pm24
-rw-r--r--challenge-094/james-smith/perl/Tree.pm14
-rw-r--r--challenge-094/james-smith/perl/ch-2.pl1
3 files changed, 38 insertions, 1 deletions
diff --git a/challenge-094/james-smith/perl/LL.pm b/challenge-094/james-smith/perl/LL.pm
new file mode 100644
index 0000000000..fa6e26fd62
--- /dev/null
+++ b/challenge-094/james-smith/perl/LL.pm
@@ -0,0 +1,24 @@
+package LL;
+
+sub new {
+ my $class = shift;
+ my $self = { 'val' => shift, 'next' => undef };
+ $self->{'last'} = $self;
+ bless $self, $class;
+}
+
+sub add {
+ my( $self, $val ) =@_;
+ my $new = LL->new( $val );
+ $self->{'last'}{'next'} = $new;
+ $self->{'last'} = $new;
+ return $self;
+}
+
+sub flatten {
+ my $self = shift;
+ return $self->{'val'} unless $self->{'next'};
+ return ( $self->{'val'}, $self->{'next'}->flatten );
+}
+
+1;
diff --git a/challenge-094/james-smith/perl/Tree.pm b/challenge-094/james-smith/perl/Tree.pm
index 76a6e6a917..a84c759388 100644
--- a/challenge-094/james-smith/perl/Tree.pm
+++ b/challenge-094/james-smith/perl/Tree.pm
@@ -1,5 +1,5 @@
package Tree;
-
+use LL;
sub new {
my $class = shift;
my $value = shift;
@@ -13,6 +13,18 @@ sub add_child {
return $self;
}
+sub to_ll {
+ my( $self, $ll ) = @_;
+ my ($v,@sub) = @{$self};
+ unless( $ll ) {
+ $ll = LL->new( $v );
+ } else {
+ $ll->add( $v );
+ }
+ $_->to_ll($ll) foreach @sub;
+ return $ll;
+}
+
sub flatten {
my $self = shift;
my ($v,@sub) = @{$self};
diff --git a/challenge-094/james-smith/perl/ch-2.pl b/challenge-094/james-smith/perl/ch-2.pl
index 66f3b0e821..d5743f6ef5 100644
--- a/challenge-094/james-smith/perl/ch-2.pl
+++ b/challenge-094/james-smith/perl/ch-2.pl
@@ -22,6 +22,7 @@ my $x = Tree->new(1)->add_child(
Tree->new(3)
);
is( (join ' -> ', $x->flatten ), '1 -> 2 -> 4 -> 5 -> 6 -> 7 -> 3' );
+is( (join ' -> ', $x->to_ll->flatten ), '1 -> 2 -> 4 -> 5 -> 6 -> 7 -> 3' );
done_testing();