Move solutions out of the source itself
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
5c86431824
commit
68583b1b84
2
aoc
2
aoc
@ -11,6 +11,8 @@ use trizz\AdventOfCode\Commands\TestDay;
|
|||||||
|
|
||||||
(new CollisionProvider())->register();
|
(new CollisionProvider())->register();
|
||||||
|
|
||||||
|
require_once __DIR__.'/src/bootstrap.php';
|
||||||
|
|
||||||
$application = new Application('Advent of Code by trizz');
|
$application = new Application('Advent of Code by trizz');
|
||||||
|
|
||||||
$application->add(new Puzzle());
|
$application->add(new Puzzle());
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace trizz\AdventOfCode\Y22;
|
namespace trizzssdddAdventOfCode\Y22;
|
||||||
|
|
||||||
use trizz\AdventOfCode\Solution;
|
use trizz\AdventOfCode\Solution;
|
||||||
|
|
@ -15,6 +15,11 @@ final class Day2 extends Solution
|
|||||||
|
|
||||||
public static null|int|string $part2Result = 12526;
|
public static null|int|string $part2Result = 12526;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
require_once __DIR__.'/RPS.php';
|
||||||
|
}
|
||||||
|
|
||||||
#[\Override]
|
#[\Override]
|
||||||
public function part1(array $data): int
|
public function part1(array $data): int
|
||||||
{
|
{
|
@ -3,44 +3,44 @@ parameters:
|
|||||||
-
|
-
|
||||||
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day4\\:\\:arrayHasSingleValue\\(\\) has parameter \\$array with no value type specified in iterable type array\\.$#"
|
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day4\\:\\:arrayHasSingleValue\\(\\) has parameter \\$array with no value type specified in iterable type array\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Y21/Day4.php
|
path: data/Y21/day4/Day4.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day4\\:\\:checkCards\\(\\) has parameter \\$cards with no value type specified in iterable type array\\.$#"
|
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day4\\:\\:checkCards\\(\\) has parameter \\$cards with no value type specified in iterable type array\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Y21/Day4.php
|
path: data/Y21/day4/Day4.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day4\\:\\:checkCards\\(\\) has parameter \\$finishedCards with no value type specified in iterable type array\\.$#"
|
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day4\\:\\:checkCards\\(\\) has parameter \\$finishedCards with no value type specified in iterable type array\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Y21/Day4.php
|
path: data/Y21/day4/Day4.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day6\\:\\:processDay\\(\\) return type has no value type specified in iterable type array\\.$#"
|
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day6\\:\\:processDay\\(\\) return type has no value type specified in iterable type array\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Y21/Day6.php
|
path: data/Y21/day6/Day6.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$state of method trizz\\\\AdventOfCode\\\\Y21\\\\Day6\\:\\:processDay\\(\\) expects array\\{int\\: int\\}, array given\\.$#"
|
message: "#^Parameter \\#1 \\$state of method trizz\\\\AdventOfCode\\\\Y21\\\\Day6\\:\\:processDay\\(\\) expects array\\{int\\: int\\}, array given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Y21/Day6.php
|
path: data/Y21/day6/Day6.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day8\\:\\:mapDigits\\(\\) has parameter \\$patterns with no value type specified in iterable type array\\.$#"
|
message: "#^Method trizz\\\\AdventOfCode\\\\Y21\\\\Day8\\:\\:mapDigits\\(\\) has parameter \\$patterns with no value type specified in iterable type array\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Y21/Day8.php
|
path: data/Y21/day8/Day8.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Property trizz\\\\AdventOfCode\\\\Y21\\\\Day8\\:\\:\\$digitPatterns type has no value type specified in iterable type array\\.$#"
|
message: "#^Property trizz\\\\AdventOfCode\\\\Y21\\\\Day8\\:\\:\\$digitPatterns type has no value type specified in iterable type array\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Y21/Day8.php
|
path: data/Y21/day8/Day8.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Property trizz\\\\AdventOfCode\\\\Y21\\\\Day8\\:\\:\\$patternDigits type has no value type specified in iterable type array\\.$#"
|
message: "#^Property trizz\\\\AdventOfCode\\\\Y21\\\\Day8\\:\\:\\$patternDigits type has no value type specified in iterable type array\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Y21/Day8.php
|
path: data/Y21/day8/Day8.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Method trizz\\\\AdventOfCode\\\\Y23\\\\Day2\\:\\:getHand\\(\\) should return array\\<int, array\\<int, string\\>\\> but returns array\\<int, array\\<int, string\\>\\|string\\>\\.$#"
|
message: "#^Method trizz\\\\AdventOfCode\\\\Y23\\\\Day2\\:\\:getHand\\(\\) should return array\\<int, array\\<int, string\\>\\> but returns array\\<int, array\\<int, string\\>\\|string\\>\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: src/Y23/Day2.php
|
path: data/Y23/day2/Day2.php
|
||||||
|
@ -2,6 +2,7 @@ parameters:
|
|||||||
level: 8
|
level: 8
|
||||||
paths:
|
paths:
|
||||||
- src
|
- src
|
||||||
|
- data
|
||||||
|
|
||||||
includes:
|
includes:
|
||||||
- phpstan-baseline.neon
|
- phpstan-baseline.neon
|
||||||
|
@ -10,6 +10,7 @@ return static function (RectorConfig $rectorConfig): void {
|
|||||||
$rectorConfig->paths(
|
$rectorConfig->paths(
|
||||||
[
|
[
|
||||||
__DIR__.'/src',
|
__DIR__.'/src',
|
||||||
|
__DIR__.'/data',
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ abstract class AbstractDayCommand extends Command
|
|||||||
|
|
||||||
protected function loadClass(): Solution
|
protected function loadClass(): Solution
|
||||||
{
|
{
|
||||||
|
require_once sprintf('%s/Y%d/day%d/Day%d.php', DATA_DIR, $this->year, $this->day, $this->day);
|
||||||
$className = sprintf('%s\\Y%d\\Day%d', substr(__NAMESPACE__, 0, -9), $this->year, $this->day);
|
$className = sprintf('%s\\Y%d\\Day%d', substr(__NAMESPACE__, 0, -9), $this->year, $this->day);
|
||||||
|
|
||||||
/** @var Solution $class */
|
/** @var Solution $class */
|
||||||
|
@ -15,6 +15,8 @@ use function Laravel\Prompts\text;
|
|||||||
|
|
||||||
final class AddDay extends Command
|
final class AddDay extends Command
|
||||||
{
|
{
|
||||||
|
private string $dataDir;
|
||||||
|
|
||||||
#[\Override]
|
#[\Override]
|
||||||
protected function configure(): void
|
protected function configure(): void
|
||||||
{
|
{
|
||||||
@ -37,60 +39,57 @@ final class AddDay extends Command
|
|||||||
placeholder: '3',
|
placeholder: '3',
|
||||||
default: date('j'),
|
default: date('j'),
|
||||||
required: true,
|
required: true,
|
||||||
validate: fn ($value) => is_numeric($value) && $value > 0 && $value < 26 ? null : 'Please enter a valid day number.'
|
validate: static fn ($value): ?string => is_numeric($value) && $value > 0 && $value < 26 ? null : 'Please enter a valid day number.'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$example1Result = text(
|
$example1Result = text(
|
||||||
label: 'Please enter the result for example 1.',
|
label: 'Please enter the result for example 1.',
|
||||||
required: true,
|
required: true,
|
||||||
validate: fn ($value) => is_numeric($value) ? null : 'Please enter a valid number.'
|
validate: static fn ($value): ?string => is_numeric($value) ? null : 'Please enter a valid number.'
|
||||||
);
|
);
|
||||||
|
|
||||||
// Create short year.
|
// Create short year.
|
||||||
$year = strlen($year) === 4 ? substr($year, 2) : $year;
|
$year = strlen((string) $year) === 4 ? substr((string) $year, 2) : $year;
|
||||||
|
$this->dataDir = DATA_DIR.'/Y'.$year.'/day'.$day;
|
||||||
$output->writeln("Adding files for day {$day} of year '{$year}.");
|
$output->writeln(sprintf("Adding files for day %s of year '%s.", $day, $year));
|
||||||
|
|
||||||
$this
|
$this
|
||||||
->createDirs($year, $day)
|
->addDirsAndExampleFiles($year, $day)
|
||||||
->createClass($day, $year, $example1Result)
|
->createClass($day, $year, $example1Result);
|
||||||
->addExampleDirs($year, $day);
|
|
||||||
|
|
||||||
return Command::SUCCESS;
|
return Command::SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function createDirs(int $year, int $day): self
|
private function createClass(string $day, string $year, string $example1Result): self
|
||||||
{
|
{
|
||||||
if (!is_dir($dir = "src/Y{$year}") && !mkdir($dir) && !is_dir($dir)) {
|
$phpNamespace = new PhpNamespace('trizz\AdventOfCode\Y'.$year);
|
||||||
throw new \RuntimeException(sprintf('Directory "%s" was not created', $dir));
|
$classType = new ClassType('Day'.$day);
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_dir($dir = "data/Y{$year}/day{$day}") && !mkdir($dir) && !is_dir($dir)) {
|
$classType->setFinal()->setExtends(Solution::class);
|
||||||
throw new \RuntimeException(sprintf('Directory "%s" was not created', $dir));
|
|
||||||
}
|
$this->createClassProperties($classType, $example1Result);
|
||||||
|
$this->createClassMethods($classType);
|
||||||
|
|
||||||
|
$phpNamespace->add($classType);
|
||||||
|
$this->printClassToFile($classType, $year, $day, $phpNamespace);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function createClass(string $day, string $year, string $example1Result): self
|
private function addDirsAndExampleFiles(mixed $year, mixed $day): self
|
||||||
{
|
{
|
||||||
$namespace = new PhpNamespace('trizz\AdventOfCode\Y'.$year);
|
if (!is_dir($this->dataDir) && !mkdir($this->dataDir) && !is_dir($this->dataDir)) {
|
||||||
$class = new ClassType('Day'.$day);
|
throw new \RuntimeException(sprintf('Directory "%s" was not created', $this->dataDir));
|
||||||
|
}
|
||||||
|
|
||||||
$class->setFinal()
|
touch($this->dataDir.'/example.txt');
|
||||||
->setExtends(Solution::class);
|
touch($this->dataDir.'/data.txt');
|
||||||
|
|
||||||
$this->createClassProperties($class, $example1Result);
|
|
||||||
$this->createClassMethods($class);
|
|
||||||
|
|
||||||
$namespace->add($class);
|
|
||||||
$this->printClassToFile($class, $year, $day, $namespace);
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createClassProperties(ClassType $class, string $example1Result): void
|
private function createClassProperties(ClassType $classType, string $example1Result): void
|
||||||
{
|
{
|
||||||
$properties = [
|
$properties = [
|
||||||
'part1ExampleResult' => $example1Result,
|
'part1ExampleResult' => $example1Result,
|
||||||
@ -100,7 +99,7 @@ final class AddDay extends Command
|
|||||||
];
|
];
|
||||||
|
|
||||||
foreach ($properties as $name => $value) {
|
foreach ($properties as $name => $value) {
|
||||||
$class
|
$classType
|
||||||
->addProperty($name, $value)
|
->addProperty($name, $value)
|
||||||
->setPublic()
|
->setPublic()
|
||||||
->setStatic()
|
->setStatic()
|
||||||
@ -108,43 +107,29 @@ final class AddDay extends Command
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createClassMethods(ClassType $class): void
|
private function createClassMethods(ClassType $classType): void
|
||||||
{
|
{
|
||||||
$methods = ['part1', 'part2'];
|
$methods = ['part1', 'part2'];
|
||||||
|
|
||||||
foreach ($methods as $methodName) {
|
foreach ($methods as $method) {
|
||||||
$class
|
$classType
|
||||||
->addMethod($methodName)
|
->addMethod($method)
|
||||||
->setReturnType('int')
|
->setReturnType('int')
|
||||||
->setBody('return -1;')
|
->setBody('return -1;')
|
||||||
->addParameter('data')->setType('array');
|
->addParameter('data')->setType('array');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function printClassToFile(ClassType $class, string $year, string $day, PhpNamespace $namespace): void
|
private function printClassToFile(ClassType $classType, string $year, string $day, PhpNamespace $phpNamespace): void
|
||||||
{
|
{
|
||||||
$printer = new Printer();
|
$printer = new Printer();
|
||||||
$printer->indentation = ' ';
|
$printer->indentation = ' ';
|
||||||
|
|
||||||
$filename = __DIR__.'/../Y'.$year.'/Day'.$day.'.php';
|
$filename = $this->dataDir.'/Day'.$day.'.php';
|
||||||
if (file_exists($filename)) {
|
if (file_exists($filename)) {
|
||||||
throw new \RuntimeException("File {$filename} already exists.");
|
throw new \RuntimeException(sprintf('File %s already exists.', $filename));
|
||||||
}
|
}
|
||||||
|
|
||||||
file_put_contents($filename, '<?php'.PHP_EOL.$printer->printNamespace($namespace));
|
file_put_contents($filename, '<?php'.PHP_EOL.$printer->printNamespace($phpNamespace));
|
||||||
}
|
|
||||||
|
|
||||||
protected function addExampleDirs(mixed $year, mixed $day): self
|
|
||||||
{
|
|
||||||
$dataDir = __DIR__.'/../../data/Y'.$year.'/day'.$day;
|
|
||||||
|
|
||||||
if (!is_dir($dataDir) && !mkdir($dataDir) && !is_dir($dataDir)) {
|
|
||||||
throw new \RuntimeException(sprintf('Directory "%s" was not created', $dataDir));
|
|
||||||
}
|
|
||||||
|
|
||||||
touch($dataDir.'/example.txt');
|
|
||||||
touch($dataDir.'/data.txt');
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
3
src/bootstrap.php
Normal file
3
src/bootstrap.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
define('DATA_DIR', dirname(__DIR__).'/data');
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
use trizz\AdventOfCode\Solution;
|
use trizz\AdventOfCode\Solution;
|
||||||
|
|
||||||
expect()->extend('toBeOne', fn() => $this->toBe(1));
|
expect()->extend('toBeOne', fn () => $this->toBe(1));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@ -45,12 +45,16 @@ expect()->extend('toBeOne', fn() => $this->toBe(1));
|
|||||||
function loadSolutions(int $year): array
|
function loadSolutions(int $year): array
|
||||||
{
|
{
|
||||||
$classes = [];
|
$classes = [];
|
||||||
if (is_dir(__DIR__.'/../src/Y'.$year)) {
|
for ($day = 1; $day < 26; ++$day) {
|
||||||
for ($day = 1; $day < 26; ++$day) {
|
$classFile = sprintf('%s/../data/Y%d/day%d/Day%d.php', __DIR__, $year, $day, $day);
|
||||||
$className = sprintf('trizz\\AdventOfCode\\Y%d\\Day%d', $year, $day);
|
if (!file_exists($classFile)) {
|
||||||
if (class_exists($className)) {
|
continue;
|
||||||
$classes["Year '".$year.' / Day '.$day] = $className;
|
}
|
||||||
}
|
|
||||||
|
require_once $classFile;
|
||||||
|
$className = sprintf('trizz\\AdventOfCode\\Y%d\\Day%d', $year, $day);
|
||||||
|
if (class_exists($className)) {
|
||||||
|
$classes["Year '".$year.' / Day '.$day] = $className;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +64,7 @@ function loadSolutions(int $year): array
|
|||||||
function runTestForDay($class, string $name, $testDataMethod, $expectedResult, $isExampleData): void
|
function runTestForDay($class, string $name, $testDataMethod, $expectedResult, $isExampleData): void
|
||||||
{
|
{
|
||||||
$fullName = $name.' / '.($isExampleData ? 'Example' : 'Input');
|
$fullName = $name.' / '.($isExampleData ? 'Example' : 'Input');
|
||||||
test($fullName, function () use ($isExampleData, $class, $testDataMethod, $expectedResult) : void {
|
test($fullName, function () use ($isExampleData, $class, $testDataMethod, $expectedResult): void {
|
||||||
expect($class->{$testDataMethod}($isExampleData))->toBe($class::${$expectedResult});
|
expect($class->{$testDataMethod}($isExampleData))->toBe($class::${$expectedResult});
|
||||||
})->skip(!$class->hasExampleData() || $class::${$expectedResult} === null);
|
})->skip(!$class->hasExampleData() || $class::${$expectedResult} === null);
|
||||||
}
|
}
|
||||||
@ -69,7 +73,7 @@ function testYear(int $year): void
|
|||||||
{
|
{
|
||||||
$solutions = loadSolutions($year);
|
$solutions = loadSolutions($year);
|
||||||
foreach ($solutions as $name => $className) {
|
foreach ($solutions as $name => $className) {
|
||||||
describe('Y'.$year, static function () use ($name, $className) : void {
|
describe('Y'.$year, static function () use ($name, $className): void {
|
||||||
/** @var Solution $class */
|
/** @var Solution $class */
|
||||||
$class = new $className();
|
$class = new $className();
|
||||||
$class->loadData();
|
$class->loadData();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user