aboutsummaryrefslogtreecommitdiff
path: root/challenge-129
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-09-12 17:13:18 +0100
committerGitHub <noreply@github.com>2021-09-12 17:13:18 +0100
commit2abfb7ece74d6e9394c17236975ea8ee8c61979f (patch)
tree82678718e3317ad16644519efc312c6686ca7f63 /challenge-129
parent6c2817552dc91a488943ffcff319d7f86c02f1d3 (diff)
parent8f5c8b7a740bec607bd8c983bb14ed0177708132 (diff)
downloadperlweeklychallenge-club-2abfb7ece74d6e9394c17236975ea8ee8c61979f.tar.gz
perlweeklychallenge-club-2abfb7ece74d6e9394c17236975ea8ee8c61979f.tar.bz2
perlweeklychallenge-club-2abfb7ece74d6e9394c17236975ea8ee8c61979f.zip
Merge pull request #4862 from simongreen-net/swg-129
sgreen solution to challenge 129
Diffstat (limited to 'challenge-129')
-rw-r--r--challenge-129/sgreen/README.md4
-rw-r--r--challenge-129/sgreen/blog.txt1
-rwxr-xr-xchallenge-129/sgreen/perl/ch-2.pl140
3 files changed, 143 insertions, 2 deletions
diff --git a/challenge-129/sgreen/README.md b/challenge-129/sgreen/README.md
index 93e51b94d6..3df072430d 100644
--- a/challenge-129/sgreen/README.md
+++ b/challenge-129/sgreen/README.md
@@ -1,3 +1,3 @@
-# The Weekly Challenge 128
+# The Weekly Challenge 129
-Solution by Simon Green. [Blog](https://dev.to/simongreennet/weekly-challenge-128-1ng1)
+Solution by Simon Green. [Blog](https://dev.to/simongreennet/weekly-challenge-129-33kn)
diff --git a/challenge-129/sgreen/blog.txt b/challenge-129/sgreen/blog.txt
new file mode 100644
index 0000000000..d47db0d4d6
--- /dev/null
+++ b/challenge-129/sgreen/blog.txt
@@ -0,0 +1 @@
+https://dev.to/simongreennet/weekly-challenge-129-33kn
diff --git a/challenge-129/sgreen/perl/ch-2.pl b/challenge-129/sgreen/perl/ch-2.pl
new file mode 100755
index 0000000000..8a6dca0a35
--- /dev/null
+++ b/challenge-129/sgreen/perl/ch-2.pl
@@ -0,0 +1,140 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+package LinkedList;
+
+use overload '+' => \&_add, '""' => \&as_string;
+
+sub new {
+ my ( $class, @values ) = @_;
+ my $self = { _list => [] };
+ bless $self, $class;
+
+ # Add any supplied values
+ $self->push(@values);
+
+ return $self;
+}
+
+sub push {
+ my ( $self, @values ) = @_;
+ foreach my $value (@values) {
+ # Create a new node.
+ my $new_node = LinkedList::Node->new($value);
+
+ # Link the last element and the new one
+ if ( scalar( @{ $self->{_list} } ) ) {
+ my $other_node = $self->{_list}[-1];
+ $new_node->set_prev($other_node);
+ $other_node->set_next($new_node);
+ }
+
+ push @{ $self->{_list} }, $new_node;
+ }
+}
+
+sub unshift {
+ my ( $self, @values ) = @_;
+ foreach my $value (@values) {
+ # Create a new node.
+ my $new_node = LinkedList::Node->new($value);
+
+ # Link the first element and the new one
+ if ( scalar( @{ $self->{_list} } ) ) {
+ my $other_node = $self->{_list}[0];
+ $new_node->set_next($other_node);
+ $other_node->set_prev($new_node);
+ }
+
+ unshift @{ $self->{_list} }, $new_node;
+ }
+}
+
+sub first {
+ my $self = shift;
+ return $self->{_list}[0];
+}
+
+sub last {
+ my $self = shift;
+ return $self->{_list}[-1];
+}
+
+sub as_string {
+ my $self = shift;
+ return join ' -> ', map { $_->value } @{ $self->{_list} };
+}
+
+sub _add {
+ # Overloaded '+' function, to add two linked lists together
+ my ( $first, $second ) = @_;
+ my $new_list = LinkedList->new();
+
+ my $first_node = $first->last;
+ my $second_node = $second->last;
+
+ my $carry = 0;
+
+ while ( $first_node or defined $second_node or $carry ) {
+ my $sum =
+ ( defined $first_node ? $first_node->value : 0 ) +
+ ( defined $second_node ? $second_node->value : 0 ) +
+ $carry;
+ $new_list->unshift( $sum % 10 );
+ $carry = int( $sum / 10 );
+
+ $first_node = $first_node->prev if defined $first_node;
+ $second_node = $second_node->prev if defined $second_node;
+ }
+
+ return $new_list;
+}
+
+package LinkedList::Node;
+
+sub new {
+ my ( $class, $value ) = @_;
+ my $self = { _value => $value, _last => undef, _prev => undef };
+ bless $self, $class;
+}
+
+sub value {
+ return $_[0]->{_value};
+}
+
+sub prev {
+ return $_[0]->{_prev};
+}
+
+sub next {
+ return $_[0]->{_next};
+}
+
+sub set_prev {
+ $_[0]->{_prev} = $_[1];
+}
+
+sub set_next {
+ $_[0]->{_next} = $_[1];
+}
+
+package main;
+
+sub main {
+ # Get all the digits in each value
+ my @list1 = ( shift =~ /(\d)/g );
+ my @list2 = ( shift =~ /(\d)/g );
+
+ # Turn them into a linked list
+ my $list1 = LinkedList->new(@list1);
+ my $list2 = LinkedList->new(@list2);
+
+ # ... and display the sum
+ my $sum = $list1 + $list2;
+ say $sum;
+}
+
+main(@ARGV);