#!/usr/bin/perl while (<>) { undef %results; chop; s/ //g; (/^quit$/i) && exit(0); ((/^(?:\d+:){3}\d+$/) && (@given1=split(/:/,$_))) || ((/^\d{4}$/) && (@given1=split('',$_))) || (print ("format error: $_\n"),next); @func=('+','*','-','/'); @optimize_me=('0123','0132','0213','0231','0312','0321','1023','1032','1203','1230','1302','1320','2013','2031','2103','2130','2301','2310','3012','3021','3102','3120','3201','3210'); while (@optimize_me) { $must=shift(@optimize_me); @select=split('',$must); @given=($given1[$select[0]],$given1[$select[1]],$given1[$select[2]],$given1[$select[3]]); for ($var1=0;$var1<4;$var1++) { for ($var2=0;$var2<4;$var2++) { for ($var3=0;$var3<4;$var3++) { $expression=$given[0].$func[$var1].$given[1].$func[$var2].$given[2].$func[$var3].$given[3]; $trans1=$trans2=$trans3=$expression; $trans1=~s/(\d+[\+-]\d+)/\($1\)/; $trans3=~s/(\d+[\+\-\*\/])(\d+[\+-]\d+)/$1\($2\)/; $trans2=~s/((\d+[\+-])+\d+)/\($1\)/g; $tempt=eval($expression); $tempt1=eval($trans1); $tempt2=eval($trans2); $tempt3=eval($trans3); ($tempt==24 && print("$expression\n") && ($results{$expression}=1)) unless $results{$expression}; ($tempt1==24 && print("$trans1\n") && ($results{$trans1}=1)) unless $results{$trans1}; ($tempt2==24 && print("$trans2\n") && ($results{$trans2}=1)) unless $results{$trans2}; ($tempt3==24 && print("$trans3\n") && ($results{$trans3}=1)) unless $results{$trans3}; } } } } (%results) ? print "Found ",$dumb1=keys(%results)," different ways to form 24 from @given\n" : print "Could not find any ways to make 24 from @given1\n"; }