aboutsummaryrefslogtreecommitdiff
path: root/challenge-049/javier-luque
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-02-28 11:30:27 +0000
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-02-28 11:30:27 +0000
commit4a0e7a230f9da4ca47237cf6323ff3fb07757889 (patch)
tree11b28103eb4c8237f602b8ff1443db5814992e93 /challenge-049/javier-luque
parentfe605e08c124df72a5c90e37c2f661e3f65eef7c (diff)
downloadperlweeklychallenge-club-4a0e7a230f9da4ca47237cf6323ff3fb07757889.tar.gz
perlweeklychallenge-club-4a0e7a230f9da4ca47237cf6323ff3fb07757889.tar.bz2
perlweeklychallenge-club-4a0e7a230f9da4ca47237cf6323ff3fb07757889.zip
- Added solutions by Javier Luque.
Diffstat (limited to 'challenge-049/javier-luque')
-rw-r--r--challenge-049/javier-luque/blog.txt1
-rw-r--r--challenge-049/javier-luque/perl/ch-1.pl20
-rw-r--r--challenge-049/javier-luque/perl/ch-2.pl197
-rw-r--r--challenge-049/javier-luque/raku/ch-1.p613
-rw-r--r--challenge-049/javier-luque/raku/ch-2.p6116
5 files changed, 347 insertions, 0 deletions
diff --git a/challenge-049/javier-luque/blog.txt b/challenge-049/javier-luque/blog.txt
new file mode 100644
index 0000000000..5715fb6b7b
--- /dev/null
+++ b/challenge-049/javier-luque/blog.txt
@@ -0,0 +1 @@
+https://perlchallenges.wordpress.com/2020/02/28/perl-weekly-challenge-049/
diff --git a/challenge-049/javier-luque/perl/ch-1.pl b/challenge-049/javier-luque/perl/ch-1.pl
new file mode 100644
index 0000000000..4f98ad3ec4
--- /dev/null
+++ b/challenge-049/javier-luque/perl/ch-1.pl
@@ -0,0 +1,20 @@
+#!/usr/bin/perl
+# Test: ./ch-1.pl 55
+use strict;
+use warnings;
+use feature qw /say/;
+
+my $number = join '', @ARGV;
+
+unless ($number =~ /^\d*$/) {
+ say "Argument: $number needs to be a number";
+ exit;
+}
+
+my $i = 1;
+my $new_number = $number;
+while (!($new_number =~ /^[01]+$/)) {
+ $new_number = $number * $i++;
+}
+
+say "Smallest multiple of $number is $new_number";
diff --git a/challenge-049/javier-luque/perl/ch-2.pl b/challenge-049/javier-luque/perl/ch-2.pl
new file mode 100644
index 0000000000..ffb1c7ede1
--- /dev/null
+++ b/challenge-049/javier-luque/perl/ch-2.pl
@@ -0,0 +1,197 @@
+#!/usr/bin/perl
+# Test: ./ch-2.pl 3
+package LL::Node; # Linked list
+
+use Mouse;
+
+has 'key' => (
+ is => 'rw',
+ isa => 'Int',
+ default => sub {
+ return undef;
+ }
+);
+
+has 'value' => (
+ is => 'rw',
+ isa => 'Str',
+ default => sub {
+ return undef;
+ }
+);
+
+has 'next' => (
+ is => 'rw',
+ isa => 'Maybe[LL::Node]',
+ default => sub {
+ return undef
+ }
+);
+
+has 'prev' => (
+ is => 'rw',
+ isa => 'Maybe[LL::Node]',
+ default => sub {
+ return undef
+ }
+);
+
+
+__PACKAGE__->meta->make_immutable();
+
+package Cache::LRU; # LRU Cache
+
+use Mouse;
+use feature qw /say/;
+use LL::Node;
+
+has 'max_capacity' => (
+ is => 'rw',
+ isa => 'Int',
+ default => sub {
+ return 3;
+ }
+);
+
+has 'capacity' => (
+ is => 'rw',
+ isa => 'Int',
+ default => sub {
+ return 0;
+ }
+);
+
+has 'positions' => (
+ is => 'rw',
+ isa => 'HashRef',
+ default => sub {
+ return {}
+ }
+);
+
+has 'last' => (
+ is => 'rw',
+ isa => 'Ref',
+);
+
+
+has 'first' => (
+ is => 'rw',
+ isa => 'Ref',
+);
+
+
+
+sub set {
+ my ($self, $key, $value) = @_;
+
+ # New node
+ my $new_node = LL::Node->new(
+ key => $key, value => $value
+ );
+
+ # Push out 1 if at capacity
+ if ($self->capacity >= $self->max_capacity) {
+ my $node_to_kill = $self->first;
+ $self->first($self->first->next);
+ delete $self->positions->{$node_to_kill->key};
+ $self->capacity($self->capacity - 1);
+ }
+
+ # Set the first and last reference to the new node
+ if ( $self->first ) {
+ $self->last->next($new_node);
+ $new_node->prev($self->last);
+ } else {
+ $self->first($new_node);
+ }
+
+ # Last node
+ $self->last($new_node);
+
+ # Store the position
+ $self->positions->{$key} = $new_node;
+
+ # Increment capacity
+ $self->capacity($self->capacity + 1);
+
+ say "Setting: ($key, $value)" . $self->show_nodes;
+}
+
+
+sub get {
+ my ($self, $key) = @_;
+
+ my $node = $self->positions->{$key};
+
+ # Cache miss
+ unless ($node) {
+ say "Getting: ($key) - cache miss" .
+ $self->show_nodes;
+
+ # Return the cache miss -1
+ return -1;
+ }
+
+ # This might be the first node
+ if ($node->prev) {
+ $node->prev->next($node->next)
+ } else {
+ $self->first($node->next);
+ }
+
+ # Change this node previous to last
+ $node->prev($self->last);
+
+ # Set the last's next to this node
+ $self->last->next($node);
+
+ # clear the node's next as it will be last
+ $node->next(undef);
+
+ # Set to LRU last pointer to this
+ $self->last($node);
+
+ # Get the value
+ my $value = $node->value;
+
+ say "Getting: ($key) Value: $value)" . $self->show_nodes;
+ return $node->value;
+}
+
+
+
+sub show_nodes {
+ my $self = shift;
+ my @keys;
+
+ my $node = $self->first;
+
+ while ($node) {
+ push @keys, $node->key;
+ $node = $node->next;
+ }
+
+ return " [LRU] - " . (join ',', @keys) . " - [MRU]";
+}
+
+
+__PACKAGE__->meta->make_immutable();
+
+package main;
+
+use strict;
+use warnings;
+use Cache::LRU;
+
+my $max_capacity = my $number = join '', @ARGV;
+my $cache = Cache::LRU->new(max_capacity => $max_capacity || 3);
+
+$cache->set(1, 3);
+$cache->set(2, 5);
+$cache->set(3, 7);
+$cache->get(2); # returns 5
+$cache->get(1); # returns 3
+$cache->get(4); # returns -1
+$cache->set(4, 9);
+$cache->get(3); # returns -1
diff --git a/challenge-049/javier-luque/raku/ch-1.p6 b/challenge-049/javier-luque/raku/ch-1.p6
new file mode 100644
index 0000000000..8c16f51e26
--- /dev/null
+++ b/challenge-049/javier-luque/raku/ch-1.p6
@@ -0,0 +1,13 @@
+# Test: perl6 ch-1.p6 55
+
+sub MAIN(Int $number) {
+ my $i = 1;
+
+ my $new_number = $number;
+ while (!($new_number ~~ /^^<[01]>+$$/)) {
+ $new_number = $number * $i++;
+ }
+
+ say "Smallest multiple of $number is $new_number";
+
+}
diff --git a/challenge-049/javier-luque/raku/ch-2.p6 b/challenge-049/javier-luque/raku/ch-2.p6
new file mode 100644
index 0000000000..55ebdc183f
--- /dev/null
+++ b/challenge-049/javier-luque/raku/ch-2.p6
@@ -0,0 +1,116 @@
+# Test: perl6 ch-2.p6 3
+use v6.d;
+
+class Node {
+ has Int $.key is rw;
+ has Int $.value is rw;
+ has Node $.next is rw;
+ has Node $.prev is rw;
+}
+
+class LRU {
+ has Node $.first is rw;
+ has Node $.last is rw;
+ has %.positions is rw;
+ has Int $.max_capacity is rw;
+ has Int $.capacity is rw = 0;
+
+ method set(Int $key, Int $value) {
+ my $new_node = Node.new(
+ key => $key,
+ value => $value,
+ next => Nil,
+ prev => Nil
+ );
+
+ # Push out 1 if at capacity
+ if (self.capacity >= self.max_capacity) {
+ my $node-to-kill = self.first;
+ self.first = self.first.next;
+ self.positions.{$node-to-kill.key}:delete;
+ self.capacity = self.capacity - 1;
+ }
+
+ # Set the first and last reference to the new node
+ if ( self.first ) {
+ self.last.next = $new_node;
+ $new_node.prev = self.last;
+ } else {
+ self.first = $new_node;
+ }
+
+ # Last node
+ self.last = $new_node;
+
+ # Store the position
+ self.positions.{$key} = $new_node;
+
+ # Increment capacity
+ self.capacity = self.capacity + 1;
+
+ say "Setting: ($key, $value)" ~ self.show_nodes;
+ }
+
+ method get(Int $key) {
+ my $node = self.positions.{$key};
+
+ # Cache miss
+ unless ($node) {
+ say "Getting: ($key) - cache miss" ~
+ self.show_nodes;
+
+ # Return the cache miss -1
+ return -1;
+ }
+
+ # This might be the first node
+ if ($node.prev) {
+ $node.prev.next = $node.next;
+ } else {
+ self.first = $node.next;
+ }
+
+ # Change this node previous to last
+ $node.prev = self.last;
+
+ # Set the last's next to this node
+ self.last.next = $node;
+
+ # clear the node's next as it will be last
+ $node.next = Nil;
+
+ # Set to LRU last pointer to this
+ self.last = $node;
+
+ # Get the value
+ my $value = $node.value;
+
+ say "Getting: ($key) Value: $value)" ~
+ self.show_nodes;
+ return $node.value;
+ }
+
+ method show_nodes() {
+ my @keys;
+ my $node = self.first;
+
+ while ($node) {
+ push @keys, $node.key;
+ $node = $node.next;
+ }
+
+ return " [LRU] - " ~ @keys.join(',') ~ " - [MRU]";
+ }
+}
+
+sub MAIN (Int $max_capacity) {
+ my $cache = LRU.new( max_capacity => $max_capacity );
+ $cache.set(1, 3);
+ $cache.set(2, 5);
+ $cache.set(3, 7);
+ $cache.get(2); # returns 5
+ $cache.get(1); # returns 3
+ $cache.get(4); # returns -1
+ $cache.set(4, 9);
+ $cache.get(3); # returns -1
+}