Gerar provas diferentes com Sweave

April 30, 2012
By

This post was kindly contributed by Ridículas - go there to comment and to read the full post.

Método japonês para evitar a cola.

Há muito tempo que eu procurava uma forma de gerar provas diferentes por meio de um processo de sorteio aleatório. Eu não queria fazer duas provas, tirar cópias delas e distribuir. Eu queria uma prova diferente da outra, sem cópias, entende? Bem, no começo pensei que isso fosse algo extremamente difícil mas não é! Nos vamos fazer isso com Sweave, que o mecanismo de acoplar o R (ambiente de computação estatística) ao LaTex (editor de textos).

O procedimento é bem simples e eu vou descrevê-lo em etapas:

  • Etapa 1. Criamos um arquivo Sweave (extensão *.Rnw) e colocamos os enunciados da nossa prova. Esse arquivo não precisar ter preâmbulo, apenas o conteúdo da prova. O conteúdo abaixo deve ser salvo em um arquivo do Sweave (prova.Rnw). Note a função sample() é a responsável pela aleatoriedade das questões. Em cada compilação teremos enunciados diferentes, cada um deles com mesma probabilidade;
  • <<echo=false, results=hide>>=
    r <- sample(1:2, 1)
    conf <- list(A="da mesma cor", B="de cor diferente")
    x <- conf[[r]]
    @ 
    
    \noindent 1. Pega-se um baralho e coloca-se os quatro ases na mesa, virados 
    para baixo. Dois deles (A$\clubsuit$, A$\spadesuit$) são pretos, os outros 
    dois (A$\heartsuit$, A$\diamondsuit$) são vermelhos. Seja o experimento
    retirar duas dessas quatro cartas aleatoriamente. Qual a probabilidade das 
    cartas serem \Sexpr{x}?
    
    <<echo=false, results=hide>>=
    r <- sample(1:2, 1)
    conf <- list(A=c(2,2), B=c(3,2.5))
    symb <- c(0,0,1,conf[[r]][1])
    symbb <- paste("|", paste(symb, collapse="|"), "|", sep="")
    cust <- conf[[r]][2]
    @ 
    
    \vspace{2cm}
    \noindent 2. Uma máquina caça níquel possui 2 cilíndros e em cada uma deles
    está gravado a sequência de números \Sexpr{symbb}. A máquina premia o jogador
    com o valor da soma dos números observados, ou seja, se sair | 1 | 0 | o
    jogador ganha 1 dólar. O valor de cada jogada é \Sexpr{cust} dólares. Seja
    $X$ o \textbf{lucro} do jogador em cada jogada. Determine:
    \begin{compactenum}[a)]
      \item A distribuição de probabilidades de $X$;
      \item O lucro médio do jogador, ou seja, o valor esperado de $X$.
    \end{compactenum}
    

  • Etapa 2. Criamos um arquivo R para fazermos a compilação repetida do arquivo prova.Rnw. Cada resultado de compilação será salvo em um diretório dentro ao atual (./cada_tex) com nome de arquivos diferentes (prova1.tex, prova2.tex, etc). Nessa mesma etapa nos geramos um arquivo todos_inputs.tex que nada mais é que a chamada de cada prova para compilação que será usada no arquivo *.tex da etapa a seguir;
  • # cria o diretório para os arquivos compilados
    dir.create("cada_tex")
    # número de provas e o nome das provas
    n <- 10
    names <- paste("cada_tex/prova", 1:n, ".tex", sep="")
    # função para compilar com nomes de saída diferente
    do.tex <- function(name){
      Sweave("prova.Rnw", encoding="utf8", output=name)
    }
    sapply(names, do.tex)
    # para gerar um arquivo tex com os inputs
    sink("todos_inputs.tex")
    for(i in names){
      cat(paste("\\input{", i, "}\n", sep=""))
      cat("\\newpage\n")
    }
    sink()
    # para compilar o arquivo tex
    system("pdflatex provas.tex")
    

  • Etapa 3. Agora nos compilamos de *.Rnw para *.pdf. Esse arquivo (provas.tex) contém o preâmbulo que precisamos e o input de cada uma das provas, uma por página.
  • \documentclass[a4paper,10pt]{article}
    \usepackage{Sweave}
    \usepackage[utf8]{inputenc}
    \usepackage[brazil]{babel}
    \usepackage[T1]{fontenc}
    \usepackage{enumerate}
    \usepackage{paralist}
    
    \begin{document}
    \pagestyle{empty}
    
    \input{todos_inputs.tex}
    
    \end{document}
    

    Ao executar essas etapa no seu computador, verifique a codificação dos arquivos. Como eu uso linux, minha codificação é a padrão do SO (utf-8). No mais é só aproveitar. Até a próxima ridícula.


    Tags:

    Comments are closed.