diff options
| author | Roger Bell_West <roger@firedrake.org> | 2019-12-16 15:03:28 +0000 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2019-12-16 15:03:28 +0000 |
| commit | cfc5b6e8331b4a823b7aebbc89c54690e2267e86 (patch) | |
| tree | 44c02d26d8da566de12cae386e7e8112795eca2f /challenge-039 | |
| parent | a9ed4a36080d914afd2e2c6cf7da53c05d3a8bfc (diff) | |
| download | perlweeklychallenge-club-cfc5b6e8331b4a823b7aebbc89c54690e2267e86.tar.gz perlweeklychallenge-club-cfc5b6e8331b4a823b7aebbc89c54690e2267e86.tar.bz2 perlweeklychallenge-club-cfc5b6e8331b4a823b7aebbc89c54690e2267e86.zip | |
Solutions for challenge #39
Diffstat (limited to 'challenge-039')
| -rw-r--r-- | challenge-039/roger-bell-west/data1 | 9 | ||||
| -rwxr-xr-x | challenge-039/roger-bell-west/perl5/ch-1.pl | 32 | ||||
| -rwxr-xr-x | challenge-039/roger-bell-west/perl5/ch-2.pl | 64 | ||||
| -rwxr-xr-x | challenge-039/roger-bell-west/perl6/ch-1.p6 | 29 | ||||
| -rwxr-xr-x | challenge-039/roger-bell-west/perl6/ch-2.p6 | 61 |
5 files changed, 195 insertions, 0 deletions
diff --git a/challenge-039/roger-bell-west/data1 b/challenge-039/roger-bell-west/data1 new file mode 100644 index 0000000000..a2467461cd --- /dev/null +++ b/challenge-039/roger-bell-west/data1 @@ -0,0 +1,9 @@ +1) Alex IN: 09:10 OUT: 09:45 +2) Arnold IN: 09:15 OUT: 09:33 +3) Bob IN: 09:22 OUT: 09:55 +4) Charlie IN: 09:25 OUT: 10:05 +5) Steve IN: 09:33 OUT: 10:01 +6) Roger IN: 09:44 OUT: 10:12 +7) David IN: 09:57 OUT: 10:23 +8) Neil IN: 10:01 OUT: 10:19 +9) Chris IN: 10:10 OUT: 11:00 diff --git a/challenge-039/roger-bell-west/perl5/ch-1.pl b/challenge-039/roger-bell-west/perl5/ch-1.pl new file mode 100755 index 0000000000..1e3b668e8b --- /dev/null +++ b/challenge-039/roger-bell-west/perl5/ch-1.pl @@ -0,0 +1,32 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +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; + } +} + +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"; diff --git a/challenge-039/roger-bell-west/perl5/ch-2.pl b/challenge-039/roger-bell-west/perl5/ch-2.pl new file mode 100755 index 0000000000..133f0b7fc6 --- /dev/null +++ b/challenge-039/roger-bell-west/perl5/ch-2.pl @@ -0,0 +1,64 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +my @stack=(); + +my %op=( + add => \&add, + '+' => \&add, + sub => \&sub, + '-' => \&sub, + mul => \&mul, + '*' => \&mul, + div => \&div, + '/' => \&div, + neg => \&neg, + dup => \&dup, + pop => \&pop, + exch => \&exch, + ); + +foreach my $p (@ARGV) { + if (exists $op{$p}) { + $op{$p}->(); + } elsif ($p =~ /^[.0-9]+$/) { + push @stack,$p; + } else { + die "Unknown input $p\n"; + } + print join(' ',@stack),"\n"; +} + +sub add { + push @stack,(pop @stack) + (pop @stack); +} + +sub sub { + push @stack,-((pop @stack) - (pop @stack)); +} + +sub mul { + push @stack,(pop @stack) * (pop @stack); +} + +sub div { + push @stack,1/((pop @stack) / (pop @stack)); +} + +sub neg { + push @stack,-(pop @stack); +} + +sub dup { + push @stack,$stack[-1]; +} + +sub pop { + pop @stack; +} + +sub exch { + ($stack[-1],$stack[-2])=($stack[-2],$stack[-1]); +} diff --git a/challenge-039/roger-bell-west/perl6/ch-1.p6 b/challenge-039/roger-bell-west/perl6/ch-1.p6 new file mode 100755 index 0000000000..3b868cba27 --- /dev/null +++ b/challenge-039/roger-bell-west/perl6/ch-1.p6 @@ -0,0 +1,29 @@ +#! /usr/bin/perl6 + +my %ev; + +my $fh=open :r,'data1'; +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; + } +} + +my $ontime=0; +my $occ=0; +my $laston=0; +for (%ev.keys.sort({$^a <=> $^b})) -> $t { + my $lastocc=$occ; + $occ+=%ev{$t}; + if ($lastocc==0 && $occ>0) { + $laston=$t; + } elsif ($lastocc>0 && $occ==0) { + $ontime+=($t-$laston); + } +} + +say $ontime; diff --git a/challenge-039/roger-bell-west/perl6/ch-2.p6 b/challenge-039/roger-bell-west/perl6/ch-2.p6 new file mode 100755 index 0000000000..ab7252072d --- /dev/null +++ b/challenge-039/roger-bell-west/perl6/ch-2.p6 @@ -0,0 +1,61 @@ +#! /usr/bin/perl6 + +my @stack=(); + +my %op=( + add => &add, + '+' => &add, + sub => &sub, + '-' => &sub, + mul => &mul, + '*' => &mul, + div => &div, + '/' => &div, + neg => &neg, + dup => &dup, + pop => &pop, + exch => &exch, + ); + +for @*ARGS -> $p { + if (%op{$p}:exists) { + %op{$p}.(); + } elsif ($p ~~ /^<[.0..9]>+$/) { + push @stack,$p; + } else { + die "Unknown input $p\n"; + } + say join(' ',@stack); +} + +sub add { + push @stack,(@stack.pop) + (@stack.pop); +} + +sub sub { + push @stack,-((@stack.pop) - (@stack.pop)); +} + +sub mul { + push @stack,(@stack.pop) * (@stack.pop); +} + +sub div { + push @stack,1/((@stack.pop) / (@stack.pop)); +} + +sub neg { + push @stack,-(@stack.pop); +} + +sub dup { + push @stack,@stack[* -1]; +} + +sub pop { + @stack.pop; +} + +sub exch { + (@stack[* -1],@stack[* -2])=(@stack[* -2],@stack[* -1]); +} |
