Dá pra fazer algo mais ou menos inspirado nesses sites de exercícios/desafios/etc.
Basicamente, para um problema, tem-se o formato da entrada e saída. Geralmente algo como "O programa deve ler X linhas, em cada linha tem N números. O programa deve fazer A, B e C e deve imprimir o resultado em tal formato".
Aí vc define as entradas, e as respectivas saídas. Depois, roda o programa para cada entrada e compara o resultado com a respectiva saída.
Aí entram outros problemas, já que muitos desses sites com "correção automática" podem dizer que o resultado está errado se tiver uma linha em branco a mais, um espaço a menos, etc. Tem que ver o quão rígido vc quer ser com esses detalhes.
Certifique-se também que os casos de teste são complicados o suficiente para que a pessoa não acerte por coincidência. Por exemplo, um programa que foi implementando errado, mas que por coincidência/sorte dá o resultado correto.
Essa parte é relativamente simples, o mais trabalhoso vai ser bolar tantos exercícios e casos de teste.
Siimm, muito bom seu questionamento @kht. Eu tinha pensado em uma solução que a própria 42 utiliza e muita galera faz algo la no github baseado nisso, ou seja, algumas dessas soluções estão disponíveis.
Seria basicamente o seguinte, existem certas normas e padrões que todos exercícios devem seguir, e eles tem um programa pra cada padrão desse que é rodado antes mesmo de corrijir a resolução em si, se não passar o usuário nem chega e obter um resultado de seu código. Isso já elimina alguns problemas de código mal feito ou até mesmo uma coincidência como você apontou.
Tudo ainda é um desafio muito grande de como vou chegar no final de tudo saindo do absoluto zero, mas com fé vai dar certo kkk, abraço amigo, valeu pelo comentário.