<?php
class Computable
{
function compute() { }
}
class Value extends Computable
{
public $val;
function __construct($nval)
{
$this->val = $nval;
}
function compute()
{
return $this->val;
}
function printo($ntabs = 0)
{
return $this->compute() . ".0f";
}
function printnv()
{
return $this->compute() . ".0f";
}
}
class Operator
{
public $name;
function __construct()
{
$a = array('+', '-', '/', '*'); $this->name = $nname;
}
function compute($a, $b)
{
if ($this->name == '+') return $a + $b;
if ($this->name == '-') return $a - $b;
if ($this->name == '/')
{
if ($b == 0)
return 1;
else return $a / $b;
}
if ($this->name == '*') return $a * $b;
}
function tos()
{
return $this->name;
}
};
class Expression extends Computable
{
public $lhs;
public $rhs;
public $op;
function __construct($nlhs, $nrhs)
{
$this->lhs = $nlhs;
$this->rhs = $nrhs;
$this->op = new Operator();
}
function compute()
{
return $this->op->compute($this->lhs->compute(), $this->rhs->compute());
}
function printo($ntabs = 0)
{
$tabs = "";
$tabs2 = "";
for ($i = 0; $i < $ntabs; $i++) $tabs .= " ";
for ($i = 0; $i < $ntabs-1; $i++) $tabs2 .= " ";
$ntabs++;
return "\n" . $tabs . "(" . $this->lhs->printo($ntabs) . " " . $this->op->tos() . " " . $this->rhs->printo($ntabs) . ")" . "\n" . $tabs2;
}
function printnv()
{
return "(" . $this->lhs->printnv() . " " . $this->op->tos() . " " . $this->rhs->printnv() . ")";
}
}
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_';
$randomString = '';
$us = false;
for ($i = 0; $i < $length; $i++) {
$c = $characters[rand(0, strlen($characters) - 1)]; {
$randomString .= $c;
} else if ($i >= 1 && !$us && $c == '_')
{
$us = true;
$randomString .= $c;
} else if ($i >= 1 && $us && $c != '_')
{
$us = false;
$randomString .= $c;
} else if ($i >= 1 && $us && $c == '_')
{
while ($i >= 1 && $us && $c == '_') $c = $characters[rand(0, strlen($characters) - 1)]; $randomString .= $c;
} else $randomString .= $c;
}
return $randomString;
}
echo "#include <iostream>\n";
echo "#include <vector>\n";
echo "using namespace std;\n\n";
for ($i = 0; $i < 10; $i++)
{
$test = new Expression
(new Value
(rand(1, 2)), new Value
(rand(1, 2))); $lhs = $test;
$ident = generateRandomString();
for ($j = 0; $j < rand(0, 1); $j++) {
$c = new Expression
(new Value
(rand(1, 100)), new Value
(rand(1, 100))); $lhs = new Expression($lhs, $c);
}
$rhs = $test;
for ($j = 0; $j < rand(0, 1); $j++) {
$c = new Expression
(new Value
(rand(1, 100)), new Value
(rand(1, 100))); $rhs = new Expression($rhs, $c);
}
$test = new Expression($lhs, $rhs);
echo "constexpr float ".$ident." = " . $test->printnv() . ";\n";
echo "// should equal " . $test->compute() . "\n";
$vars[$ident] = $test->compute();
}
echo "int main() {\n";
echo "\tvector<float> vars;\n";
foreach ($vars as $key => $value)
echo "\tvars.push_back(".$key.");\n";
echo "\tfor (auto it = vars.begin(); it != vars.end(); ++it) {\n";
echo "\t\tcout << *it << endl;\n";
echo "\t}\n";
echo "\treturn 0;\n}";
?>
PD9waHAKZXJyb3JfcmVwb3J0aW5nKEVfRVJST1IgfCBFX1dBUk5JTkcgfCBFX1BBUlNFKTsKY2xhc3MgQ29tcHV0YWJsZQp7CiBmdW5jdGlvbiBjb21wdXRlKCkgeyB9Cn0KCmNsYXNzIFZhbHVlIGV4dGVuZHMgQ29tcHV0YWJsZQp7CiBwdWJsaWMgJHZhbDsKIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRudmFsKQogewogICR0aGlzLT52YWwgPSAkbnZhbDsKIH0KIGZ1bmN0aW9uIGNvbXB1dGUoKQogewogIHJldHVybiAkdGhpcy0+dmFsOwogfQogZnVuY3Rpb24gcHJpbnRvKCRudGFicyA9IDApCiB7CiAgICAgcmV0dXJuICR0aGlzLT5jb21wdXRlKCkgLiAiLjBmIjsKIH0KIGZ1bmN0aW9uIHByaW50bnYoKQogewogICAgICByZXR1cm4gJHRoaXMtPmNvbXB1dGUoKSAuICIuMGYiOwogfQp9CgpjbGFzcyBPcGVyYXRvcgp7CiAgICBwdWJsaWMgJG5hbWU7CiAgICAKIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKIHsKICAgICAkYSA9IGFycmF5KCcrJywgJy0nLCAnLycsICcqJyk7CiAgICAgJG5uYW1lID0gJGFbcmFuZCgwLCAzKV07CiAgJHRoaXMtPm5hbWUgPSAkbm5hbWU7ICAgCiB9CiBmdW5jdGlvbiBjb21wdXRlKCRhLCAkYikKIHsKICAgICBpZiAoJHRoaXMtPm5hbWUgPT0gJysnKSByZXR1cm4gJGEgKyAkYjsKICAgICBpZiAoJHRoaXMtPm5hbWUgPT0gJy0nKSByZXR1cm4gJGEgLSAkYjsKICAgICBpZiAoJHRoaXMtPm5hbWUgPT0gJy8nKSAKICAgICB7CiAgICAgICAgIGlmICgkYiA9PSAwKQogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICBlbHNlIHJldHVybiAkYSAvICRiOwogICAgIH0KICAgICBpZiAoJHRoaXMtPm5hbWUgPT0gJyonKSByZXR1cm4gJGEgKiAkYjsKIH0KIGZ1bmN0aW9uIHRvcygpCiB7CiAgICAgcmV0dXJuICR0aGlzLT5uYW1lOwogfQp9OwoKY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIENvbXB1dGFibGUKewogcHVibGljICRsaHM7CiBwdWJsaWMgJHJoczsKIHB1YmxpYyAkb3A7CiBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbmxocywgJG5yaHMpCiB7CiAgJHRoaXMtPmxocyA9ICRubGhzOwogICR0aGlzLT5yaHMgPSAkbnJoczsKICAkdGhpcy0+b3AgPSBuZXcgT3BlcmF0b3IoKTsKIH0KIGZ1bmN0aW9uIGNvbXB1dGUoKQogewogIHJldHVybiAkdGhpcy0+b3AtPmNvbXB1dGUoJHRoaXMtPmxocy0+Y29tcHV0ZSgpLCAkdGhpcy0+cmhzLT5jb21wdXRlKCkpOwogfQogZnVuY3Rpb24gcHJpbnRvKCRudGFicyA9IDApCiB7CiAgICAgJHRhYnMgPSAiIjsKICAgICAkdGFiczIgPSAiIjsKICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnRhYnM7ICRpKyspICR0YWJzIC49ICIgIjsKICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnRhYnMtMTsgJGkrKykgJHRhYnMyIC49ICIgIjsKICAgICAkbnRhYnMrKzsKICAgICByZXR1cm4gIlxuIiAuICR0YWJzIC4gIigiIC4gJHRoaXMtPmxocy0+cHJpbnRvKCRudGFicykgLiAiICIgLiAkdGhpcy0+b3AtPnRvcygpIC4gIiAiIC4gJHRoaXMtPnJocy0+cHJpbnRvKCRudGFicykgLiAiKSIgLiAiXG4iIC4gJHRhYnMyOwogfQogZnVuY3Rpb24gcHJpbnRudigpCiB7CiAgICAgcmV0dXJuICIoIiAuICR0aGlzLT5saHMtPnByaW50bnYoKSAuICIgIiAuICR0aGlzLT5vcC0+dG9zKCkgLiAiICIgLiAkdGhpcy0+cmhzLT5wcmludG52KCkgLiAiKSI7CiB9Cn0KCmZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tU3RyaW5nKCRsZW5ndGggPSAxMCkgewogICAgJGNoYXJhY3RlcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfJzsKICAgICRyYW5kb21TdHJpbmcgPSAnJzsKICAgICR1cyA9IGZhbHNlOwogICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgewogICAgICAgICRjID0gJGNoYXJhY3RlcnNbcmFuZCgwLCBzdHJsZW4oJGNoYXJhY3RlcnMpIC0gMSldOwogICAgICAgIGlmICgkaSA9PSAwICYmIGlzX251bWVyaWMoJGMpKQogICAgICAgIHsKICAgICAgICAgICAgd2hpbGUgKCRpID09IDAgJiYgaXNfbnVtZXJpYygkYykpICRjID0gJGNoYXJhY3RlcnNbcmFuZCgwLCBzdHJsZW4oJGNoYXJhY3RlcnMpIC0gMSldOwogICAgICAgICAgICAkcmFuZG9tU3RyaW5nIC49ICRjOwogICAgICAgIH0gZWxzZSBpZiAoJGkgPj0gMSAmJiAhJHVzICYmICRjID09ICdfJykgCiAgICAgICAgewogICAgICAgICAgICAkdXMgPSB0cnVlOwogICAgICAgICAgICAkcmFuZG9tU3RyaW5nIC49ICRjOwogICAgICAgIH0gZWxzZSBpZiAoJGkgPj0gMSAmJiAkdXMgJiYgJGMgIT0gJ18nKQogICAgICAgIHsKICAgICAgICAgICAgJHVzID0gZmFsc2U7CiAgICAgICAgICAgICRyYW5kb21TdHJpbmcgLj0gJGM7CiAgICAgICAgfSBlbHNlIGlmICgkaSA+PSAxICYmICR1cyAmJiAkYyA9PSAnXycpCiAgICAgICAgewogICAgICAgICAgICB3aGlsZSAoJGkgPj0gMSAmJiAkdXMgJiYgJGMgPT0gJ18nKSAkYyA9ICRjaGFyYWN0ZXJzW3JhbmQoMCwgc3RybGVuKCRjaGFyYWN0ZXJzKSAtIDEpXTsKICAgICAgICAgICAgJHJhbmRvbVN0cmluZyAuPSAkYzsKICAgICAgICB9IGVsc2UgJHJhbmRvbVN0cmluZyAuPSAkYzsKICAgIH0KICAgIHJldHVybiAkcmFuZG9tU3RyaW5nOwp9CgplY2hvICIjaW5jbHVkZSA8aW9zdHJlYW0+XG4iOwplY2hvICIjaW5jbHVkZSA8dmVjdG9yPlxuIjsKZWNobyAidXNpbmcgbmFtZXNwYWNlIHN0ZDtcblxuIjsKCmZvciAoJGkgPSAwOyAkaSA8IDEwOyAkaSsrKQp7CiR0ZXN0ID0gbmV3IEV4cHJlc3Npb24obmV3IFZhbHVlKHJhbmQoMSwgMikpLCBuZXcgVmFsdWUocmFuZCgxLCAyKSkpOwokbGhzID0gJHRlc3Q7CiRpZGVudCA9IGdlbmVyYXRlUmFuZG9tU3RyaW5nKCk7CiBmb3IgKCRqID0gMDsgJGogPCByYW5kKDAsIDEpOyAkaisrKQogewogICAgIAogICAgICRjID0gbmV3IEV4cHJlc3Npb24obmV3IFZhbHVlKHJhbmQoMSwgMTAwKSksIG5ldyBWYWx1ZShyYW5kKDEsIDEwMCkpKTsKICAgICAkbGhzID0gbmV3IEV4cHJlc3Npb24oJGxocywgJGMpOwogfQogJHJocyA9ICR0ZXN0OwogIGZvciAoJGogPSAwOyAkaiA8IHJhbmQoMCwgMSk7ICRqKyspCiB7CiAgICAgCiAgICAgJGMgPSBuZXcgRXhwcmVzc2lvbihuZXcgVmFsdWUocmFuZCgxLCAxMDApKSwgbmV3IFZhbHVlKHJhbmQoMSwgMTAwKSkpOwogICAgICRyaHMgPSBuZXcgRXhwcmVzc2lvbigkcmhzLCAkYyk7CiB9CiAkdGVzdCA9IG5ldyBFeHByZXNzaW9uKCRsaHMsICRyaHMpOwplY2hvICJjb25zdGV4cHIgZmxvYXQgIi4kaWRlbnQuIiA9ICIgLiAkdGVzdC0+cHJpbnRudigpIC4gIjtcbiI7CmVjaG8gIi8vIHNob3VsZCBlcXVhbCAiIC4gJHRlc3QtPmNvbXB1dGUoKSAuICJcbiI7CiR2YXJzWyRpZGVudF0gPSAkdGVzdC0+Y29tcHV0ZSgpOwp9CmVjaG8gImludCBtYWluKCkge1xuIjsKZWNobyAiXHR2ZWN0b3I8ZmxvYXQ+IHZhcnM7XG4iOwoKZm9yZWFjaCAoJHZhcnMgYXMgJGtleSA9PiAkdmFsdWUpCiAgICBlY2hvICJcdHZhcnMucHVzaF9iYWNrKCIuJGtleS4iKTtcbiI7CgplY2hvICJcdGZvciAoYXV0byBpdCA9IHZhcnMuYmVnaW4oKTsgaXQgIT0gdmFycy5lbmQoKTsgKytpdCkge1xuIjsKZWNobyAiXHRcdGNvdXQgPDwgKml0IDw8IGVuZGw7XG4iOwplY2hvICJcdH1cbiI7CmVjaG8gIlx0cmV0dXJuIDA7XG59IjsKPz4=