Water collected between towers: Difference between revisions

No edit summary
Line 1,894:
<syntaxhighlight lang="Delphi">
 
var IATowers1: array [0..94] of integer = (1, 5, 3, 7, 2, 6, 4, 5, 9, 1, 2);
var Towers2: array [0..9] of integer = (5, 3, 7, 2, 6, 4, 5, 9, 1, 2);
var Towers3: array [0..15] of integer = (2, 6, 3, 5, 2, 8, 1, 4, 2, 2, 5, 3, 5, 7, 4, 1);
var Towers4: array [0..3] of integer = (5, 5, 5, 5);
var Towers5: array [0..3] of integer = (5, 6, 7, 8);
var Towers6: array [0..3] of integer = (8, 7, 7, 6);
var Towers7: array [0..4] of integer = (6, 7, 10, 7, 6);
 
 
type TMatrix = array of array of boolean;
 
function ArrayToMatrix(IATowers: array of integer): TMatrix;
{Convert Tower Array to Matrix for analysis}
var Max,I,X,Y: integer;
begin
Max:=0;
for I:=0 to High(IATowers) do if IATowers[I]>=Max then Max:=IATowers[I];
SetLength(Result,Length(IATowers),Max);
for Y:=0 to High(Result[0]) do
for X:=0 to High(Result) do Result[X,Y]:=IATowers[X]>(Max-Y);
end;
 
 
procedure DisplayMatrix(Memo: TMemo; Matrix: TMatrix);
{Display a matrix}
var X,Y: integer;
var S: string;
Line 1,927 ⟶ 1,936:
 
 
function GetWaterStorage(Matrix: TMatrix): integer;
procedure WaterLevel(Memo: TMemo);
{Analyze matrix to get water storage amount}
var I,X,Y,Sum,Cnt: integer;
var MaxX,Y,Cnt: integer;
var Matrix: TMatrix;
var S: string;
var Inside: boolean;
begin
Result:=0;
Matrix:=ArrayToMatrix(IA);
{Scan each row of matrix to see if it is storing water}
DisplayMatrix(Memo,Matrix);
Sum:=0;
for Y:=0 to High(Matrix[0]) do
begin
Line 1,943 ⟶ 1,949:
for X:=0 to High(Matrix) do
begin
{Test if this is a tower}
if Matrix[X,Y] then
begin
{if so, we may be inside trough}
Inside:=True;
{If Cnt>0 there was a previous tower}
Sum:=Sum+Cnt;
{And we've impounded water }
SumResult:=SumResult+Cnt;
{Start new count with new tower}
Cnt:=0;
end
else if Inside then Inc(Cnt); {Count potential impounded water}
end;
end;
Memo.Lines.Add(IntToStr(Sum));
end;
 
 
procedure ShowWaterLevels(Memo: TMemo; Towers: array of integer);
{Analyze the water storage of towers and display result}
var I,X,Y,Sum,CntWater: integer;
var Matrix: TMatrix;
begin
Matrix:=ArrayToMatrix(IATowers);
DisplayMatrix(Memo,Matrix);
Water:=GetWaterStorage(Matrix);
Memo.Lines.Add('Storage: '+IntToStr(SumWater)+CRLF);
end;
 
 
procedure WaterLevel(Memo: TMemo);
begin
ShowWaterLevels(Memo,Towers1);
ShowWaterLevels(Memo,Towers2);
ShowWaterLevels(Memo,Towers3);
ShowWaterLevels(Memo,Towers4);
ShowWaterLevels(Memo,Towers5);
ShowWaterLevels(Memo,Towers6);
ShowWaterLevels(Memo,Towers7);
end;
 
 
 
 
Line 2,031 ⟶ 2,063:
[#####]
Storage: 0
 
 
Elapsed Time: 171.444 ms.
</pre>
 
</pre>
 
=={{header|Erlang}}==
465

edits