From 3501f6f574fd3316d7c6b1b7e7604c953424f125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20M=C3=BCller?= Date: Fri, 15 Dec 2023 18:21:37 +0100 Subject: [PATCH] Added solution for "Day 15: Lens Library", part 1 --- AdventOfCode.lpi | 4 ++ AdventOfCode.lpr | 3 +- solvers/ULensLibrary.pas | 80 +++++++++++++++++++++++++++++++++ tests/AdventOfCodeFPCUnit.lpi | 4 ++ tests/AdventOfCodeFPCUnit.lpr | 4 +- tests/ULensLibraryTestCases.pas | 78 ++++++++++++++++++++++++++++++++ 6 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 solvers/ULensLibrary.pas create mode 100644 tests/ULensLibraryTestCases.pas diff --git a/AdventOfCode.lpi b/AdventOfCode.lpi index 606b61b..de7ba4b 100644 --- a/AdventOfCode.lpi +++ b/AdventOfCode.lpi @@ -93,6 +93,10 @@ + + + + diff --git a/AdventOfCode.lpr b/AdventOfCode.lpr index 338ddf6..583af79 100644 --- a/AdventOfCode.lpr +++ b/AdventOfCode.lpr @@ -25,7 +25,7 @@ uses {$ENDIF} Classes, SysUtils, CustApp, USolver, UTrebuchet, UCubeConundrum, UGearRatios, UScratchcards, UGiveSeedFertilizer, UWaitForIt, UCamelCards, UHauntedWasteland, UNumberTheory, UMirageMaintenance, UPipeMaze, UCosmicExpansion, - UHotSprings, UPointOfIncidence, UParabolicReflectorDish; + UHotSprings, UPointOfIncidence, UParabolicReflectorDish, ULensLibrary; type @@ -64,6 +64,7 @@ begin engine.RunAndFree(THotSprings.Create); engine.RunAndFree(TPointOfIncidence.Create); engine.RunAndFree(TParabolicReflectorDish.Create); + engine.RunAndFree(TLensLibrary.Create); engine.Free; end; diff --git a/solvers/ULensLibrary.pas b/solvers/ULensLibrary.pas new file mode 100644 index 0000000..d6831d7 --- /dev/null +++ b/solvers/ULensLibrary.pas @@ -0,0 +1,80 @@ +{ + Solutions to the Advent Of Code. + Copyright (C) 2023 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 . +} + +unit ULensLibrary; + +{$mode ObjFPC}{$H+} + +interface + +uses + Classes, SysUtils, USolver; + +type + + { TLensLibrary } + + TLensLibrary = class(TSolver) + private + function CalcHash(const AInput: string): Byte; + public + procedure ProcessDataLine(const ALine: string); override; + procedure Finish; override; + function GetDataFileName: string; override; + function GetPuzzleName: string; override; + end; + +implementation + +{ TLensLibrary } + +function TLensLibrary.CalcHash(const AInput: string): Byte; +var + c: Char; +begin + Result := 0; + for c in AInput do + Result := ((Result + Ord(c)) * 17) and 255; +end; + +procedure TLensLibrary.ProcessDataLine(const ALine: string); +var + split: TStringArray; + s: string; +begin + split := ALine.Split(','); + for s in split do + Inc(FPart1, CalcHash(s)); +end; + +procedure TLensLibrary.Finish; +begin + +end; + +function TLensLibrary.GetDataFileName: string; +begin + Result := 'lens_library.txt'; +end; + +function TLensLibrary.GetPuzzleName: string; +begin + Result := 'Day 15: Lens Library'; +end; + +end. + diff --git a/tests/AdventOfCodeFPCUnit.lpi b/tests/AdventOfCodeFPCUnit.lpi index bc6bfbd..eedd017 100644 --- a/tests/AdventOfCodeFPCUnit.lpi +++ b/tests/AdventOfCodeFPCUnit.lpi @@ -100,6 +100,10 @@ + + + + diff --git a/tests/AdventOfCodeFPCUnit.lpr b/tests/AdventOfCodeFPCUnit.lpr index 08a515b..ab3a37c 100644 --- a/tests/AdventOfCodeFPCUnit.lpr +++ b/tests/AdventOfCodeFPCUnit.lpr @@ -5,8 +5,8 @@ program AdventOfCodeFPCUnit; uses Interfaces, Forms, GuiTestRunner, USolver, UBaseTestCases, UTrebuchetTestCases, UCubeConundrumTestCases, UGearRatiosTestCases, UScratchcardsTestCases, UGiveSeedFertilizerTestCases, UWaitForItTestCases, UCamelCardsTestCases, - UHauntedWastelandTestCases, UMirageMaintenanceTestCases, UPipeMazeTestCases, UCosmicExpansionTestCases, - UHotSpringsTestCases, UPointOfIncidenceTestCases, UParabolicReflectorDishTestCases; + UHauntedWastelandTestCases, UMirageMaintenanceTestCases, UPipeMazeTestCases, UCosmicExpansionTestCases, + UHotSpringsTestCases, UPointOfIncidenceTestCases, UParabolicReflectorDishTestCases, ULensLibraryTestCases; {$R *.res} diff --git a/tests/ULensLibraryTestCases.pas b/tests/ULensLibraryTestCases.pas new file mode 100644 index 0000000..f22a345 --- /dev/null +++ b/tests/ULensLibraryTestCases.pas @@ -0,0 +1,78 @@ +{ + Solutions to the Advent Of Code. + Copyright (C) 2023 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 . +} + +unit ULensLibraryTestCases; + +{$mode ObjFPC}{$H+} + +interface + +uses + Classes, SysUtils, fpcunit, testregistry, USolver, UBaseTestCases, ULensLibrary; + +type + + { TLensLibraryFullDataTestCase } + + TLensLibraryFullDataTestCase = class(TEngineBaseTest) + protected + function CreateSolver: ISolver; override; + published + procedure TestPart1; + end; + + { TLensLibraryExampleTestCase } + + TLensLibraryExampleTestCase = class(TExampleEngineBaseTest) + protected + function CreateSolver: ISolver; override; + published + procedure TestPart1; + end; + +implementation + +{ TLensLibraryFullDataTestCase } + +function TLensLibraryFullDataTestCase.CreateSolver: ISolver; +begin + Result := TLensLibrary.Create; +end; + +procedure TLensLibraryFullDataTestCase.TestPart1; +begin + AssertEquals(519041, FSolver.GetResultPart1); +end; + +{ TLensLibraryExampleTestCase } + +function TLensLibraryExampleTestCase.CreateSolver: ISolver; +begin + Result := TLensLibrary.Create; +end; + +procedure TLensLibraryExampleTestCase.TestPart1; +begin + AssertEquals(1320, FSolver.GetResultPart1); +end; + +initialization + + RegisterTest(TLensLibraryFullDataTestCase); + RegisterTest(TLensLibraryExampleTestCase); +end. +