If you haven't seen it before, check out https://projecteuler.net/ which is a series of (very) loosely connected programming challenges.
The challenges start mostly bite-sized and typical programming problems (think fizzbuzz or "what is the 100th prime") and grow into some really interesting areas. You use whatever language(s) you wish, with no time limit, and are free to skip around to whichever questions interest you (or just do them in order... whatever you like)
Euler is more like math problems that can be solved with programming than programming challenges. Very neat, but decreasingly useful for programming practice past the first 20ish.
I always ask for the easier Project Euler tests (or give them a couple) to do; the reason they are good test (IMO) is that they are too small a task to leverage frameworks and can demonstrate things like good approaches to engineering and programming practice (even if the questions are mathematical)
It is possible to demonstrate good approaches to engineering with your solution. But if you're cranking out PE problems, you really are better off just throwing out a bunch of one-off unmaintainable scripts. It is a good test of math and cleverness. It is not a good exercise for maintainable software.
The challenges start mostly bite-sized and typical programming problems (think fizzbuzz or "what is the 100th prime") and grow into some really interesting areas. You use whatever language(s) you wish, with no time limit, and are free to skip around to whichever questions interest you (or just do them in order... whatever you like)
I find it fun. You might too.