use 5.38.0; package Part1; use List::AllUtils qw/pairmap max sum /; sub find_numbers($line) { my @entries; while ( $line =~ /\d+/g ) { push @entries => { prefix => length $`, length => length $&, n => 0+$&, }; } return @entries; } sub near_symbol($numb,$lines) { no warnings; my $surrounding = join "", map { substr $lines->[$_+$numb->{line}], max($numb->{prefix}-1,0), $numb->{length}+2 } -1..1; return $surrounding =~ /[^.\d]/; } sub numbers_near_symbols($input) { my @lines = split "\n", $input; unshift @lines, ''; my @numbers = pairmap { map { +{ %$_, line => $a } } @$b } map { $_ => [find_numbers($lines[$_])] } 1..$#lines; @numbers = grep { near_symbol($_,\@lines) } @numbers; return @numbers; } sub solution_1 ($input) { my @numbers = numbers_near_symbols($input); return sum map { $_->{n}} @numbers; } 1;