#!/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)