day8
This commit is contained in:
parent
dd409d663f
commit
3643356cf0
55
2018/08/lib/Entry.pm
Normal file
55
2018/08/lib/Entry.pm
Normal file
@ -0,0 +1,55 @@
|
||||
package Entry;
|
||||
|
||||
use Moose;
|
||||
|
||||
use experimental qw/ signatures postderef /;
|
||||
|
||||
use List::AllUtils qw/ sum /;
|
||||
|
||||
has stream => (
|
||||
is => 'ro',
|
||||
required => 1,
|
||||
traits => [ 'Array' ],
|
||||
handles => {
|
||||
splice => 'splice',
|
||||
},
|
||||
trigger => sub($self,$stream) {
|
||||
my( $nchild, $ndata ) = splice @$stream, 0, 2;
|
||||
$self->children([
|
||||
map { Entry->new( stream => $stream ) } 1..$nchild
|
||||
]);
|
||||
$self->data([ splice @$stream, 0, $ndata ]);
|
||||
}
|
||||
);
|
||||
|
||||
has children => (
|
||||
is => 'rw',
|
||||
default => sub { [] },
|
||||
);
|
||||
|
||||
has data => (
|
||||
is => 'rw',
|
||||
default => sub { [] },
|
||||
);
|
||||
|
||||
sub all_data($self) {
|
||||
return $self->data->@*, map {$_->all_data} $self->children->@*;
|
||||
}
|
||||
|
||||
sub value($self) {
|
||||
if( ! $self->children->@* ) {
|
||||
return sum $self->data->@*
|
||||
}
|
||||
|
||||
return sum
|
||||
map { $_->value }
|
||||
grep { $_ }
|
||||
map { $self->children->[ $_ ] }
|
||||
grep { $_ >= 0 }
|
||||
map { $_ -1 }
|
||||
$self->data->@*;
|
||||
|
||||
|
||||
}
|
||||
|
||||
1;
|
@ -5,14 +5,14 @@ use experimental qw/
|
||||
postderef
|
||||
/;
|
||||
|
||||
use lib './lib';
|
||||
|
||||
use Entry;
|
||||
|
||||
use List::AllUtils qw/ sum /;
|
||||
|
||||
my @input = split / /, <>;
|
||||
|
||||
parse_metadata(@input);
|
||||
my $entry = Entry->new( stream => \@input );
|
||||
|
||||
sub parse_metadata($nbr_children, $nbr_metadata, @payload) {
|
||||
my @meta;
|
||||
push @meta, pop @payload for 1..$nbr_metadata;
|
||||
|
||||
|
||||
|
||||
}
|
||||
say sum $entry->all_data;
|
||||
|
16
2018/08/sol2.pl
Normal file
16
2018/08/sol2.pl
Normal file
@ -0,0 +1,16 @@
|
||||
use 5.20.0;
|
||||
use warnings;
|
||||
use experimental qw/
|
||||
signatures
|
||||
postderef
|
||||
/;
|
||||
|
||||
use lib './lib';
|
||||
|
||||
use Entry;
|
||||
|
||||
my @input = split / /, <>;
|
||||
|
||||
my $entry = Entry->new( stream => \@input );
|
||||
|
||||
say $entry->value;
|
Loading…
Reference in New Issue
Block a user