#!/usr/bin/env awk # Just pre-compute all possible results # and check against the sum BEGIN { FS = "[: ]" total = 0 } { sum = $1 num_opers = 3 # +, *, || num_of_nums = NF - 2 num_of_results = 1 # Create list of numbers for (i = 3; i <= NF; i++) { nums[i-2] = $i } results[1] = nums[1] # Starting applying operator # Starting from second number # index range of num_of_results is for each operator # 1 - num_of_results - addition # num_of_results+1 - num_of_results*2 - multiplication # num_of_results*2+1 - num_of_results*3 - concat for (i = 2; i <= num_of_nums; i++) { number = nums[i] for (j = 1; j <= num_of_results; j++) { element = results[j] results[j] = results[j] + number # Add results[j+num_of_results] = element * number # Mul results[j+num_of_results*2] = (element "" number) + 0 # Concat } num_of_results *= num_opers } expected = ( num_of_nums - 1 ) * num_opers # Check results for (i=1; i <= num_of_results; i++) { if ( results[i] == $1 ) { start_val = i % num_of_nums stack_num = (i - start_val) / num_of_nums total = total + $1 break } } delete results delete nums } END { print total }