https://www.vuinsider.com/2019/11/cs302-assignment-1-solution-fall-2019.html