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