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);
 | 
						|
}
 |