use lib '.'; use Part1; package Part2; use 5.36.0; use experimental 'declared_refs'; no warnings qw/ uninitialized /; use List::AllUtils qw/ sum /; sub read_input ($file) { my ( $ordering, $manuals ) = split "\n\n", $file->slurp; $ordering = [ map { [ split '\|' ] } split "\n", $ordering ]; $manuals = [ split "\n", $manuals ]; return { ordering => $ordering, manuals => $manuals }; } use List::AllUtils qw/ first_index all /; sub reshuffle_manual ( $ordering, $manual ) { my @m = split ',', $manual; my @ordering = grep { my @o = @$_; my $i = first_index { $_ == $o[0] } @m; my $j = first_index { $_ == $o[1] } @m; all { $_ > -1 } $i, $j; } @$ordering; my $redo = 1; while ($redo) { $redo = 0; for my \@o(@ordering) { my $i = first_index { $_ == $o[0] } @m; my $j = first_index { $_ == $o[1] } @m; next if $i < $j; $redo = 1; @m[ $i, $j ] = @m[ $j, $i ]; } } return join ',', @m; } sub solve ($input) { return sum map { my @m = split ','; $m[ @m / 2 ]; } map { reshuffle_manual( $input->{ordering}, $_ ) } grep { !Part1::good_manual( $input->{ordering}, $_ ) } $input->{manuals}->@*; } 1;