I think you can write any program using only advanced concepts from the problem domain, not advanced concepts from programming itself. For example, I'll happily implement a difficult numerical algorithm for inverting a matrix, but I won't write a monad framework in C++ for that. IMO there are almost no projects that call for programming cleverness (as opposed to problem domain cleverness). You can get very far with boring imperative code that any beginner can read, with powerful algorithms introduced only locally and documented clearly.

Give me my procedures, conditionals, and loops, and I shall move mountains.

Assembler (Prince of Persia): https://github.com/jmechner/Prince-of-Persia-Apple-II

BASIC: http://softwareengineering.stackexchange.com/questions/14945...