54 lines
1.4 KiB
PHP
54 lines
1.4 KiB
PHP
|
<?php
|
||
|
|
||
|
$operations = explode("\n", file_get_contents('input.txt'));
|
||
|
|
||
|
$results = [];
|
||
|
foreach ($operations as $i => $operation) {
|
||
|
$operation = evaluateParentheses($operation);
|
||
|
$operation = evaluateOperation($operation);
|
||
|
$results[] = (int) $operation;
|
||
|
echo sprintf('Line %u : %u%s', $i+1, $operation, "\n");
|
||
|
}
|
||
|
|
||
|
echo array_sum($results);
|
||
|
/**
|
||
|
* @param string $operation
|
||
|
*
|
||
|
* @return false|float|int
|
||
|
* @throws \Exception
|
||
|
*/
|
||
|
function evaluateOperation(string $operation)
|
||
|
{
|
||
|
while (!is_numeric($operation)) {
|
||
|
$operation = preg_replace_callback(
|
||
|
'/^(\d+) (\+|\*) (\d+)/',
|
||
|
static function ($matches) {
|
||
|
switch ($matches[2]) {
|
||
|
case '+':
|
||
|
return (int)$matches[1] + (int)$matches[3];
|
||
|
case '*':
|
||
|
return (int)$matches[1] * (int)$matches[3];
|
||
|
default:
|
||
|
throw new \Exception('Unknown Operation ' . var_export($matches, true));
|
||
|
}
|
||
|
},
|
||
|
$operation
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return $operation;
|
||
|
}
|
||
|
|
||
|
function evaluateParentheses($operation)
|
||
|
{
|
||
|
$result = preg_replace_callback('/\(([^\)\(]+)\)/', static function ($matches) {
|
||
|
return evaluateOperation($matches[1]);
|
||
|
}, $operation);
|
||
|
|
||
|
if ($result === $operation || $result === null) {
|
||
|
return $operation;
|
||
|
}
|
||
|
|
||
|
return evaluateParentheses($result);
|
||
|
}
|