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

'''
Example of a parameterized question generator.
Parameters are read from stdin.
The generated question is written to stdout in JSON format.
'''

import json
import random
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 = random.randint(a, b)
y = random.randint(a, b)
r = x + y

# ----------------------------------------------------------------------------
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

    import json
    import random
    import sys

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

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

    question = {
        'type': 'text',
        'title': 'Geradores de perguntas',
        'text': f'Quanto é {x} + {y}?',
        'transform': ['trim'],
        'correct': f'{r}',
        'solution': f'A resposta correcta é {r}.'
    }
    json.dump(question, sys.stdout)
```

Este script deve ter permissões para poder ser executado.
Podemos testar o programa no terminal `./gen-somar.py 1 100` e verificar que
o output é uma pergunta válida no formato JSON. 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 script vai receber a lista de argumentos declarados em `args`.
A pergunta vai ser modificada, sendo acrescentados os campos gerados pelo
script. O tipo da pergunta vai também ser preenchido pelo tipo correcto.
Apenas a referência mantém-se.

---

'''
# ----------------------------------------------------------------------------

question = {
    'type': 'text',
    'title': 'Geradores de perguntas',
    'text': text + f'Quanto é {x} + {y}?',
    'transform': ['trim'],
    'correct': f'{r}',
    'solution': f'A resposta correcta é {r}.'
}

json.dump(question, sys.stdout)