Solve day 5.
This commit is contained in:
parent
65966ded99
commit
0162804c51
1 changed files with 61 additions and 0 deletions
61
day05.pl
Normal file
61
day05.pl
Normal 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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue