✨ Finit le jour 18
This commit is contained in:
parent
782ed9410e
commit
e90d6186c5
53
day_18/part_1.php
Normal file
53
day_18/part_1.php
Normal 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
57
day_18/part_2.php
Normal 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);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user