package Part1; use Math::Vector::Real; use 5.36.0; no warnings qw/ uninitialized /; sub read_input ($file) { my @grid = map { [ split '' ] } $file->lines({chomp=>1}); return \@grid; } my @directions = map { V(@$_) } [-1,0], [ 0,1], [1,0], [0,-1]; sub find_guard($grid) { for my $i (0..$grid->$#* ) { for my $j ( 0..$grid->[0]->$#* ) { return V($i,$j) if $grid->[$i][$j] eq '^'; } } die "didn't find the guard!"; } use List::AllUtils qw/ any /; sub inside_grid($grid,$guard) { return 0 if any { $_ < 0 } @$guard; return $grid->[$guard->[0]][$guard->[1]]; } sub solve ($grid) { use DDP; my $guard = find_guard($grid); my $current_direction = 0; use Clone qw/ clone /; $grid = clone($grid); my %seen; $seen{"$guard"}++; while() { my $ahead = V(@$guard) + $directions[$current_direction]; last unless inside_grid($grid,$ahead); if( $grid->[$ahead->[0]][$ahead->[1]] eq '#' ) { $current_direction++; $current_direction %= @directions; redo; } $guard = $ahead; $seen{"$guard"}++; $grid->[$ahead->[0]][$ahead->[1]] = 'X'; } use DDP; # p %seen; # p $guard; # for my $l ( @$grid ) { # say join '', @$l; # } return scalar keys %seen; } 1;