diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-02-28 11:30:27 +0000 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-02-28 11:30:27 +0000 |
| commit | 4a0e7a230f9da4ca47237cf6323ff3fb07757889 (patch) | |
| tree | 11b28103eb4c8237f602b8ff1443db5814992e93 /challenge-049/javier-luque | |
| parent | fe605e08c124df72a5c90e37c2f661e3f65eef7c (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-049/javier-luque/perl/ch-1.pl | 20 | ||||
| -rw-r--r-- | challenge-049/javier-luque/perl/ch-2.pl | 197 | ||||
| -rw-r--r-- | challenge-049/javier-luque/raku/ch-1.p6 | 13 | ||||
| -rw-r--r-- | challenge-049/javier-luque/raku/ch-2.p6 | 116 |
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 +} |
