Neural Program Synthesis By Self-Learning