Solve day 5.

This commit is contained in:
Sebastian Bugge 2024-12-05 06:57:36 +01:00
parent 65966ded99
commit 0162804c51
Signed by: kaholaz
GPG key ID: 2EFFEDEE03519691

61
day05.pl Normal file
View file

@ -0,0 +1,61 @@
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw(first reduce);
my @rules = ();
while (<>) {
last if /^\s*$/;
chomp;
push @rules, [split /\|/];
}
my @correct_order = ();
my @incorrect_order = ();
while (<>) {
next if /^\s*$/;
chomp;
my @pages = split /,/;
my $hit = 1;
for my $rule (@rules) {
my $a = first { $pages[$_] eq $rule->[0] } 0 .. $#pages;
my $b = first { $pages[$_] eq $rule->[1] } 0 .. $#pages;
if (defined($a) && defined($b) && $a > $b) {
$hit = 0;
last;
}
}
if ($hit) {
push @correct_order, \@pages;
} else {
push @incorrect_order, \@pages;
}
}
print "Part 1: ", reduce { $a + $b } map { $_->[@$_/2] } @correct_order; print "\n";
my @fixed_incorrect_order = map { fix_order(@$_) } @incorrect_order;
print "Part 2: ", reduce { $a + $b } map { $_->[@$_/2] } @fixed_incorrect_order; print "\n";
sub fix_order {
my @pages = @_;
my $rule_violated = 1;
while ($rule_violated) {
$rule_violated = 0;
for my $rule (@rules) {
my $a = first { $pages[$_] eq $rule->[0] } 0 .. $#pages;
my $b = first { $pages[$_] eq $rule->[1] } 0 .. $#pages;
if (defined($a) && defined($b) && $a > $b) {
@pages[$a, $b] = @pages[$b, $a];
$rule_violated = 1;
}
}
}
return \@pages;
}