aboutsummaryrefslogtreecommitdiff
path: root/challenge-071/javier-luque
diff options
context:
space:
mode:
authorJavier Luque <javier.luque@humanstate.com>2020-07-27 14:06:32 +0100
committerJavier Luque <javier.luque@humanstate.com>2020-07-27 14:06:32 +0100
commit8cdb45d322878ff715c876dbf5e47330e79caeaa (patch)
tree8aad514f96cc712fd36e0e4a4da3566f5f8a3c0c /challenge-071/javier-luque
parent6b0fef6d35e61345ad5fd3f2ab5847c0afafc5ff (diff)
downloadperlweeklychallenge-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.txt1
-rw-r--r--challenge-071/javier-luque/perl/ch-1.pl36
-rw-r--r--challenge-071/javier-luque/perl/ch-2.pl127
-rw-r--r--challenge-071/javier-luque/raku/ch-1.p632
-rw-r--r--challenge-071/javier-luque/raku/ch-2.p695
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;
+ }
+}