30 lines
817 B
Text
30 lines
817 B
Text
class C{
|
|
const N=10;
|
|
var [const]
|
|
buckets=(1).pump(N,List).copy(), //(1,2,3...)
|
|
pipe = Thread.Pipe(), cnt=Atomic.Int();
|
|
fcn init{
|
|
pipe.write(buckets);
|
|
"Initial sum: ".println(values().sum());
|
|
}
|
|
fcn transferArb{ // transfer arbitary amount from 1 bucket to another
|
|
b1:=(0).random(N); b2:=(0).random(N);
|
|
v:=pipe.read();
|
|
t:=(0).random(v[b1]); v[b1]=v[b1]-t; v[b2]=v[b2]+t;
|
|
pipe.write(v);
|
|
cnt.inc();
|
|
}
|
|
fcn transferEq{ // try to make two buckets equal
|
|
b1:=(0).random(N); b2:=(0).random(N);
|
|
v:=pipe.read();
|
|
v1:=v[b1]; v2:=v[b2]; t:=(v1-v2).abs()/2;
|
|
if (v1<v2) t = -t;
|
|
v[b1]=v1-t; v[b2]=v2+t;
|
|
pipe.write(v);
|
|
cnt.inc();
|
|
}
|
|
fcn values{
|
|
v:=pipe.read(); v2:=v.copy(); pipe.write(v);
|
|
v2;
|
|
}
|
|
}
|