So each attempt, even from the same student, would get a slightly different set of questions, and the dumbest attempts at cheating were discouraged[1].
I don't see why this couldn't be done for the programming assingments.
For example, the first assignment in this functional programming was "functional sets": empty set, singleton, contains, union, intersect, filter. It would have been trivial to add a few more (unionAll, containsAll, difference etc) and select a subset for each student, or something like that.
[0] alas, they don't seem to do this anymore.
[1] also, a "random answer + replay with proper solution" approach wouldn't work.