RosettaCodeData/Task/Equilibrium-index/Modula-2/equilibrium-index.mod2
2026-04-30 12:34:36 -04:00

99 lines
2.1 KiB
Text

MODULE Equilibrium;
(* Equilibrium index *)
FROM STextIO IMPORT
WriteLn, WriteString;
FROM SWholeIO IMPORT
WriteInt;
TYPE
(* These types are for easier initialization in the main program.*)
TData7Items = ARRAY [0 .. 6] OF INTEGER;
TData3Items = ARRAY [0 .. 2] OF INTEGER;
VAR
X1: TData7Items;
X1Eqs: ARRAY [0 .. 6] OF BOOLEAN;
X2: TData3Items;
X2Eqs: ARRAY [0 .. 2] OF BOOLEAN;
X3: TData3Items;
X3Eqs: ARRAY [0 .. 2] OF BOOLEAN;
X4: TData7Items;
X4Eqs: ARRAY [0 .. 6] OF BOOLEAN;
PROCEDURE WriteArray(Nums: ARRAY OF INTEGER; NL: BOOLEAN);
VAR
I: CARDINAL;
BEGIN
FOR I := 0 TO HIGH(Nums) DO
WriteInt(Nums[I], 1);
WriteString(" ")
END;
IF NL THEN
WriteLn
END
END WriteArray;
PROCEDURE WriteIndicesOfTrue(Bools: ARRAY OF BOOLEAN; NL: BOOLEAN);
VAR
I: CARDINAL;
BEGIN
FOR I := 0 TO HIGH(Bools) DO
IF Bools[I] THEN
WriteInt(I, 1);
WriteString(" ")
END;
END;
IF NL THEN
WriteLn
END
END WriteIndicesOfTrue;
PROCEDURE GetIndices(Nums: ARRAY OF INTEGER; VAR OUT Result: ARRAY OF BOOLEAN);
VAR
LeftSum, RightSum: INTEGER;
I: CARDINAL;
BEGIN
LeftSum := 0;
RightSum := 0;
FOR I := 0 TO HIGH(Nums) DO
RightSum := RightSum + Nums[I]
END;
FOR I := 0 TO HIGH(Nums) DO
RightSum := RightSum - Nums[I];
Result[I] := (LeftSum = RightSum);
LeftSum := LeftSum + Nums[I]
END;
END GetIndices;
BEGIN
X1 := TData7Items{-7, 1, 5, 2, -4, 3, 0};
GetIndices(X1, X1Eqs);
X2 := TData3Items{2, 4, 6};
GetIndices(X2, X2Eqs);
X3 := TData3Items{2, 9, 2};
GetIndices(X3, X3Eqs);
X4 := TData7Items{1, -1, 1, -1, 1 ,-1, 1};
GetIndices(X4, X4Eqs);
WriteString("Results:");
WriteLn;
WriteLn;
WriteString("X1: ");
WriteArray(X1, TRUE);
WriteString("Eqs: ");
WriteIndicesOfTrue(X1Eqs, TRUE);
WriteLn;
WriteString("X2: ");
WriteArray(X2, TRUE);
WriteString("Eqs: ");
WriteIndicesOfTrue(X2Eqs, TRUE);
WriteLn;
WriteString("X3: ");
WriteArray(X3, TRUE);
WriteString("Eqs: ");
WriteIndicesOfTrue(X3Eqs, TRUE);
WriteLn;
WriteString("X4: ");
WriteArray(X4, TRUE);
WriteString("Eqs: ");
WriteIndicesOfTrue(X4Eqs, TRUE);
END Equilibrium.