Resistance network calculator: Difference between revisions

m (→‎{{header|Perl}}: oops, copy/paste)
Line 260:
plan +@tests;
is .[0], network( |.[1..4] ), .[4].substr(0,10)~'…' for @tests;</lang>
 
=={{header|Phix}}==
{{trans|Go}}
<lang Phix>function argmax(sequence m, integer i)
sequence col := sq_abs(vslice(m,i))
return largest(col,return_index:=true)
end function
function gauss(sequence m)
integer n = length(m),
p = length(m[1])
for i=1 to n do
integer k := i + argmax(m[i..n],i)-1
{m[i], m[k]} = {m[k], m[i]}
atom t := 1/m[i][i]
for j=i+1 to p do m[i][j] *= t end for
for j=i+1 to n do
t = m[j][i]
for l=i+1 to p do m[j][l] -= t * m[i][l] end for
end for
end for
for i=n to 1 by -1 do
atom mip = m[i][p]
for j=1 to i-1 do m[j][p] -= m[j][i] * mip end for
end for
return vslice(m,p)
end function
function network(integer n, k0, k1, sequence s)
sequence m := repeat(repeat(0,n+1), n)
s = split(s,'|')
for i=1 to length(s) do
integer {{a,b,ri}} = sq_add(scanf(s[i],"%d %d %d"),{{1,1,0}})
atom r = 1/ri
m[a][a] += r
m[b][b] += r
if a > 1 then m[a][b] -= r end if
if b > 1 then m[b][a] -= r end if
end for
k0 += 1; m[k0][k0] = 1
k1 += 1; m[k1][n+1] = 1
return gauss(m)[k1]
end function
 
printf(1,"%.6g\n",network(7, 0, 1, "0 2 6|2 3 4|3 4 10|4 5 2|5 6 8|6 1 4|3 5 6|3 6 6|3 1 8|2 1 8"))
printf(1,"%.6g\n",network(9, 0, 8, "0 1 1|1 2 1|3 4 1|4 5 1|6 7 1|7 8 1|0 3 1|3 6 1|1 4 1|4 7 1|2 5 1|5 8 1"))
printf(1,"%.6g\n",network(16, 0, 15, "0 1 1|1 2 1|2 3 1|4 5 1|5 6 1|6 7 1|8 9 1|9 10 1|10 11 1|12 13 1|13 14 1|14 15 1|"&
"0 4 1|4 8 1|8 12 1|1 5 1|5 9 1|9 13 1|2 6 1|6 10 1|10 14 1|3 7 1|7 11 1|11 15 1"))
printf(1,"%.6g\n",network(4, 0, 3, "0 1 150|0 2 50|1 3 300|2 3 250"))</lang>
{{out}}
<pre>
10
1.5
1.85714
180
</pre>
 
=={{header|Python}}==
7,805

edits