Add day 7.
This commit is contained in:
parent
0162804c51
commit
c97f1fb794
1 changed files with 60 additions and 0 deletions
60
day07.pl
Normal file
60
day07.pl
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
|
||||||
|
my @results = ();
|
||||||
|
my @expressions = ();
|
||||||
|
while (<>) {
|
||||||
|
next if !/(\d+): ((?:\d+ ?)+)/;
|
||||||
|
push @results, $1;
|
||||||
|
|
||||||
|
my @numbers = split ' ', $2;
|
||||||
|
push @expressions, \@numbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $answer = 0;
|
||||||
|
for my $i (0 .. $#results) {
|
||||||
|
print "$i/$#results\n";
|
||||||
|
my $result = $results[$i];
|
||||||
|
my $expression = $expressions[$i];
|
||||||
|
|
||||||
|
my @operators = map { 0 } 0..($#$expression - 1);
|
||||||
|
while (1) {
|
||||||
|
my $total = $expression->[0];
|
||||||
|
for my $i (0 .. $#operators) {
|
||||||
|
my $operator = $operators[$i];
|
||||||
|
my $number = $expression->[$i + 1];
|
||||||
|
if ($operator == 0) {
|
||||||
|
$total += $number;
|
||||||
|
} elsif ($operator == 1) {
|
||||||
|
$total *= $number;
|
||||||
|
} elsif ($operator == 2) {
|
||||||
|
$total .= $number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($total == $result) {
|
||||||
|
$answer += $result;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $done = 0;
|
||||||
|
$operators[0]++;
|
||||||
|
for $i (0 .. $#operators) {
|
||||||
|
my $operator = $operators[$i];
|
||||||
|
if ($operator == 3) {
|
||||||
|
if (!defined($operators[$i + 1])) {
|
||||||
|
$done = 1;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
$operators[$i] = 0;
|
||||||
|
$operators[$i + 1]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
last if $done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print "$answer\n";
|
Loading…
Add table
Add a link
Reference in a new issue