Finit le jour 18

This commit is contained in:
Clément 2020-12-18 09:56:50 +01:00
parent 782ed9410e
commit e90d6186c5
2 changed files with 110 additions and 0 deletions

53
day_18/part_1.php Normal file
View File

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

57
day_18/part_2.php Normal file
View File

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