Added initial attempt for "Day 12: Hot Springs", part 2 including test cases

This commit is contained in:
2023-12-13 12:32:12 +01:00
parent c84d3e6a2d
commit c0ee7894ae
2 changed files with 109 additions and 28 deletions

View File

@@ -30,6 +30,7 @@ const
CWildcardChar = '?';
COperationalPatternChars = [COperationalChar, CWildcardChar];
CDamagedPatternChars = [CDamagedChar, CWildcardChar];
CPart2Repetition = 4;
type
@@ -40,7 +41,7 @@ type
FValidation: specialize TList<Integer>;
FSpringPattern: string;
procedure ExtendArrangement(const AArrangement: string; const ARemainingFreeOperationalCount, ACurrentValidationIndex:
Integer);
Integer; var AArrangementCount: Int64);
function TryAppendOperationalChar(var AArrangement: string): Boolean;
function TryAppendValidationBlock(var AArrangement: string; const ALength: Integer): Boolean;
public
@@ -57,19 +58,19 @@ implementation
{ THotSprings }
procedure THotSprings.ExtendArrangement(const AArrangement: string; const ARemainingFreeOperationalCount,
ACurrentValidationIndex: Integer);
ACurrentValidationIndex: Integer; var AArrangementCount: Int64);
var
match: Boolean;
temp: string;
begin
if Length(AArrangement) = Length(FSpringPattern) then
Inc(FPart1)
Inc(AArrangementCount)
else begin
temp := AArrangement;
// Tries to append a dot (operational) to the current arrangement.
if (ARemainingFreeOperationalCount > 0) and TryAppendOperationalChar(temp) then
begin
ExtendArrangement(temp, ARemainingFreeOperationalCount - 1, ACurrentValidationIndex);
ExtendArrangement(temp, ARemainingFreeOperationalCount - 1, ACurrentValidationIndex, AArrangementCount);
end;
// Tries to append the current validation block (damaged) to the current arrangement.
@@ -85,7 +86,7 @@ begin
match := False;
if match then
ExtendArrangement(temp, ARemainingFreeOperationalCount, ACurrentValidationIndex + 1);
ExtendArrangement(temp, ARemainingFreeOperationalCount, ACurrentValidationIndex + 1, AArrangementCount);
end;
end;
end;
@@ -132,7 +133,7 @@ end;
procedure THotSprings.ProcessDataLine(const ALine: string);
var
split: TStringArray;
i, val, maxFreeOperationalCount: Integer;
i, j, val, maxFreeOperationalCount: Integer;
begin
FValidation.Clear;
split := ALine.Split([' ', ',']);
@@ -146,7 +147,19 @@ begin
Dec(maxFreeOperationalCount, val);
end;
ExtendArrangement('', maxFreeOperationalCount, 0);
ExtendArrangement('', maxFreeOperationalCount, 0, FPart1);
WriteLn('Part 1: ', FPart1);
for i := 1 to CPart2Repetition do
begin
FSpringPattern := FSpringPattern + CWildcardChar + split[0];
for j := 0 to Length(split) - 2 do
FValidation.Add(FValidation[j]);
end;
maxFreeOperationalCount := (CPart2Repetition + 1) * maxFreeOperationalCount;
ExtendArrangement('', maxFreeOperationalCount, 0, FPart2);
WriteLn('Part 2: ', FPart2);
end;
procedure THotSprings.Finish;