Jump to content

Equilibrium index: Difference between revisions

Line 2,096:
# results:
3, 6,
</pre>
 
=={{header|Picat}}==
Note: Picat is 1-based.
<lang Picat>go =>
As = [
[-7, 1, 5, 2, -4, 3, 0], % 4 7
[ 2, 4, 6], % (no equilibrium point)
[ 0, 2, 4, 0, 6, 0], % 4
[ 2, 9, 2], % 2
[ 1, -1, 1, -1, 1, -1, 1] % 1 2 3 4 5 6 7
],
foreach(A in As)
println(a=A),
All1 = findall(Ix1, equilibrium_index1(A,Ix1)),
println(all1=All1),
 
equilibrium_index2(A,All2),
println(all2=All2),
nl
end,
 
% A larger random instance
print("A larger random instance:"),
_ = random2(),
N = 5001,
Random = [random(-10,10) : _ in 1..N],
% println(Random),
 
time(R1 = findall(IxR1, equilibrium_index1(Random,IxR1))),
println(r1=R1),
 
time(equilibrium_index2(Random,R2)),
println(r2=R2),
 
nl.
% Inspired by the Prolog solution
equilibrium_index1(A, Ix) =>
append(Front, [_|Back], A),
sum(Front) = sum(Back),
Ix = length(Front)+1. % give 1 based index
 
% From the Java solution
equilibrium_index2(A, Ix) =>
Len = A.length,
Ix1 = [],
TotalSum = sum(A),
RunningSum = 0,
foreach(I in 1..Len)
AI = A[I],
if TotalSum - RunningSum - AI == RunningSum then
Ix1 := Ix1 ++ [I]
end,
RunningSum := RunningSum + AI
end,
Ix = Ix1.
 
</lang>
 
Output:
<pre>
a = [-7,1,5,2,-4,3,0]
all1 = [4,7]
all2 = [4,7]
 
a = [2,4,6]
all1 = []
all2 = []
 
a = [0,2,4,0,6,0]
all1 = [4]
all2 = [4]
 
a = [2,9,2]
all1 = [2]
all2 = [2]
 
a = [1,-1,1,-1,1,-1,1]
all1 = [1,2,3,4,5,6,7]
all2 = [1,2,3,4,5,6,7]
 
A larger random instance:
 
CPU time 0.113 seconds.
 
r1 = [115,372,4082,4254,4258,4261]
 
CPU time 0.019 seconds.
 
r2 = [115,372,4082,4254,4258,4261]
</pre>
 
495

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.