advent_of_code_2020/day_18/part_1.php

54 lines
1.4 KiB
PHP
Raw Normal View History

2020-12-18 09:56:50 +01:00
<?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);
}