package part1; use 5.34.0; use warnings; use experimental 'signatures'; use Path::Tiny; use List::AllUtils qw/ natatime any sum all sum0/; sub readFile($file) { my @lines = path($file)->lines; my @balls = split ',', shift @lines; my $it = natatime 5, map { [split] } grep { /\d/ } @lines; my @cards; while( my @next = $it->() ) { push @cards, \@next } return { balls => \@balls, cards => \@cards, } } sub has_line($n,$card) { return all { $_ == -1} $card->[$n]->@*; } sub has_column($n,$card) { return all { $_ == -1 } map {$_->[$n]} @$card; } sub score( $n, $card ) { return $n * sum map { sum0 grep { $_ > 0 } @$_ } @$card; } sub victory ($number, $card) { for ( 0..4 ) { if ( has_line($_,$card) or has_column($_,$card) ) { return score($number,$card); } } return 0; } sub solution($balls, $cards) { my $number = shift @$balls; for my $card ( @$cards ) { for my $row ( @$card ) { $row = [ map { $_ == $number ? -1 : $_ } @$row ]; } if( my $score = victory($number,$card) ) { return $score; } } goto &solution; } 1;