<?php
//Code challenge
//company: Sparkcentral
//applicant: Mike Roderick
class simpleCalculator{
private $str_calc;
//constructor, accepts inoput string for calculation
public function simpleCalculator($str_input){
//remove whitespace and other undesireables, store result in private variable
$this->str_calc = preg_replace('/[^0-9%+-\/\*]/s', '', $str_input); if (sizeof($this->str_calc) > 0){ print "successfully initialized.\nValue stored:".$this->str_calc."\n";
return true;
} else {
return false;
}
}
public function calculateResult(){
//order of operations: multiplication, division and modulus, then addition and subtraction
$this->handleMath('*');
$this->handleMath('/');
$this->handleMath('%');
$this->handleMath('+');
$this->handleMath('-');
print "calculated value:".$this->str_calc."\n";
}
private function handleMath($operator){
//Iterate over the equation, according to the operator that was passed in
while(strpos($this->str_calc,$operator) !== false){ //for debugging
//echo $this->str_calc."...";
//find number1 and number2 based on operand
$operator_position = strpos($this->str_calc,$operator);
//get the first number+position in this operation
$first_half = substr($this->str_calc,0,$operator_position); $first_parts = preg_split("/[%+-\/\*]+/",$first_half); $numberpos1 = strrpos($first_half,$number1);
//get the second number+position in this operation
$second_half = substr($this->str_calc,$operator_position+1); $second_parts = preg_split("/[%+-\/\*]+/",$second_half); $numberpos2 = ($operator_position + 1) + strlen($number2);
//do the math
$result = $this->mathOp($number1, $number2, $operator);
//shoehorn the result back into the string
$this->str_calc = substr($this->str_calc,0,$numberpos1) . $result . substr($this->str_calc,$numberpos2);
//for debugging
//print "becomes: ".$this->str_calc."\n";
}
}
private function mathOp($number1, $number2, $operator){
switch($operator){
case '*':
return $number1 * $number2;
break;
case '/':
return $number1 / $number2;
break;
case '+':
return $number1 + $number2;
break;
case '-':
return $number1 - $number2;
break;
case '%':
return $number1 % $number2;
break;
}
}
}
echo 'starting...';
$x = new simpleCalculator('a e q 5 + 9 - 4 * 2 / 4 % 5 * 2');
$x->calculateResult();
?>
PD9waHAKLy9Db2RlIGNoYWxsZW5nZQovL2NvbXBhbnk6IFNwYXJrY2VudHJhbAovL2FwcGxpY2FudDogIE1pa2UgUm9kZXJpY2sKCmNsYXNzIHNpbXBsZUNhbGN1bGF0b3J7CiAgcHJpdmF0ZSAkc3RyX2NhbGM7CgogIC8vY29uc3RydWN0b3IsIGFjY2VwdHMgaW5vcHV0IHN0cmluZyBmb3IgY2FsY3VsYXRpb24KICBwdWJsaWMgZnVuY3Rpb24gc2ltcGxlQ2FsY3VsYXRvcigkc3RyX2lucHV0KXsKICAgIC8vcmVtb3ZlIHdoaXRlc3BhY2UgYW5kIG90aGVyIHVuZGVzaXJlYWJsZXMsIHN0b3JlIHJlc3VsdCBpbiBwcml2YXRlIHZhcmlhYmxlCiAgICAkdGhpcy0+c3RyX2NhbGMgPSBwcmVnX3JlcGxhY2UoJy9bXjAtOSUrLVwvXCpdL3MnLCAnJywgJHN0cl9pbnB1dCk7CiAgICBpZiAoc2l6ZW9mKCR0aGlzLT5zdHJfY2FsYykgPiAwKXsKICAgICAgcHJpbnQgInN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC5cblZhbHVlIHN0b3JlZDoiLiR0aGlzLT5zdHJfY2FsYy4iXG4iOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIHB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGVSZXN1bHQoKXsKICAgIC8vb3JkZXIgb2Ygb3BlcmF0aW9uczogbXVsdGlwbGljYXRpb24sIGRpdmlzaW9uIGFuZCBtb2R1bHVzLCB0aGVuIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbgogICAgJHRoaXMtPmhhbmRsZU1hdGgoJyonKTsKICAgICR0aGlzLT5oYW5kbGVNYXRoKCcvJyk7CiAgICAkdGhpcy0+aGFuZGxlTWF0aCgnJScpOwogICAgJHRoaXMtPmhhbmRsZU1hdGgoJysnKTsKICAgICR0aGlzLT5oYW5kbGVNYXRoKCctJyk7CiAgICBwcmludCAiY2FsY3VsYXRlZCB2YWx1ZToiLiR0aGlzLT5zdHJfY2FsYy4iXG4iOwogIH0gCgogIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlTWF0aCgkb3BlcmF0b3IpewogIAkvL0l0ZXJhdGUgb3ZlciB0aGUgZXF1YXRpb24sIGFjY29yZGluZyB0byB0aGUgb3BlcmF0b3IgdGhhdCB3YXMgcGFzc2VkIGluCiAgICB3aGlsZShzdHJwb3MoJHRoaXMtPnN0cl9jYWxjLCRvcGVyYXRvcikgIT09IGZhbHNlKXsKICAgICAgLy9mb3IgZGVidWdnaW5nCiAgICAgIC8vZWNobyAkdGhpcy0+c3RyX2NhbGMuIi4uLiI7CiAgICAgIAogICAgICAvL2ZpbmQgbnVtYmVyMSBhbmQgbnVtYmVyMiBiYXNlZCBvbiBvcGVyYW5kCiAgICAgICRvcGVyYXRvcl9wb3NpdGlvbiA9IHN0cnBvcygkdGhpcy0+c3RyX2NhbGMsJG9wZXJhdG9yKTsKICAgICAgCiAgICAgIC8vZ2V0IHRoZSBmaXJzdCBudW1iZXIrcG9zaXRpb24gaW4gdGhpcyBvcGVyYXRpb24KICAgICAgJGZpcnN0X2hhbGYgPSBzdWJzdHIoJHRoaXMtPnN0cl9jYWxjLDAsJG9wZXJhdG9yX3Bvc2l0aW9uKTsKICAgICAgJGZpcnN0X3BhcnRzID0gcHJlZ19zcGxpdCgiL1slKy1cL1wqXSsvIiwkZmlyc3RfaGFsZik7CiAgICAgICRudW1iZXIxID0gYXJyYXlfcG9wKCRmaXJzdF9wYXJ0cyk7CiAgICAgICRudW1iZXJwb3MxID0gc3RycnBvcygkZmlyc3RfaGFsZiwkbnVtYmVyMSk7CiAgICAgIAogICAgICAvL2dldCB0aGUgc2Vjb25kIG51bWJlcitwb3NpdGlvbiBpbiB0aGlzIG9wZXJhdGlvbgogICAgICAkc2Vjb25kX2hhbGYgPSBzdWJzdHIoJHRoaXMtPnN0cl9jYWxjLCRvcGVyYXRvcl9wb3NpdGlvbisxKTsKICAgICAgJHNlY29uZF9wYXJ0cyA9IHByZWdfc3BsaXQoIi9bJSstXC9cKl0rLyIsJHNlY29uZF9oYWxmKTsKICAgICAgJG51bWJlcjIgPSBhcnJheV9zaGlmdCgkc2Vjb25kX3BhcnRzKTsKICAgICAgJG51bWJlcnBvczIgPSAoJG9wZXJhdG9yX3Bvc2l0aW9uICsgMSkgKyBzdHJsZW4oJG51bWJlcjIpOwogICAgICAKICAgICAgLy9kbyB0aGUgbWF0aAogICAgICAkcmVzdWx0ID0gJHRoaXMtPm1hdGhPcCgkbnVtYmVyMSwgJG51bWJlcjIsICRvcGVyYXRvcik7CiAgICAgIAogICAgICAvL3Nob2Vob3JuIHRoZSByZXN1bHQgYmFjayBpbnRvIHRoZSBzdHJpbmcKICAgICAgJHRoaXMtPnN0cl9jYWxjID0gc3Vic3RyKCR0aGlzLT5zdHJfY2FsYywwLCRudW1iZXJwb3MxKSAuICRyZXN1bHQgLiBzdWJzdHIoJHRoaXMtPnN0cl9jYWxjLCRudW1iZXJwb3MyKTsKICAgICAgCiAgICAgIC8vZm9yIGRlYnVnZ2luZwogICAgICAvL3ByaW50ICJiZWNvbWVzOiAiLiR0aGlzLT5zdHJfY2FsYy4iXG4iOwogICAgfQogIH0KICAKICBwcml2YXRlIGZ1bmN0aW9uIG1hdGhPcCgkbnVtYmVyMSwgJG51bWJlcjIsICRvcGVyYXRvcil7CiAgICBzd2l0Y2goJG9wZXJhdG9yKXsKICAgICAgY2FzZSAnKic6CiAgICAgIAlyZXR1cm4gJG51bWJlcjEgKiAkbnVtYmVyMjsKICAgICAgCWJyZWFrOwogICAgICBjYXNlICcvJzoKICAgICAgCXJldHVybiAkbnVtYmVyMSAvICRudW1iZXIyOwogICAgICAJYnJlYWs7CiAgICAgIGNhc2UgJysnOgogICAgICAJcmV0dXJuICRudW1iZXIxICsgJG51bWJlcjI7CiAgICAgIAlicmVhazsKICAgICAgY2FzZSAnLSc6CiAgICAgIAlyZXR1cm4gJG51bWJlcjEgLSAkbnVtYmVyMjsKICAgICAgCWJyZWFrOwogICAgICBjYXNlICclJzoKICAgICAgCXJldHVybiAkbnVtYmVyMSAlICRudW1iZXIyOwogICAgICAJYnJlYWs7CiAgICB9CQogIH0KICAKfQplY2hvICdzdGFydGluZy4uLic7CiR4ID0gbmV3IHNpbXBsZUNhbGN1bGF0b3IoJ2EgZSBxIDUgKyA5IC0gNCAqIDIgLyA0ICUgNSAqIDInKTsKJHgtPmNhbGN1bGF0ZVJlc3VsdCgpOwo/Pg==