#!/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";