{ Solutions to the Advent Of Code. Copyright (C) 2023-2024 Stefan Müller This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . } program AdventOfCode; {$mode objfpc}{$H+} uses {$IFDEF UNIX} cthreads, {$ENDIF} Classes, SysUtils, CustApp, Generics.Collections, USolver, UTrebuchet, UCubeConundrum, UGearRatios, UScratchcards, UGiveSeedFertilizer, UWaitForIt, UCamelCards, UHauntedWasteland, UMirageMaintenance, UPipeMaze, UCosmicExpansion, UHotSprings, UPointOfIncidence, UParabolicReflectorDish, ULensLibrary, UFloorWillBeLava, UClumsyCrucible, ULavaductLagoon, UAplenty, UPulsePropagation, UStepCounter, USandSlabs, ULongWalk, UNeverTellMeTheOdds, USnowverload; type { TAdventOfCode } TAdventOfCode = class(TCustomApplication) private procedure RunPuzzleSolutions; protected procedure DoRun; override; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; procedure WriteHelp; virtual; end; { TAdventOfCode } procedure TAdventOfCode.RunPuzzleSolutions; var engine: TSolverEngine; solvers: specialize TList; p: string; n: Integer; begin WriteLn('### Advent of Code 2023 ###'); engine := TSolverEngine.Create(TStringArray.Create( 'data', ConcatPaths(['..', '..', 'data']) )); 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); 21: engine.RunAndFree(TStepCounter.Create); 22: engine.RunAndFree(TSandSlabs.Create); 23: engine.RunAndFree(TLongWalk.Create); 24: engine.RunAndFree(TNeverTellMeTheOdds.Create); 25: engine.RunAndFree(TSnowverload.Create); end; engine.Free; solvers.Free; WriteLn; end; procedure TAdventOfCode.DoRun; var ErrorMsg: String; begin // quick check parameters ErrorMsg := CheckOptions('hp:', ['help', 'puzzle:']); if ErrorMsg <> '' then begin ShowException(Exception.Create(ErrorMsg)); Terminate; Exit; end; // parse parameters if HasOption('h', 'help') then begin WriteHelp; Terminate; Exit; end; RunPuzzleSolutions; // stop program loop Terminate; end; constructor TAdventOfCode.Create(TheOwner: TComponent); begin inherited Create(TheOwner); StopOnException := True; end; destructor TAdventOfCode.Destroy; begin inherited Destroy; end; procedure TAdventOfCode.WriteHelp; begin 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 Application: TAdventOfCode; begin Application := TAdventOfCode.Create(nil); Application.Title := 'Advent of Code 2023'; Application.Run; Application.Free; end.