diff --git a/AdventOfCode.lpr b/AdventOfCode.lpr index 753b82f..483f69d 100644 --- a/AdventOfCode.lpr +++ b/AdventOfCode.lpr @@ -23,10 +23,11 @@ uses {$IFDEF UNIX} cthreads, {$ENDIF} - Classes, SysUtils, CustApp, USolver, UTrebuchet, UCubeConundrum, UGearRatios, UScratchcards, UGiveSeedFertilizer, - UWaitForIt, UCamelCards, UHauntedWasteland, UNumberTheory, UMirageMaintenance, UPipeMaze, UCosmicExpansion, - UHotSprings, UPointOfIncidence, UParabolicReflectorDish, ULensLibrary, UFloorWillBeLava, UClumsyCrucible, - ULavaductLagoon, UAplenty, UPulsePropagation; + Classes, SysUtils, CustApp, Generics.Collections, USolver, + UTrebuchet, UCubeConundrum, UGearRatios, UScratchcards, UGiveSeedFertilizer, UWaitForIt, UCamelCards, + UHauntedWasteland, UNumberTheory, UMirageMaintenance, UPipeMaze, UCosmicExpansion, UHotSprings, UPointOfIncidence, + UParabolicReflectorDish, ULensLibrary, UFloorWillBeLava, UClumsyCrucible, ULavaductLagoon, UAplenty, + UPulsePropagation; type @@ -48,30 +49,51 @@ type procedure TAdventOfCode.RunPuzzleSolutions; var engine: TSolverEngine; + solvers: specialize TList; + p: string; + n: Integer; begin WriteLn('### Advent of Code 2023 ###'); engine := TSolverEngine.Create('data'); - engine.RunAndFree(TTrebuchet.Create); - engine.RunAndFree(TCubeConundrum.Create); - engine.RunAndFree(TGearRatios.Create); - engine.RunAndFree(TScratchcards.Create); - engine.RunAndFree(TGiveSeedFertilizer.Create); - engine.RunAndFree(TWaitForIt.Create); - engine.RunAndFree(TCamelCards.Create); - engine.RunAndFree(THauntedWasteland.Create); - engine.RunAndFree(TMirageMaintenance.Create); - engine.RunAndFree(TPipeMaze.Create); - engine.RunAndFree(TCosmicExpansion.Create); - engine.RunAndFree(THotSprings.Create); - engine.RunAndFree(TPointOfIncidence.Create); - engine.RunAndFree(TParabolicReflectorDish.Create); - engine.RunAndFree(TLensLibrary.Create); - engine.RunAndFree(TFloorWillBeLava.Create); - engine.RunAndFree(TClumsyCrucible.Create); - engine.RunAndFree(TLavaductLagoon.Create); - engine.RunAndFree(TAplenty.Create); - engine.RunAndFree(TPulsePropagation.Create); + + solvers := specialize TList.Create; + if HasOption('p', 'puzzle') then + begin + for p in GetOptionValues('p', 'puzzle') do + if TryStrToInt(p, n) then + solvers.Add(n); + end + else + for n := 1 to 25 do + solvers.Add(n); + + for n in solvers do + case n of + 1: engine.RunAndFree(TTrebuchet.Create); + 2: engine.RunAndFree(TCubeConundrum.Create); + 3: engine.RunAndFree(TGearRatios.Create); + 4: engine.RunAndFree(TScratchcards.Create); + 5: engine.RunAndFree(TGiveSeedFertilizer.Create); + 6: engine.RunAndFree(TWaitForIt.Create); + 7: engine.RunAndFree(TCamelCards.Create); + 8: engine.RunAndFree(THauntedWasteland.Create); + 9: engine.RunAndFree(TMirageMaintenance.Create); + 10: engine.RunAndFree(TPipeMaze.Create); + 11: engine.RunAndFree(TCosmicExpansion.Create); + 12: engine.RunAndFree(THotSprings.Create); + 13: engine.RunAndFree(TPointOfIncidence.Create); + 14: engine.RunAndFree(TParabolicReflectorDish.Create); + 15: engine.RunAndFree(TLensLibrary.Create); + 16: engine.RunAndFree(TFloorWillBeLava.Create); + 17: engine.RunAndFree(TClumsyCrucible.Create); + 18: engine.RunAndFree(TLavaductLagoon.Create); + 19: engine.RunAndFree(TAplenty.Create); + 20: engine.RunAndFree(TPulsePropagation.Create); + end; + engine.Free; + solvers.Free; + WriteLn; end; procedure TAdventOfCode.DoRun; @@ -79,7 +101,7 @@ var ErrorMsg: String; begin // quick check parameters - ErrorMsg := CheckOptions('h', 'help'); + ErrorMsg := CheckOptions('hp:', ['help', 'puzzle:']); if ErrorMsg <> '' then begin ShowException(Exception.Create(ErrorMsg)); @@ -95,7 +117,6 @@ begin Exit; end; - { add your program here } RunPuzzleSolutions; // stop program loop @@ -115,8 +136,13 @@ end; procedure TAdventOfCode.WriteHelp; begin - { add your help code here } - writeln('Usage: ', ExeName, ' -h'); + WriteLn('Usage: ', ExeName, ' [Options]'); + WriteLn('Options:'); + WriteLn(' --help, -h'); + WriteLn(' Shows this usage help.'); + WriteLn(' --puzzle=, -p '); + WriteLn(' Instead of running all solvers, only run the one for day .'); + WriteLn(' Integer from 1 to 25. Can be specified multiple times.'); end; var