Desafios

Nossa plataforma de desafios de programação em C consistirá de uma série de desafios onde o usuário poderá enviar seu código, que será compilado e executado com uma série de cenários de teste afim de validar se o algoritmo do usuário está correto.

O seguinte fluxo será seguido:

  1. Usuário envia o código.
  2. Código é compilado.
  3. O resultado do algoritmo é testado contra os cenários pré-definidos.
    1. Nota: O programa é executado em um ambiente de sandbox.

Os seguintes endpoints serão criados na API:

POST /challenges

Cria um novo desafio.

Exemplo de request:

{
    "name": "My Challenge",
    "level": "easy",
    "description": "..."
}

PUT /challenges/{challenge_id}

Altera um desafio existente.

Exemplo de request:

{
    "name": "My Challenge",
    "level": "easy",
    "description": "..."
}

GET /challenges/{challenge_id}

Retorna os dados do desafio.

DELETE /challenges/{challenge_id}

Remove um desafio.

POST /challenges/{challenge_id}/solutions

Tenta submeter uma nova solução para o desafio. A solução será testada e, se passar, então a solução é registrada.

Exemplo de request:

{
    "source": "..."
}

GET /challenges/{challenge_id}/solutions

Lista as soluções enviadas pelos usuários para o desafio. O usuário só pode listar essas soluções se for quem criou o desafio ou se já tiver resolvido ele.

GET /solutions/{solution_id}

Obtém detalhes de uma solução específica. O usuário só pode ver essa solução se for quem criou o desafio ou se já tiver resolvido ele.

POST /challenges/{challenge_id}/scenarios

Cria um novo cenário de teste para o desafio.

Exemplo de request:

{
    "name": "My Challenge",
    "source": "..."
}

O campo source é o código fonte em C do cenário. Onde ele será invocado a partir da função main e a função challenge() será a função com o código da implementação da solução do desafio feita pelo usuário.

GET /challenges/{challenge_id}/scenarios

Lista os cenários de teste criados para o desafio.

PUT /scenarios/{scenario_id}

Atualiza um cenário de teste existente.

Exemplo de request:

{
    "name": "My Challenge",
    "source": "..."
}

GET /scenarios/{scenario_id}

Obtém detalhes do cenário de teste.

DELETE /scenarios/{scenario_id}

Remove o cenário de teste.


A execução do código da solução do desafio será feita da seguinte forma:

O código é compilado usando uma versão sandbox da libc, que terá unicamente as seguintes funções:

  1. Todas as funções declaradas em <math.h>;
  2. Todas as funções declaradas em <string.h>;
  3. As funções printf() e puts().

Exemplo ilustrativo para a linha de comando que será usada para compilar o código:

$ gcc -nostdlib -l /lib64/libsandboxc.so solution.c -o solution

Se a compilação falhar, a mensagem de erro do compilador será exibida para o usuário.

Após compilado, o programa é executado e seu retorno em stdout é verificado. Se a string PASS for escrita em stdout, então é porque todos os cenários de teste validaram com sucesso a solução.

Do contrário, qualquer outra saída será exibida para o usuário junto com a saída em stderr.

IMPORTANTE: É importante definir um tempo máximo de execução do programa de 5 segundos. Se o programa não finalizar em 5 segundos, ele será finalizado forçadamente.