parent
782ed9410e
commit
e90d6186c5
2 changed files with 110 additions and 0 deletions
@ -0,0 +1,53 @@ |
||||
<?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); |
||||
} |
@ -0,0 +1,57 @@ |
||||
<?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)) { |
||||
$original_operation = $operation; |
||||
$operation = preg_replace_callback( |
||||
'/(\d+) \+ (\d+)/', |
||||
static function ($matches) { |
||||
return (int)$matches[1] + (int)$matches[2]; |
||||
}, |
||||
$operation |
||||
); |
||||
|
||||
if ($original_operation === $operation) { |
||||
$operation = preg_replace_callback( |
||||
'/(\d+) \* (\d+)/', |
||||
static function ($matches) { |
||||
return (int)$matches[1] * (int)$matches[2]; |
||||
}, |
||||
$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); |
||||
} |
Loading…
Reference in new issue