aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2021-06-28 16:37:22 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2021-06-28 16:37:22 +0100
commite7724dde7e85cd0a93a356d51faa81dd7fe4a1d2 (patch)
tree37477673491758865f937768456a9c11f5ea5af9
parent561cfd6874e907d66324828a13b6a0f3394907ac (diff)
parent54e52ea8c1bad1f38ed61c20028293b423610451 (diff)
downloadperlweeklychallenge-club-e7724dde7e85cd0a93a356d51faa81dd7fe4a1d2.tar.gz
perlweeklychallenge-club-e7724dde7e85cd0a93a356d51faa81dd7fe4a1d2.tar.bz2
perlweeklychallenge-club-e7724dde7e85cd0a93a356d51faa81dd7fe4a1d2.zip
Merge branch 'master' of https://github.com/manwar/perlweeklychallenge-club
-rw-r--r--challenge-118/polettix/perl/ch-2.pl68
1 files changed, 0 insertions, 68 deletions
diff --git a/challenge-118/polettix/perl/ch-2.pl b/challenge-118/polettix/perl/ch-2.pl
index d079d7d3a4..aa4a6c1b2d 100644
--- a/challenge-118/polettix/perl/ch-2.pl
+++ b/challenge-118/polettix/perl/ch-2.pl
@@ -218,71 +218,3 @@ sub permutations_iterator {
return;
}
}
-
-package PriorityQueue; # Adapted from https://algs4.cs.princeton.edu/24pq/
-use strict;
-
-sub contains { return $_[0]->contains_id($_[0]{id_of}->($_[1])) }
-sub contains_id { return exists $_[0]{item_of}{$_[1]} }
-sub is_empty { return !$#{$_[0]{items}} }
-sub item_of { exists($_[0]{item_of}{$_[1]}) ? $_[0]{item_of}{$_[1]} : () }
-sub new; # see below
-sub dequeue { return $_[0]->_remove_kth(1) }
-sub enqueue; # see below
-sub remove { return $_[0]->remove_id($_[0]{id_of}->($_[1])) }
-sub remove_id { return $_[0]->_remove_kth($_[0]{pos_of}{$_[1]}) }
-sub size { return $#{$_[0]{items}} }
-sub top { return $_[0]->size ? $_[0]{items}[1] : () }
-sub top_id { return $_[0]->size ? $_[0]{id_of}->($_[0]{items}[1]) : () }
-
-sub new {
- my $package = shift;
- my $self = bless {((@_ && ref($_[0])) ? %{$_[0]} : @_)}, $package;
- $self->{before} ||= sub { return $_[0] < $_[1] };
- $self->{id_of} ||= sub { return ref($_[0]) ? "$_[0]" : $_[0] };
- my $items = $self->{items} || [];
- @{$self}{qw< items pos_of item_of >} = (['-'], {}, {});
- $self->enqueue($_) for @$items;
- return $self;
-} ## end sub new
-
-sub enqueue { # insert + update in one... DWIM
- my ($is, $id) = ($_[0]{items}, $_[0]{id_of}->($_[1]));
- $_[0]{item_of}{$id} = $_[1]; # keep track of this item
- my $k = $_[0]{pos_of}{$id} ||= do { push @$is, $_[1]; $#$is };
- $_[0]->_adjust($k);
- return $id;
-} ## end sub enqueue
-
-sub _adjust { # assumption: $k <= $#$is
- my ($is, $before, $self, $k) = (@{$_[0]}{qw< items before >}, @_);
- $k = $self->_swap(int($k / 2), $k)
- while ($k > 1) && $before->($is->[$k], $is->[$k / 2]);
- while ((my $j = $k * 2) <= $#$is) {
- ++$j if ($j < $#$is) && $before->($is->[$j + 1], $is->[$j]);
- last if $before->($is->[$k], $is->[$j]); # parent is OK
- $k = $self->_swap($j, $k);
- }
- return $self;
-} ## end sub _adjust
-
-sub _remove_kth {
- my ($is, $self, $k) = ($_[0]{items}, @_);
- die 'no such item' if (!defined $k) || ($k <= 0) || ($k > $#$is);
- $self->_swap($k, $#$is);
- my $r = CORE::pop @$is;
- $self->_adjust($k) if $k <= $#$is; # no adjust for last element
- my $id = $self->{id_of}->($r);
- delete $self->{$_}{$id} for qw< item_of pos_of >;
- return $r;
-} ## end sub _remove_kth
-
-sub _swap {
- my ($self, $i, $j) = @_;
- my ($items, $pos_of, $id_of) = @{$self}{qw< items pos_of id_of >};
- my ($I, $J) = @{$items}[$i, $j] = @{$items}[$j, $i];
- @{$pos_of}{($id_of->($I), $id_of->($J))} = ($i, $j);
- return $i;
-} ## end sub _swap
-
-1;