60 lines
1.1 KiB
Perl
60 lines
1.1 KiB
Perl
#!/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";
|