improved solution to problem 15