diff options
| author | Javier Luque <javier.luque@humanstate.com> | 2020-07-27 14:06:32 +0100 |
|---|---|---|
| committer | Javier Luque <javier.luque@humanstate.com> | 2020-07-27 14:06:32 +0100 |
| commit | 8cdb45d322878ff715c876dbf5e47330e79caeaa (patch) | |
| tree | 8aad514f96cc712fd36e0e4a4da3566f5f8a3c0c /challenge-071/javier-luque | |
| parent | 6b0fef6d35e61345ad5fd3f2ab5847c0afafc5ff (diff) | |
| download | perlweeklychallenge-club-8cdb45d322878ff715c876dbf5e47330e79caeaa.tar.gz perlweeklychallenge-club-8cdb45d322878ff715c876dbf5e47330e79caeaa.tar.bz2 perlweeklychallenge-club-8cdb45d322878ff715c876dbf5e47330e79caeaa.zip | |
Javier Luque solutions 71
Diffstat (limited to 'challenge-071/javier-luque')
| -rw-r--r-- | challenge-071/javier-luque/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-071/javier-luque/perl/ch-1.pl | 36 | ||||
| -rw-r--r-- | challenge-071/javier-luque/perl/ch-2.pl | 127 | ||||
| -rw-r--r-- | challenge-071/javier-luque/raku/ch-1.p6 | 32 | ||||
| -rw-r--r-- | challenge-071/javier-luque/raku/ch-2.p6 | 95 |
5 files changed, 291 insertions, 0 deletions
diff --git a/challenge-071/javier-luque/blog.txt b/challenge-071/javier-luque/blog.txt new file mode 100644 index 0000000000..9f879c1a27 --- /dev/null +++ b/challenge-071/javier-luque/blog.txt @@ -0,0 +1 @@ +https://perlchallenges.wordpress.com/2020/07/27/perl-weekly-challenge-071/ diff --git a/challenge-071/javier-luque/perl/ch-1.pl b/challenge-071/javier-luque/perl/ch-1.pl new file mode 100644 index 0000000000..20e53fd9e3 --- /dev/null +++ b/challenge-071/javier-luque/perl/ch-1.pl @@ -0,0 +1,36 @@ +#!/usr/bin/perl +# Test: ./ch-1.pl +use Modern::Perl; + +my $N = shift // 10; +die ("N needs to be greated than 1 ") + unless ($N > 1); + +# Store answers +my @values; +my @peaks; + +# Populate @values +for my $i (0 .. $N - 1) { + push @values, int rand(50); + + # Check left most peak + push @peaks, $values[$i - 1] + if ( $i == 1 && + $values[$i - 1] > $values[$i] ); + + # Check middle peaks + push @peaks, $values[$i - 1] + if ( $i > 1 && + $values[$i - 1] > $values[$i] && + $values[$i - 1] > $values[$i - 2]); + + # Check last peaks + push @peaks, $values[$i] + if ( $i == $N - 1 && + $values[$i] > $values[$i - 1]); +} + +# Output values +say 'Array: ' . '[' . (join ', ', @values) . ']'; +say 'Peak: ' . '[' . (join ', ', @peaks) . ']'; diff --git a/challenge-071/javier-luque/perl/ch-2.pl b/challenge-071/javier-luque/perl/ch-2.pl new file mode 100644 index 0000000000..ca0f6689c2 --- /dev/null +++ b/challenge-071/javier-luque/perl/ch-2.pl @@ -0,0 +1,127 @@ +#!/usr/bin/perl +# Test: ./ch-2.pl +package LinkedList::Node; # Linked list +use Mouse; + +has 'value' => ( + is => 'rw', + isa => 'Maybe[Int]', + default => sub { + return undef; + } +); + +has 'next' => ( + is => 'rw', + isa => 'Maybe[LinkedList::Node]', + default => sub { + return undef + } +); + +__PACKAGE__->meta->make_immutable(); + +package LinkedList; + +use Mouse; +use feature qw /say/; +use LinkedList::Node; + +has 'first' => ( + is => 'rw', + isa => 'Maybe[LinkedList::Node]', + default => sub { + return undef + } +); + +# Create the list +sub create_list { + my ($self, @values) = @_; + my $prev_node; + + # Populate the list + for my $value (@values) { + my $node = LinkedList::Node->new(value => $value); + + # Populate first and next nodes + ($prev_node) ? + $prev_node->next($node) : + $self->first($node); + + # Next + $prev_node = $node; + } +} + +sub remove_node { + my ($self, $n) = @_; + + # Loop through the nodes + my $node = $self->first; + + # find total nodes + my $total = 0; + while ($node) { + $node = $node->next; + $total++; + } + + # Get the real location + # relative to the first node + $n = ($n - 1) % $total; + $n = $total - $n - 1; + + # Initialize for node removal + my $i = 0; + my $last_node; + $node = $self->first; + + # Process each node + while ($node && $i <= $n) { + if ($i == $n) { + # First node + ($last_node) ? + $last_node->next($node->next) : + $self->first($node->next); + + # Next node + $node->next( ($node->next) ? $node->next->next : undef); + last; + } + + $last_node = $node; + $node = $node->next; + $i++; + } +} + +sub display_list { + my $self = shift; + + my $node = $self->first; + my @keys; + + while ($node) { + push @keys, $node->value; + $node = $node->next; + } + + return join ' → ', @keys; +} + +__PACKAGE__->meta->make_immutable(); + +package main; + +use Modern::Perl; +use LinkedList; + +# Create lists and remove node +for my $i (1..6) { + my $ll = LinkedList->new(); + $ll->create_list(1,2,3,4,5); + say 'When $N = ' . $i; + $ll->remove_node($i); + say 'Output: ' . $ll->display_list; +} diff --git a/challenge-071/javier-luque/raku/ch-1.p6 b/challenge-071/javier-luque/raku/ch-1.p6 new file mode 100644 index 0000000000..2f70cbcda0 --- /dev/null +++ b/challenge-071/javier-luque/raku/ch-1.p6 @@ -0,0 +1,32 @@ +# Test: perl6 ch-1.p6 +multi MAIN { MAIN(10) }; +multi MAIN(Int $N where $N > 1) { + # Store answers + my @values; + my @peaks; + + # Populate @values + for (0 .. $N - 1) -> $i { + @values.push(50.rand.Int); + + # Check left most peak + @peaks.push(@values[$i - 1]) + if ( $i == 1 && + @values[$i - 1] > @values[$i] ); + + # Check middle peaks + @peaks.push(@values[$i - 1]) + if ( $i > 1 && + @values[$i - 1] > @values[$i] && + @values[$i - 1] > @values[$i - 2]); + + # Check last peaks + @peaks.push(@values[$i - 1]) + if ( $i == $N - 1 && + @values[$i] > @values[$i - 1]); + } + + # Output values + say 'Array: ' ~ @values.perl; + say 'Peak: ' ~ @peaks.perl; +} diff --git a/challenge-071/javier-luque/raku/ch-2.p6 b/challenge-071/javier-luque/raku/ch-2.p6 new file mode 100644 index 0000000000..18f60c8e88 --- /dev/null +++ b/challenge-071/javier-luque/raku/ch-2.p6 @@ -0,0 +1,95 @@ +# Test: perl6 ch-2.p6 +class LinkedList::Node { + has Int $.value is rw; + has LinkedList::Node $.next is rw; +} + +class LinkedList { + has LinkedList::Node $.first is rw; + + # Create the list + method create-list(*@values) { + my $prev_node; + + # Populate the list + for @values -> $value { + my $node = LinkedList::Node.new(value => $value); + + # Populate first and next nodes + if ($prev_node) { + $prev_node.next = $node + } else { + self.first = $node; + } + + # Next node + $prev_node = $node; + } + } + + # Remove node + method remove-node(Int $n is copy) { + # Loop through the nodes + my $node = self.first; + + # find total nodes + my $total = 0; + while ($node) { + $node = $node.next; + $total++; + } + + # Get the real location + # relative to the first node + $n = ($n - 1) % $total; + $n = $total - $n - 1; + + # Initialize for node removal + my $i = 0; + my $last_node; + $node = self.first; + + # Process each node + while ($node && $i <= $n) { + if ($i == $n) { + # First node + if ($last_node) { + $last_node.next = $node.next + } else { + self.first = $node.next; + } + + # Next node + $node.next = ($node.next) ?? $node.next.next !! Nil; + last; + } + + $last_node = $node; + $node = $node.next; + $i++; + } + } + + method display-list { + my $node = self.first; + my @keys; + + while ($node) { + @keys.push($node.value); + $node = $node.next; + } + + return @keys.join(" → "); + } +} + + +sub MAIN() { + for (1..6) -> $i { + my $ll = LinkedList.new(); + $ll.create-list(1,2,3,4,5); + say 'When $N = ' ~ $i; + $ll.remove-node($i); + say 'After: ' ~ $ll.display-list; + } +} |
