Para aplicar respostas aos MCQs

2

Agora estou estendendo minhas próprias respostas para os MCQs, conforme Como SED esses parágrafos para o formato MCQ? .

Dados no arquivo.txt

1   c
2   a

Dados em exam.tex

\item
Which of the following lorem ipsun are the best playstation games you have played? 

A Pattman

B Pokemon

C Lorem

D Ipsun

E Heillui

\item
Which of the following lorem ipsun are the best playstation games you have played? 

A Pattman

B Pokemon

C Lorem

D Ipsun

E Heillui

Saída desejada em negrito feita pelas respostas no arquivo.txt

\item
Which of the following lorem ipsun are the best playstation games you have played? 

A Pattman

B Pokemon

\textbf{C Lorem}

D Ipsun

E Heillui

\item
Which of the following lorem ipsun are the best playstation games you have played? 

\textbf{A Pattman}

B Pokemon

C Lorem

D Ipsun

E Heillui

Pseudocódigo

  • para loop \ item no modo de parágrafo Perl
    • para linhas vazias de loop em cada paragaph pela contagem na lista (a = 1, b = 2, c = 3, d = 4, e = 5)
      • aplica \ textbf ao início da linha; e} até o final da linha
    • sair do parágrafo atual
  • final

Pseudocódigo com Python-Perl

for item in items 

   perl -00pe 's/\item\n.*\n{$item}^/\textbf{/;' file
   perl -00pe 's/\item\n.*\n{$item}$/}/;' file

end

onde eu não gosto de lidar com o começo e o fim em comandos separados.

Como você pode aplicar a resposta aos MCQs por Perl / SED / Python?

    
por Léo Léopold Hertz 준영 23.11.2015 / 00:58

1 resposta

2
{   printf '[13*%d-n[bs]pc]s%c\n' 9 a 7 b 5 c 3 d 1 e
    tr  -s ' \n' lx <file.txt; }  |  dc |
sed -f- -eb -e:s -e's/.*/\textbf{&}/' exam.txt

Isso usa a calculadora de notação de polimento inverso dc para gerar um script sed semelhante a:

8bs
17bs

... que é então concatenado com os scripts sed inseridos na linha de comando e resulta em todos os números de linha que não estão incluídos no script gerado para serem b ranched e para aqueles que são incluídos para ter a string \textbf{ inserida antes do que quer que exista na linha e } anexado à sua cauda.

Funcionará para mais do que apenas as duas seções, é claro. Basicamente multiplica o número inicial em cada linha em file.txt por 13 e então subtrai do produto 1, 3, 5, 7, 9 para um dos e, d, c, b, um respectivamente para chegar à lista de números de linha segmentados.

Em qualquer caso, tudo que o sed tem que fazer no final é a impressão padrão que ele faz para cada linha que ele não edita antes de se ramificar, ou então fazer a única substituição para sua string. tr e dc são ambos muito utilitários rápidos, e eles lidam com quase todo o pré-processamento.

Possíveis vantagens para essa abordagem:

  • Nenhuma comparação precisa ser feita entre os dois arquivos.

  • Nenhuma correspondência de expressão regular é obrigatória.

    • Embora seja verdade, o processamento de sed pode se beneficiar levemente de um filtro adicional inicial para evitar que ele tente corresponder a todos os números de linha em relação àqueles na lista, como:

      ... | sed -e'/^[ABCDE] /!b' -f- ...
      
  • As respostas em arquivo.txt não precisam estar em nenhuma ordem específica ou até representam completamente todas as perguntas em exam.txt .

Possíveis desvantagens:

  • Cada carta de resposta em arquivo.txt deve estar em minúsculas.

    • use tr -s '[:upper:] \n' \[:lower:]lx para lidar com / ou.
  • É necessário pelo menos um espaço intermediário e uma nova linha interveniente entre o número de resposta e a resposta e, respectivamente, entre cada resposta em arquivo.txt , embora seja permitido um número maior com a exceção que nenhuma linha em branco pode ser encontrada antes da primeira resposta, e nenhuma linha pode começar ou terminar com espaços.

  • Cada bloco de pergunta / resposta em exam.txt deve ser composto por exatamente 13 linhas (exceto a última, que não precisa incluir uma linha em branco à direita) .

Isso depende de uma ou duas extensões dc do GNU conforme escritas. Aqui está uma versão mais portátil:

{   printf '[13*%d-p[s]pc]s%c\n' 9 a 7 b 5 c 3 d 1 e
    tr  -s ' \n' lx <file.txt;}| dc | paste -db - -|
sed -f- -eb -e:s -e's/.*/\textbf{&}/' exam.txt

... de qualquer forma, você escreve:

\item
Which of the following lorem ipsun are the best playstation games you have played?

A Pattman

B Pokemon

\textbf{C Lorem}

D Ipsun

E Heillui

\item
Which of the following lorem ipsun are the best playstation games you have played?

\textbf{A Pattman}

B Pokemon

C Lorem

D Ipsun

E Heillui
    
por 23.11.2015 / 03:37