Equilibrium index: Difference between revisions
Content added Content deleted
m (→ES6 Functional) |
|||
Line 2,096: | Line 2,096: | ||
# results: |
# results: |
||
3, 6, |
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> |
</pre> |
||