I’ve been doing the Perl Weekly
Challenges. Last
week's
was about parsing a specific file format.
This is very straightforward stuff: read the file and generate a
list of events from it.
my %ev;
open I,'<','data1';
while (<I>) {
chomp;
my @e=$_ =~ /(IN|OUT): (\d+):(\d+)/g;
while (@e) {
my $delta=(shift @e eq 'IN')?1:-1;
my $t=(60*shift @e)+shift @e;
$ev{$t}+=$delta;
}
}
Replay the events in time order (we're tracking total occupancy of a
building), and calculate for how long that occupancy was greater than
zero. The example data were so simple that one could do this by casual
inspection anyway, but it seems polite to solve for the general case.
my $ontime=0;
my $occ=0;
my $laston=0;
foreach my $t (sort {$a <=> $b} keys %ev) {
my $lastocc=$occ;
$occ+=$ev{$t};
if ($lastocc==0 && $occ>0) {
$laston=$t;
} elsif ($lastocc>0 && $occ==0) {
$ontime+=($t-$laston);
}
}
print "$ontime\n";
Perl6 makes this more complicated by returning Match
objects but is
otherwise very similar.
for $fh.lines {
my @e=($_ ~~ m:g/(IN|OUT) ':' \s* (\d+) ':' (\d+)/);
while (@e) {
my @match=@e.shift.values;
my $delta=(@match.shift eq 'IN')??1!!-1;
my $t=(60*@match.shift)+@match.shift;
%ev{$t}+=$delta;
}
}
And part 2… was to demonstrate Reverse Polish Notation, which I'd
already written as an example for challenge 34 ("demonstrate a
dispatch table").
Comments on this post are now closed. If you have particular grounds for adding a late comment, comment on a more recent post quoting the URL of this one.