Question 6: A Perl solution
sub solve { local($_) = @_; s{\A\s+}{}; s{\s+\z}{}; my $cell_ref = '\b[A-Z][0-9]{1,3}\b'; if(m{\A($cell_ref)\s*[+]\s*($cell_ref)\z}) { return cell_value($1) + cell_value($2); } elsif(m{\A($cell_ref)\s*[-]\s*($cell_ref)\z}) { return cell_value($1) - cell_value($2); } elsif(m{\A($cell_ref)\s*[*]\s*($cell_ref)\z}) { return cell_value($1) * cell_value($2); } elsif(m{\A($cell_ref)\s*[/]\s*($cell_ref)\z}) { return cell_value($1) / cell_value($2); } elsif(m{\ASQRT\(($cell_ref)\)\z}) { return sqrt(cell_value($1)); } elsif(m{\AMAX\((.*?)\)\z}) { my $ref_list = $1; my $max = 0; foreach my $ref ( $ref_list =~ m{($cell_ref)}g) { my $val = cell_value($ref); $max = $val if $val > $max; } return $max; } elsif(m{\A(\S.*?)\s*[+]\s*($cell_ref)\z}) { my $val2 = cell_value($2); return solve($1) + $val2; } else { die "Don't know how to solve: '$_'\n"; } }