✨ 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