diff --git a/AdventOfCode.lpi b/AdventOfCode.lpi
index 8751a01..8c3808e 100644
--- a/AdventOfCode.lpi
+++ b/AdventOfCode.lpi
@@ -30,9 +30,12 @@
-
+
+
+
+
+
-
diff --git a/AdventOfCode.lpr b/AdventOfCode.lpr
index 08750d6..d3d63eb 100644
--- a/AdventOfCode.lpr
+++ b/AdventOfCode.lpr
@@ -23,7 +23,8 @@ uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
- Classes, SysUtils, CustApp, UTrebuchet;
+ Classes, SysUtils, CustApp,
+ UTrebuchet, UCubeConundrum;
type
@@ -44,8 +45,9 @@ type
procedure TAdventOfCode.RunPuzzleSolutions;
begin
- WriteLn('Advent of Code 2023');
- TTrebuchet.Solve;
+ WriteLn('### Advent of Code 2023 ###');
+ TTrebuchet.Run;
+ TCubeConundrum.Run;
end;
procedure TAdventOfCode.DoRun;
diff --git a/puzzles/UCubeConundrum.pas b/puzzles/UCubeConundrum.pas
new file mode 100644
index 0000000..36e05f9
--- /dev/null
+++ b/puzzles/UCubeConundrum.pas
@@ -0,0 +1,138 @@
+{
+ 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 UCubeConundrum;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils;
+
+const
+ CMaxRed = 12;
+ CMaxGreen = 13;
+ CMaxBlue = 14;
+
+type
+
+ { TCubeConundrum }
+
+ TCubeConundrum = class(TObject)
+ private
+ FValue: Integer;
+ procedure ProcessDataLine(const ALine: string);
+ procedure ProcessGame(const id: Integer; const draws: TStringArray);
+ function ProcessDraw(const cubes: TStringArray): Boolean;
+ public
+ function Solve: Integer;
+ class procedure Run; static;
+ end;
+
+implementation
+
+{ TCubeConundrum }
+
+procedure TCubeConundrum.ProcessDataLine(const ALine: string);
+var
+ gameSplit, subSplit: TStringArray;
+ id: Integer;
+begin
+ gameSplit := ALine.Split(':');
+ subSplit := gameSplit[0].Split(' ');
+ id := StrToInt(subSplit[1]);
+ subSplit := gameSplit[1].Split(';');
+ ProcessGame(id, subSplit);
+end;
+
+procedure TCubeConundrum.ProcessGame(const id: Integer; const draws: TStringArray);
+var
+ draw: string;
+ drawSplit: TStringArray;
+begin
+ for draw in draws do
+ begin
+ drawSplit := draw.Split(',');
+ if not ProcessDraw(drawSplit) then
+ Exit;
+ end;
+
+ // All draws fulfill maxima.
+ Inc(FValue, id);
+end;
+
+function TCubeConundrum.ProcessDraw(const cubes: TStringArray): Boolean;
+var
+ cubeColor: string;
+ colorSplit: TStringArray;
+ max: Integer;
+begin
+ for cubeColor in cubes do
+ begin
+ colorSplit := cubeColor.Trim.Split(' ');
+ if colorSplit[1] = 'red' then
+ max := CMaxRed
+ else if colorSplit[1] = 'green' then
+ max := CMaxGreen
+ else if colorSplit[1] = 'blue' then
+ max := CMaxBlue;
+
+ if StrToInt(colorSplit[0]) > max then
+ begin
+ Result := False;
+ Exit;
+ end;
+ end;
+
+ Result := True;
+end;
+
+function TCubeConundrum.Solve: Integer;
+var
+ data: TextFile;
+ s: string;
+begin
+ FValue := 0;
+
+ AssignFile(data, ConcatPaths(['data', 'cube_conundrum.txt']));
+ try
+ reset(data);
+ while (not EOF(data)) do
+ begin
+ readln(data, s);
+ ProcessDataLine(s);
+ end;
+ finally
+ CloseFile(data)
+ end;
+
+ Result := FValue;
+end;
+
+class procedure TCubeConundrum.Run;
+var
+ cubeConundrum: TCubeConundrum;
+begin
+ WriteLn;
+ WriteLn('--- Day 2: Cube Conundrum ---');
+ cubeConundrum := TCubeConundrum.Create;
+ WriteLn('Part 1: ', cubeConundrum.Solve);
+ cubeConundrum.Free;
+end;
+
+end.