generate-question.py 2.1 KB
#!/usr/bin/env python3

'''
Example of a question generator.
Arguments are read from stdin.
'''

from random import randint
import sys

# read two arguments from the field `args` specified in the question yaml file
a, b = (int(n) for n in sys.argv[1:])

x = randint(a, b)
y = randint(a, b)
r = x + y

print(f"""---
type: text
title: Geradores de perguntas
text: |

  As perguntas podem ser estáticas (como as que vimos até aqui), ou serem
  geradas dinâmicamente por um programa externo. Para gerar uma pergunta, o
  programa deve escrever texto no `stdout` em formato `yaml` tal como os
  exemplos das perguntas estáticas dos tipos apresentados anteriormente. Pode
  também receber argumentos de linha de comando para parametrizar a pergunta.
  Aqui está um exemplo de uma pergunta gerada por um script python:

  ```python
      #!/usr/bin/env python3

      from random import randint
      import sys

      a, b = (int(n) for n in sys.argv[1:])   # argumentos da linha de comando

      x = randint(a, b)   # número inteiro no intervalo a..b
      y = randint(a, b)   # número inteiro no intervalo a..b
      r = x + y           # calcula resultado correcto

      print(f'''---
      type: text
      title: Contas de somar
      text: |
        Calcule o resultado de ${{x}} + {{y}}$.
      correct: '{{r}}'
      solution: |
        A solução é {{r}}.''')
  ```

  Este script deve ter permissões para poder ser executado no terminal.
  Podemos testar o programa no terminal `./gen-somar.py 1 100` e verificar que
  o output é uma pergunta válida em formato `yaml`. Agora é necessário indicar
  que este script deve ser usado para gerar uma pergunta.

  Uma pergunta gerada por um programa externo é declarada com

  ```yaml
      - type: generator
        ref: gen-somar
        script: gen-somar.py
        # argumentos opcionais
        args: [1, 100]
  ```

  O programa pode receber uma lista de argumentos de linha de comando
  declarados em `args`.

  ---

  Calcule o resultado de ${x} + {y}$.

  Os números foram gerados aleatoriamente no intervalo de {a} a {b}.
correct: '{r}'
solution: |
  A solução é {r}.""")