#!/usr/bin/perl use warnings; use strict; use Scalar::Util 'looks_like_number'; my $MAXITERATIONS = 500; while ( <> ) { my $iterations = 0; 1 while s/(\([^()]+\))/ die "MAX ITERATIONS ACHIEVED: ABORTING\n" if ++$iterations >= $MAXITERATIONS; solvepart( $1 ) /eg; print "\nANSWER: $_\n\n"; } sub solvepart { my $expression = shift; $expression =~ tr/()//d; $expression =~ s/\^/**/; my ( $operator, @values ) = split ' ', $expression; $operator =~ /\*\*|[+\-*\/%]/ && @values >= 2 && @values == grep looks_like_number( $_ ), @values or die "IMPROPER INPUT\n"; eval join $operator, @values; }