Added solution for "Day 15: Lens Library", part 1

This commit is contained in:
Stefan Müller 2023-12-15 18:21:37 +01:00 committed by Stefan Müller
parent d8b298dad8
commit 3501f6f574
6 changed files with 170 additions and 3 deletions

View File

@ -93,6 +93,10 @@
<Filename Value="solvers\UParabolicReflectorDish.pas"/> <Filename Value="solvers\UParabolicReflectorDish.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
</Unit> </Unit>
<Unit>
<Filename Value="solvers\ULensLibrary.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>

View File

@ -25,7 +25,7 @@ uses
{$ENDIF} {$ENDIF}
Classes, SysUtils, CustApp, USolver, UTrebuchet, UCubeConundrum, UGearRatios, UScratchcards, UGiveSeedFertilizer, Classes, SysUtils, CustApp, USolver, UTrebuchet, UCubeConundrum, UGearRatios, UScratchcards, UGiveSeedFertilizer,
UWaitForIt, UCamelCards, UHauntedWasteland, UNumberTheory, UMirageMaintenance, UPipeMaze, UCosmicExpansion, UWaitForIt, UCamelCards, UHauntedWasteland, UNumberTheory, UMirageMaintenance, UPipeMaze, UCosmicExpansion,
UHotSprings, UPointOfIncidence, UParabolicReflectorDish; UHotSprings, UPointOfIncidence, UParabolicReflectorDish, ULensLibrary;
type type
@ -64,6 +64,7 @@ begin
engine.RunAndFree(THotSprings.Create); engine.RunAndFree(THotSprings.Create);
engine.RunAndFree(TPointOfIncidence.Create); engine.RunAndFree(TPointOfIncidence.Create);
engine.RunAndFree(TParabolicReflectorDish.Create); engine.RunAndFree(TParabolicReflectorDish.Create);
engine.RunAndFree(TLensLibrary.Create);
engine.Free; engine.Free;
end; end;

80
solvers/ULensLibrary.pas Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
}
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.

View File

@ -100,6 +100,10 @@
<Filename Value="UParabolicReflectorDishTestCases.pas"/> <Filename Value="UParabolicReflectorDishTestCases.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
</Unit> </Unit>
<Unit>
<Filename Value="ULensLibraryTestCases.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>

View File

@ -5,8 +5,8 @@ program AdventOfCodeFPCUnit;
uses uses
Interfaces, Forms, GuiTestRunner, USolver, UBaseTestCases, UTrebuchetTestCases, UCubeConundrumTestCases, Interfaces, Forms, GuiTestRunner, USolver, UBaseTestCases, UTrebuchetTestCases, UCubeConundrumTestCases,
UGearRatiosTestCases, UScratchcardsTestCases, UGiveSeedFertilizerTestCases, UWaitForItTestCases, UCamelCardsTestCases, UGearRatiosTestCases, UScratchcardsTestCases, UGiveSeedFertilizerTestCases, UWaitForItTestCases, UCamelCardsTestCases,
UHauntedWastelandTestCases, UMirageMaintenanceTestCases, UPipeMazeTestCases, UCosmicExpansionTestCases, UHauntedWastelandTestCases, UMirageMaintenanceTestCases, UPipeMazeTestCases, UCosmicExpansionTestCases,
UHotSpringsTestCases, UPointOfIncidenceTestCases, UParabolicReflectorDishTestCases; UHotSpringsTestCases, UPointOfIncidenceTestCases, UParabolicReflectorDishTestCases, ULensLibraryTestCases;
{$R *.res} {$R *.res}

View File

@ -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 <http://www.gnu.org/licenses/>.
}
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.