<?php
function evalRPN($input) {
$_GET['a']=$input;
$v=$_GET['a'];
while(preg_match('~(.*?)(-?[\d.]+) +(-?[\d.]+) +([*/+-])(.*)~',$v,$m))
$v=$m[1].($m[4]=="+"?$m[2]+$m[3]:($m[4]=="-"?$m[2]-$m[3]:($m[4]=="*"?$m[2]*$m[3]:$m[2]/$m[3]))).$m[5];
return $v;
}
function evalRPN2($input) {
$_GET['a']=$input;
$v=$_GET['a'];
do{$v=preg_replace_callback(
'~(-?[\d.]+) +(-?[\d.]+) +([*/+-])~',
fn($m)=>($m[3]=="+"?$m[1]+$m[2]:($m[3]=="-"?$m[1]-$m[2]:($m[3]=="*"?$m[1]*$m[2]:$m[1]/$m[2]))),
$v,9,$c
);}while($c);
return $v;
}
function evalRPN3($input) {
$_GET['a']=$input;
foreach(preg_split('~ +~', $_GET['a'])as$v)
if(floatval($v))$s[]=$v;else{[$e,$d]=array_splice($s, -2);$s[]=$v=="+"?$e+$d:($v=="-"?$e-$d:($v=="*"?$e*$d:$e/$d));}
return $s[0];
}
echo evalRPN('-4 5 +') , "\n"; // output 1
echo evalRPN('5 2 /') , "\n"; // output 2.5
echo evalRPN('5 2.5 /') , "\n"; // output 2
echo evalRPN('5 1 2 + 4 * 3 - +') , "\n"; // output 14
echo evalRPN('4 2 5 * + 1 3 2 * + /') , "\n"; // output 2
echo evalRPN2('-4 5 +') , "\n"; // output 1
echo evalRPN2('5 2 /') , "\n"; // output 2.5
echo evalRPN2('5 2.5 /') , "\n"; // output 2
echo evalRPN2('5 1 2 + 4 * 3 - +') , "\n"; // output 14
echo evalRPN2('4 2 5 * + 1 3 2 * + /') , "\n"; // output 2
echo evalRPN3('-4 5 +') , "\n"; // output 1
echo evalRPN3('5 2 /') , "\n"; // output 2.5
echo evalRPN3('5 2.5 /') , "\n"; // output 2
echo evalRPN3('5 1 2 + 4 * 3 - +') , "\n"; // output 14
echo evalRPN3('4 2 5 * + 1 3 2 * + /') , "\n"; // output 2
preferences:
55.89 ms | 402 KiB | 5 Q