Added another small performance improvement for day 14

This commit is contained in:
Stefan Müller 2023-12-18 21:13:50 +01:00 committed by Stefan Müller
parent 29663ad82e
commit 95de6f1f7b
1 changed files with 22 additions and 15 deletions

View File

@ -204,27 +204,34 @@ end;
procedure TPlatform.Tilt(constref AIntervals: TCubeRockIntervalsList; constref ASource, ATarget: procedure TPlatform.Tilt(constref AIntervals: TCubeRockIntervalsList; constref ASource, ATarget:
TIntegersList; const AUp: Boolean); TIntegersList; const AUp: Boolean);
var var
i, rock, nextFree, step: Integer; i, j, rock, nextFree, direction: Integer;
interval: TCubeRockInterval;
begin begin
if AUp then if AUp then
step := 1 direction := 1
else else
step := -1; direction := -1;
for i := 0 to AIntervals.Count - 1 do for i := 0 to AIntervals.Count - 1 do
begin begin
for interval in AIntervals[i] do j := 0;
begin
if AUp then if AUp then
nextFree := interval.Start nextFree := AIntervals[i][j].Start
else else
nextFree := interval.Stop; nextFree := AIntervals[i][j].Stop;
for rock in ASource[i] do for rock in ASource[i] do
if (interval.Start <= rock) and (rock <= interval.Stop) then
begin begin
ATarget[nextFree].Add(i); // Goes to next interval if rock is not in current interval.
Inc(nextFree, step); while AIntervals[i][j].Stop < rock do
begin
Inc(j);
if AUp then
nextFree := AIntervals[i][j].Start
else
nextFree := AIntervals[i][j].Stop;
end; end;
// rock must now be in current interval.
ATarget[nextFree].Add(i);
Inc(nextFree, direction);
end; end;
ASource[i].Clear; ASource[i].Clear;
end; end;