use List::AllUtils qw/ sum max /; use 5.20.0; my $grid = []; while(<>) { warn $_; / (?on|off|toggle) .*? (?\d+), (?\d+) .*? (?\d+), (?\d+) /x; my $level = $+{command} eq 'on' ? 1 : $+{command} eq 'off' ? -1 : 2; for my $x ( $+{from_x}..$+{to_x} ) { for my $y ( $+{from_y}..$+{to_y} ) { $grid->[$x][$y] = max 0, $grid->[$x][$y] + $level; } } } say sum map { $_ ? @$_ : () } @$grid;