Andrew Gacek's solution