From 3b7bfa3103df55a42a9164465c4b750d0f1f36a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20M=C3=BCller?= Date: Sat, 2 Dec 2023 17:50:06 +0100 Subject: [PATCH] Updated the solution for day 1, part 1 to facilitate part 2 --- puzzles/utrebuchet.pas | 69 ++++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/puzzles/utrebuchet.pas b/puzzles/utrebuchet.pas index 7bbbaeb..7abb7b5 100644 --- a/puzzles/utrebuchet.pas +++ b/puzzles/utrebuchet.pas @@ -33,9 +33,12 @@ type FValue: Integer; procedure RunSolution; procedure ProcessDataLine(const ALine: string); + function FindFirstDigit(const ALine: string; out OEndIndex: Integer): Integer; + function FindLastDigit(const ALine: string; const AFirstDigit, AFirstDigitEndIndex: Integer): Integer; + function CheckDigit(const ALine: string; const AIndex: Integer; out ODigit, OEndIndex: Integer): Boolean; public - class procedure Solve; static; constructor Create; + class procedure Solve; static; end; implementation @@ -58,28 +61,59 @@ begin finally CloseFile(data) end; - WriteLn(FValue); + WriteLn('Part 1: ', FValue); end; procedure TTrebuchet.ProcessDataLine(const ALine: string); var - c: Char; - first, last: Integer; + first, endIndex, last: Integer; begin - first := -1; - last := -1; - for c in ALine do - begin - if c in ['0'..'9'] then - begin - last := StrToInt(c); - if first < 0 then - first := last; - end; - end; + first := FindFirstDigit(ALine, endIndex); + last := FindLastDigit(ALine, first, endIndex); Inc(FValue, first * 10 + last); end; +function TTrebuchet.FindFirstDigit(const ALine: string; out OEndIndex: Integer): Integer; +var + i: Integer; +begin + for i := 1 to ALine.Length do + if CheckDigit(ALine, i, Result, OEndIndex) then + Exit; +end; + +function TTrebuchet.FindLastDigit(const ALine: string; const AFirstDigit, AFirstDigitEndIndex: Integer): Integer; +var + i, endIndex: Integer; +begin + for i := ALine.Length downto AFirstDigitEndIndex + 1 do + if CheckDigit(ALine, i, Result, endIndex) then + Exit; + + // Returns the first digit if no digit was found after the end index of the first digit. + Result := AFirstDigit; +end; + +function TTrebuchet.CheckDigit(const ALine: string; const AIndex: Integer; out ODigit, OEndIndex: Integer): Boolean; +begin + if ALine[AIndex] in ['0'..'9'] then + begin + ODigit := StrToInt(ALine[AIndex]); + OEndIndex := AIndex; + Result := true; + end + else begin + ODigit := -1; + OEndIndex := -1; + Result := false; + end; +end; + +constructor TTrebuchet.Create; +begin + FValue := 0; +end; + class procedure TTrebuchet.Solve; var trebuchet: TTrebuchet; @@ -90,10 +124,5 @@ begin trebuchet.Free; end; -constructor TTrebuchet.Create; -begin - FValue := 0; -end; - end.