# The Computer Language Benchmarks Game # http://shootout.alioth.debian.org/ # # originally by Kevin Carson # modified by Tupteq, Fredrik Johansson, and Daniel Nanz # modified by Maciej Fijalkowski # 2to3 @number float class Program def combinations(l) as dynamic result = [] for x in l.count - 1 ls = l[x+1:] for y in ls result.add([l[x],y]) print "Done" return result var bODIES cue init .bODIES = { 'sun': [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], .sOLAR_MASS], 'jupiter': [[4.84143144246472090, -1.16032004402742839, -0.103622044471123109], [0.00166007664274403694 * .dAYS_PER_YEAR, 0.00769901118419740425 * .dAYS_PER_YEAR, -0.0000690460016972063023 * .dAYS_PER_YEAR], 0.000954791938424326609 * .sOLAR_MASS], 'saturn': [[8.34336671824457987, 4.12479856412430479, -0.403523417114321381], [-0.00276742510726862411 * .dAYS_PER_YEAR, 0.00499852801234917238 * .dAYS_PER_YEAR, 0.0000230417297573763929 * .dAYS_PER_YEAR], 0.0005980666130812 * .sOLAR_MASS], 'uranus': [[12.8943695621391310, -15.1111514016986312, -0.223307578892655734], [0.00296460137564761618* .dAYS_PER_YEAR, 0.00237847173959480950* .dAYS_PER_YEAR, -0.0000296589568540237556* .dAYS_PER_YEAR], 0.0000436624404335156298* .sOLAR_MASS], 'neptune': [[15.3796971148509165, -25.9193146099879641, 0.179258772950371181], [0.00268067772490389322* .dAYS_PER_YEAR, 0.00162824170038242295* .dAYS_PER_YEAR, -0.0000951592254519715870* .dAYS_PER_YEAR], 0.0000515138902046611451* .sOLAR_MASS] } .sYSTEM = [ [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], .sOLAR_MASS], [[4.84143144246472090, -1.16032004402742839, -0.103622044471123109], [0.00166007664274403694 * .dAYS_PER_YEAR, 0.00769901118419740425 * .dAYS_PER_YEAR, -0.0000690460016972063023 * .dAYS_PER_YEAR], 0.000954791938424326609 * .sOLAR_MASS], [[8.34336671824457987, 4.12479856412430479, -0.403523417114321381], [-0.00276742510726862411 * .dAYS_PER_YEAR, 0.00499852801234917238 * .dAYS_PER_YEAR, 0.0000230417297573763929 * .dAYS_PER_YEAR], 0.0005980666130812 * .sOLAR_MASS], [[12.8943695621391310, -15.1111514016986312, -0.223307578892655734], [0.00296460137564761618* .dAYS_PER_YEAR, 0.00237847173959480950* .dAYS_PER_YEAR, -0.0000296589568540237556* .dAYS_PER_YEAR], 0.0000436624404335156298* .sOLAR_MASS], [[15.3796971148509165, -25.9193146099879641, 0.179258772950371181], [0.00268067772490389322* .dAYS_PER_YEAR, 0.00162824170038242295* .dAYS_PER_YEAR, -0.0000951592254519715870* .dAYS_PER_YEAR], 0.0000515138902046611451* .sOLAR_MASS] ] .pAIRS = .combinations(.sYSTEM) var sYSTEM var _pI = 3.14159265358979323 var sOLAR_MASS = 4 * 3.14159265358979323 * 3.14159265358979323 var dAYS_PER_YEAR = 365.24 var pAIRS def advance(dt as float, n as int) bodies=.sYSTEM pairs=.pAIRS print pairs.count for i in n if i % 1000 == 0 print i for p in pairs x1, y1, z1 = p[0][0][0], p[0][0][1], p[0][0][2] x2, y2, z2 = p[1][0][0], p[1][0][1], p[1][0][2] v1, v2, m1, m2 = p[0][1], p[1][1], p[0][2], p[1][2] dx = x1 - x2 dy = y1 - y2 dz = z1 - z2 mag = dt * Math.pow((dx * dx + dy * dy + dz * dz), -1.5) b1m = m1 * mag b2m = m2 * mag v1[0] = v1[0] - dx * b2m v1[1] = v1[1] - dy * b2m v1[2] = v1[2] - dz * b2m v2[0] = v2[0] + dx * b1m v2[1] = v2[1] + dy * b1m v2[2] = v2[2] + dz * b1m for b in bodies r = b[0] vx,vy,vz = b[1][0], b[1][1], b[1][2] m = b[2] r[0] = r[0] + dt * vx r[1] = r[1] + dt * vy r[2] = r[2] + dt * vz def report_energy bodies=.sYSTEM pairs=.pAIRS e=0.0 for p in pairs x1, y1, z1 = p[0][0][0], p[0][0][1], p[0][0][2] x2, y2, z2 = p[1][0][0], p[1][0][1], p[1][0][2] v1, v2, m1, m2 = p[0][1], p[1][1], p[0][2], p[1][2] dx = x1 - x2 dy = y1 - y2 dz = z1 - z2 e = e - (m1 * m2) / Math.pow((dx * dx + dy * dy + dz * dz), 0.5) for b in bodies r = b[0] vx,vy,vz = b[1][0], b[1][1], b[1][2] m = b[2] e = e + m * (vx * vx + vy * vy + vz * vz) / 2.0 print e def offset_momentum(ref1) bodies=.sYSTEM px=0.0 py=0.0 pz=0.0 for b in bodies r = b[0] vx,vy,vz = b[1][0], b[1][1], b[1][2] m = b[2] px = px + vx * m py = py + vy * m pz = pz + vz * m r, v, m = ref1 v[0] = px / m v[1] = py / m v[2] = pz / m def main ref1 = 'sun' .offset_momentum(.bODIES[ref1]) .report_energy() .advance(0.01, 10000) .report_energy()