Skip to content

Instantly share code, notes, and snippets.

@senapk
Last active August 19, 2020 15:03
Show Gist options
  • Save senapk/d035aaac296a4e8a15ac8fd485451934 to your computer and use it in GitHub Desktop.
Save senapk/d035aaac296a4e8a15ac8fd485451934 to your computer and use it in GitHub Desktop.
Criando questões do moodle semi automático

Instalação

  • Para criar os testes você precisará instalar:
    • pandoc: para gerar os html
      • sudo apt install pandoc no linux
    • tk para gerar os vpl
      • sh -c "$(wget -O- https://raw.githubusercontent.com/senapk/tk/master/tools/install_linux.sh)" no linux

Criando questão

  • Crie uma questão utilizando o markdown e coloque os testes no estilo .TIO como no arquivo a seguir.
    • as >=< delimitam entrada e saída.
    • no caso abaixo, a entrada é 1\n2\n3\n e a saída é primeiro\n. Tanto entrada como saída podem pegar múltiplas linhas.
    • o texto teste 1 primeiro é o label do teste e é opcional.
>>>>>>>> teste 1 primeiro
1
2
3
========
primeiro
<<<<<<<<
  • Se quiser adicionar testes extras que não apareção para o alunos pode colocar eles dentro de uma tag comentário html. Se olhar a renderização do problema.md pelo github só vai achar 3 testes no problema. Se clicar em raw e olhar o código fonte, vai encontrar 5 testes.
<!---
Tudo aqui será 
comentário, não aparecerá
na renderização do html,
mas entrará nos testes
--->
  • Vou utilizar o arquivo problema.md a seguir como exemplo.

Verificando modelo

  • Utilize o tk com o comando tk list problema.md para listar os testes que você criou e verificar se não teve nenhum problema de formatação.
  • A saída será algo como:
╭─tiger@jungle ~/tmp/tutorial_criar_questoes ‹master*› 
╰─$ tk list problema.md                                                   1 ↵
=>. (05) [problema.md(05)] [(X)] (X)
    (.)[00] GR:100 problema.md (teste 1 primeiro)      
    (.)[01] GR:100 problema.md (teste 2 segundo )      
    (.)[02] GR:100 problema.md (teste 3 empate  )      
    (.)[03] GR:100 problema.md (teste oculto 1  )      
    (.)[04] GR:100 problema.md (teste oculto 2  )

Verificando testes

  • Crie um arquivo que soluciona o problema, no nosso caso será o arquivo solver.c.
  • Utilize o tk para verificar se o seu código passa em todos os testes com o comando tk run problema.md solver.c
  • Se todos os testes passarem, a saída será assim:
╭─tiger@jungle ~/tmp/tutorial_criar_questoes ‹master*› 
╰─$ tk run problema.md solver.c 
=>. (05) [problema.md(05)] [(S)solver.c] (S)
  • Se houver alguma falha, ele vai mostrar qual o teste que falhou e o diff. No caso abaixo a saída esperada era empatee o código do usuário gero a palavra empaticom i no teste 02.
╭─tiger@jungle ~/tmp/tutorial_criar_questoes ‹master*› 
╰─$ tk run problema.md solver.c
=>. (05) [problema.md(05)] [(W)solver.c] (X)
    (W)=>solver.c WRONG_OUTPUT
        (S)[00] GR:100 problema.md (teste 1 primeiro)      
        (S)[01] GR:100 problema.md (teste 2 segundo )      
        (X)[02] GR:100 problema.md (teste 3 empate  )      
        (S)[03] GR:100 problema.md (teste oculto 1  )      
        (X)[04] GR:100 problema.md (teste oculto 2  )      
                                MODE: FIRST FAILURE ONLY                               
 ─────────────────────────────────────────   ───────────────────────────────────────── 
 GR:100 problema.md (teste 3 empate)       │ GR:100 problema.md (teste 3 empate)       
 ----------------- INPUT ----------------- │ ----------------- INPUT ----------------- 
 10↵                                       │ 10↵                                       
 11↵                                       │ 11↵                                       
 9↵                                        │ 9↵                                        
 ------------ EXPECTED OUTPUT ------------ │ -------------- USER OUTPUT -------------- 
 empate↵                                   ≠ empati↵                                   
 ─────────────────────────────────────────   ─────────────────────────────────────────

Gerando o html para o moodle.

  • Para gerar o html basta utilizar o pandoc.
pandoc problema.md -o problema.html --standalone
  • Se quiser renderizar fórmulas latex, basta incluir a tag --mathjax. Pra isso deverá ter as bibliotecas do textive instaladas.
pandoc problema.md -o problema.html --standalone --mathjax

Gerando o vpl

  • Para gerar o arquivo testes.vpl com os testes no formato VPL basta utilizar o tk.
tk build testes.vpl problema.md
  • Se tiver utilizado mais de um arquivo com os testes para gerar um único arquivo:
tk build testes.vpl problema.md t.tio testes_extras.md

Criando os testes automaticamente

  • Se você tiver o código fonte que responde o problema, poderá utilizá-lo para preencher as saídas dos seus testes.
  • Para isso, basta criar usando o formato TIO, testes colocando apenas as entradas do problema e invocar o tk passado o código fonte. Ele vai pegar as saídas do código fonte e alterar seu arquivo de testes.
  • No arquivo problema_sem_testes.md eu apaguei todas as saídas dos testes.
  • Agora basta o comando abaixo para preencher/atualizar todos os testes:
tk update --cmd solver.c problema_sem_testes.md

#02_seleção L2 - Mercantil V1 - Quem chega mais perto

Descrição

Pedro e João foram no Silvio Santos. O programa era aquele que o Silvio mostrava um produto do mercantil, ambos os participantes chutavam o preço e a pessoa que chegasse mais próximo do preço real ganhava.

O objetivo do seu programa é informar quem ganhou a disputa. Você receberá o valor do produto e o valor do chute de cada jogador. O jogador que chegar mais perto ganha.

Se ambos ficarem à mesma distancia do valor real, então houve empate.

[DS]

Entrada

  • linha 1: o valor do produto.(valor inteiro entre 1 e 100)
  • linha 2: o chute do Primeiro
  • linha 3: o chute de Segundo

Saída

  • "primeiro" se o chute do Primeiro for o mais próximo do valor do produto
  • "segundo" se o chute do Segundo for o mais próximo do valor do produto
  • "empate" caso ambos ficarem à mesma distancia

Exemplos

>>>>>>>> teste 1 primeiro
1
2
3
========
primeiro
<<<<<<<<

>>>>>>>> teste 2 segundo
3
5
4
========
segundo
<<<<<<<<

>>>>>>>> teste 3 empate
10
11
9
========
empate
<<<<<<<<

Ajuda

  • Ao ser realizado a diferença entre o chute de um jogador e o valor do produto, o resultado pode ser negativo. Para eliminar esse resultado negativo existe a função abs.
  • A função abs retorna o valor absoluto de um número, ou seja, o valor do número sem sinal.

Observação

  • Para ser utilizada a função abs, ela deve ser importada. Segue as formas de importação em algumas linguagens e como utilizar:
    #include <math.h> //c

    abs(-3) //retorna 3
    #include <cmath> //c++

    abs(-3) //retorna 3
    #python
    abs(-3) #retorna 3
    //javascript 
    Math.abs(-3) //retorna 3

#02_seleção L2 - Mercantil V1 - Quem chega mais perto

Descrição

Pedro e João foram no Silvio Santos. O programa era aquele que o Silvio mostrava um produto do mercantil, ambos os participantes chutavam o preço e a pessoa que chegasse mais próximo do preço real ganhava.

O objetivo do seu programa é informar quem ganhou a disputa. Você receberá o valor do produto e o valor do chute de cada jogador. O jogador que chegar mais perto ganha.

Se ambos ficarem à mesma distancia do valor real, então houve empate.

[DS]

Entrada

  • linha 1: o valor do produto.(valor inteiro entre 1 e 100)
  • linha 2: o chute do Primeiro
  • linha 3: o chute de Segundo

Saída

  • "primeiro" se o chute do Primeiro for o mais próximo do valor do produto
  • "segundo" se o chute do Segundo for o mais próximo do valor do produto
  • "empate" caso ambos ficarem à mesma distancia

Exemplos

>>>>>>>> teste 1 primeiro
1
2
3
========
<<<<<<<<

>>>>>>>> teste 2 segundo
3
5
4
========
<<<<<<<<

>>>>>>>> teste 3 empate
10
11
9
========
<<<<<<<<

<!---

>>>>>>>> teste oculto 1
20
21
22
========
<<<<<<<<

>>>>>>>> teste oculto 2
20
21
21
========
<<<<<<<<

--->

Ajuda

  • Ao ser realizado a diferença entre o chute de um jogador e o valor do produto, o resultado pode ser negativo. Para eliminar esse resultado negativo existe a função abs.
  • A função abs retorna o valor absoluto de um número, ou seja, o valor do número sem sinal.

Observação

  • Para ser utilizada a função abs, ela deve ser importada. Segue as formas de importação em algumas linguagens e como utilizar:
    #include <math.h> //c

    abs(-3) //retorna 3
    #include <cmath> //c++

    abs(-3) //retorna 3
    #python
    abs(-3) #retorna 3
    //javascript 
    Math.abs(-3) //retorna 3
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int preco, palpite1, palpite2;
scanf("%d", &preco);
scanf("%d", &palpite1);
scanf("%d", &palpite2);
if(abs((palpite1 - preco)) < abs((palpite2 - preco))) {
printf("primeiro\n");
} else if(abs((palpite1 - preco)) > abs((palpite2 - preco))) {
printf("segundo\n");
} else {
printf("empati\n");
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment