diff options
| author | Roger Bell_West <roger@firedrake.org> | 2020-02-24 11:14:18 +0000 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2020-02-24 11:14:18 +0000 |
| commit | 616e0343c827345b5afcefe862fc8887ad478dcf (patch) | |
| tree | 7b1529cf9e6ac9fa82e9c7a77fa7f6c7517f3e63 /challenge-049 | |
| parent | 5734596d7d7d0620a856b03ddd375aca18df1ab2 (diff) | |
| download | perlweeklychallenge-club-616e0343c827345b5afcefe862fc8887ad478dcf.tar.gz perlweeklychallenge-club-616e0343c827345b5afcefe862fc8887ad478dcf.tar.bz2 perlweeklychallenge-club-616e0343c827345b5afcefe862fc8887ad478dcf.zip | |
Solution for challenge #49.
Diffstat (limited to 'challenge-049')
| -rwxr-xr-x | challenge-049/roger-bell-west/perl5/ch-1.pl | 16 | ||||
| -rw-r--r-- | challenge-049/roger-bell-west/perl5/ch-2.pl | 57 | ||||
| -rwxr-xr-x | challenge-049/roger-bell-west/perl6/ch-1.p6 | 14 | ||||
| -rw-r--r-- | challenge-049/roger-bell-west/perl6/ch-2.p6 | 41 |
4 files changed, 128 insertions, 0 deletions
diff --git a/challenge-049/roger-bell-west/perl5/ch-1.pl b/challenge-049/roger-bell-west/perl5/ch-1.pl new file mode 100755 index 0000000000..ef8580eb83 --- /dev/null +++ b/challenge-049/roger-bell-west/perl5/ch-1.pl @@ -0,0 +1,16 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +foreach my $n (@ARGV) { + my $t=$n; + while (1) { + if ($t =~ /^[01]+$/) { + print "$t\n"; + last; + } else { + $t+=$n; + } + } +} diff --git a/challenge-049/roger-bell-west/perl5/ch-2.pl b/challenge-049/roger-bell-west/perl5/ch-2.pl new file mode 100644 index 0000000000..ae7df2d514 --- /dev/null +++ b/challenge-049/roger-bell-west/perl5/ch-2.pl @@ -0,0 +1,57 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +my $q=Local::LRU->new($ARGV[0] || 3); +$q->set(1,3); +$q->set(2,5); +$q->set(3,7); +print $q->get(2)," = 5\n"; +print $q->get(1)," = 3\n"; +print $q->get(4)," = -1\n"; +$q->set(4,9); +print $q->get(3)," = -1\n"; + +package Local::LRU; + +sub new { + my $class = shift; + my $self={}; + $self->{size}=shift || 3; + $self->{store}={}; + $self->{lru}=[]; + bless $self,$class; + return $self; +} + +sub set { + my $self=shift; + my $k=shift; + my $v=shift; + $self->{store}{$k}=$v; + $self->update_lru($k); + if (scalar @{$self->{lru}} > $self->{size}) { + delete $self->{store}{$self->{lru}[0]}; + shift @{$self->{lru}}; + } +} + +sub get { + my $self=shift; + my $k=shift; + if (exists $self->{store}{$k}) { + $self->update_lru($k); + return $self->{store}{$k}; + } else { + return -1; + } +} + +sub update_lru { + my $self=shift; + my $k=shift; + my @l=grep {$_ != $k} @{$self->{lru}}; + push @l,$k; + @{$self->{lru}}=@l; +} diff --git a/challenge-049/roger-bell-west/perl6/ch-1.p6 b/challenge-049/roger-bell-west/perl6/ch-1.p6 new file mode 100755 index 0000000000..16453539a4 --- /dev/null +++ b/challenge-049/roger-bell-west/perl6/ch-1.p6 @@ -0,0 +1,14 @@ +#! /usr/bin/perl6 + + +for @*ARGS -> $n { + my $t=$n; + while (1) { + if ($t ~~ /^<[01]>+$/) { + say $t; + last; + } else { + $t+=$n; + } + } +} diff --git a/challenge-049/roger-bell-west/perl6/ch-2.p6 b/challenge-049/roger-bell-west/perl6/ch-2.p6 new file mode 100644 index 0000000000..2e89a239c6 --- /dev/null +++ b/challenge-049/roger-bell-west/perl6/ch-2.p6 @@ -0,0 +1,41 @@ +#! /usr/bin/perl6 + +class LRU { + has Int $.size; + has %!store; + has @!lru; + + method set(Int $k, Int $v) { + %!store{$k}=$v; + self.update_lru($k); + if @!lru.elems > $.size { + %!store{@!lru[0]}:delete; + @!lru.shift; + } + } + + method get(Int $k) { + if %!store{$k}:exists { + self.update_lru($k); + return %!store{$k}; + } else { + return -1; + } + } + + method update_lru(Int $k) { + my @l=grep {$_ != $k}, @!lru; + @l.push($k); + @!lru=@l; + } +} + +my $q=LRU.new(size => (@*ARGS[0] or 3)); +$q.set(1,3); +$q.set(2,5); +$q.set(3,7); +print $q.get(2)," = 5\n"; +print $q.get(1)," = 3\n"; +print $q.get(4)," = -1\n"; +$q.set(4,9); +print $q.get(3)," = -1\n"; |
