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:
- Usuário envia o código.
- Código é compilado.
- O resultado do algoritmo é testado contra os cenários
pré-definidos.
- 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:
- Compilação
O código é compilado usando uma versão sandbox da libc, que terá unicamente as seguintes funções:
- Todas as funções declaradas em
<math.h>
; - Todas as funções declaradas em
<string.h>
; - As funções
printf()
eputs()
.
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.
- Execução
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.