private static int FindLoopLength(int[] positions) { var velocity = new int[positions.Length]; var originalPositions = positions.ToArray(); var stepsCount = 0; var finish = false; while (!finish) { stepsCount++; Moon.ApplyGravity(positions, velocity); Moon.ApplyVelocity(positions, velocity); finish = true; for (var i = 0; i < positions.Length; i++) { if (positions[i] != originalPositions[i] || velocity[i] != 0) { finish = false; break; } } } return(stepsCount); }
public static long Solve(IEnumerable <string> input, int stepsCount = 1000) { var moons = input.Select(Moon.Parse).ToArray(); var positionX = moons.Select(i => i.X).ToArray(); var positionY = moons.Select(i => i.Y).ToArray(); var positionZ = moons.Select(i => i.Z).ToArray(); var velocityX = new int[moons.Length]; var velocityY = new int[moons.Length]; var velocityZ = new int[moons.Length]; for (var i = 0; i < stepsCount; i++) { Moon.ApplyGravity(positionX, velocityX); Moon.ApplyGravity(positionY, velocityY); Moon.ApplyGravity(positionZ, velocityZ); Moon.ApplyVelocity(positionX, velocityX); Moon.ApplyVelocity(positionY, velocityY); Moon.ApplyVelocity(positionZ, velocityZ); } var result = 0L; for (var i = 0; i < positionX.Length; i++) { long potential = Math.Abs(positionX[i]) + Math.Abs(positionY[i]) + Math.Abs(positionZ[i]); long kinetic = Math.Abs(velocityX[i]) + Math.Abs(velocityY[i]) + Math.Abs(velocityZ[i]); result += (potential * kinetic); } return(result); }