From 68f6ee867a21e20608fe53dc46e23c1de992f469 Mon Sep 17 00:00:00 2001 From: Tristan Date: Sun, 3 Dec 2023 14:34:22 +0100 Subject: [PATCH] Make abstract day command --- aoc | 4 +- .../AbstractDayCommand.php} | 66 +++++++++++-------- src/Commands/ExecuteDay.php | 44 +++++++++++++ src/{ => Commands}/Puzzle.php | 4 +- src/Solution.php | 6 +- 5 files changed, 90 insertions(+), 34 deletions(-) rename src/{ExecuteDay.php => Commands/AbstractDayCommand.php} (52%) create mode 100644 src/Commands/ExecuteDay.php rename src/{ => Commands}/Puzzle.php (92%) diff --git a/aoc b/aoc index 810ead5..25c0ea8 100755 --- a/aoc +++ b/aoc @@ -4,8 +4,8 @@ require __DIR__.'/vendor/autoload.php'; use NunoMaduro\Collision\Provider as CollisionProvider; use Symfony\Component\Console\Application; -use trizz\AdventOfCode\ExecuteDay; -use trizz\AdventOfCode\Puzzle; +use trizz\AdventOfCode\Commands\ExecuteDay; +use trizz\AdventOfCode\Commands\Puzzle; (new CollisionProvider())->register(); diff --git a/src/ExecuteDay.php b/src/Commands/AbstractDayCommand.php similarity index 52% rename from src/ExecuteDay.php rename to src/Commands/AbstractDayCommand.php index 5f52ab8..e51d055 100644 --- a/src/ExecuteDay.php +++ b/src/Commands/AbstractDayCommand.php @@ -1,28 +1,33 @@ setName('day') - ->setDescription('Run day') ->addArgument('day', InputArgument::REQUIRED, 'The day number') ->addArgument('year', InputArgument::OPTIONAL, 'The year', date('y')) + ->addOption('one', '1', null, 'Run only part 1') + ->addOption('two', '2', null, 'Run only part 2') ->addOption('skip-example', 's', null, 'Skip the example data'); } @@ -33,44 +38,51 @@ final class ExecuteDay extends Command $this->year = $input->getArgument('year'); $this->title = sprintf("Advent of Code '%d - Day %d", $this->year, $this->day); + $this->skipExamples = $input->getOption('skip-example'); + $this->part = $input->getOption('one') ? 1 : ($input->getOption('two') ? 2 : 0); $output->writeln(''); $output->writeln($this->title); $output->writeln(str_repeat('-', strlen($this->title))); } - #[\Override] - protected function execute(InputInterface $input, OutputInterface $output): int + /** + * @return array + */ + protected function getSolutions(): array { - $className = sprintf('%s\\Y%d\\Day%d', __NAMESPACE__, $this->year, $this->day); - - /** @var Solution $class */ - $class = new $className(); - $class->loadData(); + $solution = $this->loadClass(); // Solve the examples if available. $resultPart1Example = 'n/a'; $resultPart2Example = 'n/a'; - if ($class->hasExampleData() && !$input->getOption('skip-example')) { - ['part1' => $resultPart1Example, 'part2' => $resultPart2Example] = $class->results(useExampleData: true); + if (!$this->skipExamples && $solution->hasExampleData()) { + ['part1' => $resultPart1Example, 'part2' => $resultPart2Example] = $solution->results(useExampleData: true, part: $this->part); } // Solve the real puzzle if available. $resultPart1 = 'n/a'; $resultPart2 = 'n/a'; - if ($class->hasData()) { - ['part1' => $resultPart1, 'part2' => $resultPart2] = $class->results(useExampleData: false); + if ($solution->hasData()) { + ['part1' => $resultPart1, 'part2' => $resultPart2] = $solution->results(useExampleData: false, part: $this->part); } - // Output all the results. - $output->writeln('Part 1'); - $output->writeln(sprintf('Example: %s', $resultPart1Example)); - $output->writeln(sprintf('Result: %s', $resultPart1)); - $output->writeln(str_repeat('-', strlen($this->title))); - $output->writeln('Part 2'); - $output->writeln(sprintf('Example: %s', $resultPart2Example)); - $output->writeln(sprintf('Result: %s', $resultPart2)); + return [ + 'part1' => $resultPart1, + 'part2' => $resultPart2, + 'part1Example' => $resultPart1Example, + 'part2Example' => $resultPart2Example, + ]; + } - return Command::SUCCESS; + protected function loadClass(): Solution + { + $className = sprintf('%s\\Y%d\\Day%d', substr(__NAMESPACE__, 0, -9), $this->year, $this->day); + + /** @var Solution $class */ + $class = new $className(); + $class->loadData(); + + return $class; } } diff --git a/src/Commands/ExecuteDay.php b/src/Commands/ExecuteDay.php new file mode 100644 index 0000000..097bdd6 --- /dev/null +++ b/src/Commands/ExecuteDay.php @@ -0,0 +1,44 @@ +setName('day') + ->setDescription('Run day'); + } + + #[\Override] + protected function execute(InputInterface $input, OutputInterface $output): int + { + $results = $this->getSolutions(); + + // Output all the results. + if (in_array($this->part, [0, 1], true)) { + $output->writeln('Part 1'); + $output->writeln(sprintf(' Example: %s', $results['part1Example'])); + $output->writeln(sprintf(' Result: %s', $results['part1'])); + } + + if ($this->part === 0) { + $output->writeln(str_repeat('-', strlen($this->title))); + } + + if (in_array($this->part, [0, 2], true)) { + $output->writeln('Part 2'); + $output->writeln(sprintf(' Example: %s', $results['part2Example'])); + $output->writeln(sprintf(' Result: %s', $results['part2'])); + } + + return Command::SUCCESS; + } +} diff --git a/src/Puzzle.php b/src/Commands/Puzzle.php similarity index 92% rename from src/Puzzle.php rename to src/Commands/Puzzle.php index 18e3d6a..9158ea2 100644 --- a/src/Puzzle.php +++ b/src/Commands/Puzzle.php @@ -1,6 +1,6 @@ getArgument('year'), (int) $input->getArgument('day') diff --git a/src/Solution.php b/src/Solution.php index a3c0c63..92304b5 100644 --- a/src/Solution.php +++ b/src/Solution.php @@ -110,11 +110,11 @@ abstract class Solution * @return array{part1: int|string, part2: int|string} */ #[ArrayShape(['part1' => 'int|string', 'part2' => 'int|string'])] - public function results(bool $useExampleData = true): array + public function results(bool $useExampleData = true, int $part = 0): array { return [ - 'part1' => $this->part1Data($useExampleData), - 'part2' => $this->part2Data($useExampleData), + 'part1' => ($part === 1 || $part === 0) ? $this->part1Data($useExampleData) : 'n/a', + 'part2' => ($part === 2 || $part === 0) ? $this->part2Data($useExampleData) : 'n/a', ]; }