Classifique o meu Scan-tron!

10

O teste padronizado geralmente vem com um scan-tron ou algum tipo de documento de resposta que registra sua resposta. Um computador ou humanos verificariam suas respostas e determinariam sua nota. Portanto, aqui, com um scan-tron e a chave de resposta, determine a pontuação e as perguntas perdidas, se houver. Um scan-tron é apenas um documento com várias linhas com respostas nas quais o usuário preenche (nesse caso, circulado). Exemplo:

   ---
1. |a| b c d
   --- 

Como você pode ver, esta é a pergunta 1 com a opção de resposta aselecionada, pois tem uma caixa ao redor. Para o desafio, você será dada uma varredura-tron com nperguntas ( 1 <= n <= 10) com apenas quatro respostas denotado como a, b, c, ou d. A chave de resposta será fornecida como uma sequência sem espaços e com todas as letras minúsculas. Exemplo de scan-tron com chave de resposta:

Scan-tron
   ---
1. |a| b c d
   ---
     ---
2. a |b| c d
     ---
       ---
3. a b |c| d
       ---

Answer Key
abb

Você pode inserir a tecla de resposta e o scan-tron como entradas separadas ou em uma ordem escolhida, desde que possam ser identificadas (ou seja, a tecla de resposta está separada do scan-tron). As pontuações serão arredondadas para o décimo mais próximo de um ponto. Exemplo de saída para o acima:

Score: 66.7
Missed #: 3

Outra resposta aceitável seria:

66.7 
3

ou se várias perguntas forem perdidas

66.7
3 4 5

desde que os números das perguntas perdidas sejam separados dos espaços por e não na mesma linha da pontuação.

Regras e especificações

  • O scan-tron pode ser inserido como uma sequência de linhas múltiplas ou uma pergunta por vez (como uma sequência de linhas novas é aceitável)
  • Dada uma chave de digitalização e resposta, você deve gerar a pontuação em uma linha e as perguntas perdidas em outra, com os números separados por espaços. Se nenhuma pergunta for perdida, nenhum número de pergunta deve ser emitido
  • As pontuações são arredondadas para o décimo mais próximo
  • As respostas selecionadas estão cercadas por esta caixa:

    ---
    | |
    ---
    
  • No scan-tron, cada pergunta ocupa três espaços (a parte superior e inferior da caixa ocupa duas linhas extras)
  • Deve funcionar para o exemplo acima
  • Suponha que sempre haverá apenas uma resposta em caixa

Critérios Vencedores

O menor código vence!

Anthony Pham
fonte
o scan-tron pode ser uma lista de perguntas? E cada pergunta tem uma única sequência com novas linhas?
Rod
@Rod Sim e vou esclarecer isso #
Anthony Pham
2
O idioma de "esquecido" é confuso para mim, pois uma pergunta "esquecida" pode significar uma pergunta que o aluno não respondeu (em oposição ao seu significado aparente, respondido incorretamente ).
DLosc
@DLosc Sempre haverá apenas uma resposta circulada #
Anthony Pham
Uma pontuação é 50aceitável ou precisa ser 50.0?
DLosc

Respostas:

2

05AB1E , 43 bytes

U|3ôø`\vyy'|k>èXNèQˆ}¯OXg/3°*2z+ïT/XgL¯_Ï‚»

Experimente online!

Explicação

U                                            # store the answer key in X
 |3ô                                         # split the question-rows in chunks of 3
    ø`                                       # zip and flatten
      \                                      # discard top of stack, leaving the list of
                                             # answer rows on top
       v                                     # for each answer row
         y'|k                                # get the index of the first "|"
        y    >è                              # get the character after that from the row
               XNèQ                          # compare it to the corresponding entry in 
                                             # the answer key
                   ˆ                         # add it to the global list
                    }                        # end loop
                     ¯O                      # calculate the number of correct answers
                       Xg/                   # divide by the length of the answer key
                          3°*                # multiply by 1000
                             2z+             # add 0.5
                                ï            # convert to integer
                                 T/          # divide by 10
                                   XgL       # push range [1 ... len(answer key)]
                                      ¯_Ï    # keep only numbers corresponding to 
                                             # wrong answers
                                          ‚» # format output
Emigna
fonte
4

Empilhados , 68 + 1 = 69 bytes

'|'split[#'1-]NO neq::size:@z~>*[]YES' '#`out is0 sum z/100*1 nround

Experimente online! +1 para -psinalizador (este script pode ser executado como stacked -pe "...")

Toma duas entradas do topo da pilha.

Algumas características interessantes:

[#'1-]NO
[    ]NO   do not keep members where
 #'          its length
   1-          -1
             is truthy (in this case, not equal to zero).

Isso produz todas as letras cercadas por canos.

:size:@z~>*[]YES
:                 duplicate indices of incorrect answers
 size             length of incorrect answers
     :@z          (stored into z)
        ~>        range from 1 to this length
          *       and multiply by this range
           []YES  keep truthy elements

Isso nos fornece todos os números de perguntas incorretos.

Conor O'Brien
fonte
3

Python 2 , 94 93 bytes

-1 byte graças a L3viathan

s,a=input()
l=len(s)
w=[i+1for i in range(l)if"|%s|"%a[i]not in s[i]]
print(l-len(w))*1e2/l,w

Experimente online!

Cajado
fonte
Bom, muito melhor que o meu. Você pode substituir 100.por1e2
L3viathan 29/17/17
Não acredito que isso atenda ao requisito de arredondar a pontuação para "o décimo mais próximo de um ponto", cumpre?
DLosc 30/03
3

Pip , 49 46 44 48 45 bytes

Ugh, esse arredondamento leva tantos bytes ... 44 bytes de código, +1 para -ssinalizador.

(/2+m-m/#b*#P_FI{++nbNa?un}MZa@`\|..`b)//1/t

Recebe entrada como argumentos da linha de comando (a página scan-tron precisará de aspas e escape de novas linhas se você a executar a partir de uma linha de comando real). Emite primeiro as perguntas perdidas, depois a pontuação. Experimente online!

Explicação

Farei isso em duas partes: a lista de perguntas incorretas e a pontuação.

P_FI{++nbNa?un}MZa@`\|..`b
                            a,b are cmdline args, u is nil, n is newline (implicit)
                            Note that a string like n, in math contexts, is equivalent to 0
                 a@`\|..`   Find all occurrences in a of | followed by 2 chars
                            Because regex matches don't overlap, this does what we need
    {         }MZ        b  Zip with b and map this function to each pair of items:
     ++n                     Increment n (so the first time through, it's 1)
        bNa                  Is 2nd arg a substring of 1st?
           ?un               If so, return nil; if not, return n
                            Now we have a list containing nil for correct questions
                            and the question number for incorrect questions
 _FI                        Filter on identity function (keep only truthy values)
P                           Print, joining on spaces (-s flag)

(/2+m-m/#b*#...)//1/t
                       a,b are cmdline args, m is 1000 (implicit)
            ...        The code from the first part
           #           Length of that list (i.e. number of incorrect questions)
      m/#b*            Times 1000/(number of questions)
    m-                 Subtracted from 1000
 /2+                   Plus 1/2 (= 0.5)
                       We now have a number like 667.1666666666667
(              )//1    Int-divide by 1 to truncate
                   /t  and divide that by 10
                       Print (implicit)
DLosc
fonte
2

JavaScript (ES6), 88 bytes

x=>y=>x.replace(/\w(?=\|)/g,c=>c==y[i++]?t++:a+=i+" ",a=i=t="")&&(t/i*1e3+.5|0)/10+`
`+a

Eu poderia salvar 5 bytes usando vírgulas e retornando tudo uma linha:

x=>y=>x.replace(/\w(?=\|)/g,c=>c==y[i++]?t++:a+=[,i],a=i=t="")&&(t/i*1e3+.5|0)/10+a
ETHproductions
fonte
1

Lote, 242 bytes

@echo off
set/as=c=0
set m=
set/pk=
:l
set/ac+=1
set/pt=
set/pl=
set/pt=
set "l=%l:*|=%
if %l:~,1%==%k:~,1% (set/as+=1)else set m=%m% %c%
set k=%k:~1%
if not "%k%"=="" goto l
set/as=(s*2000/c+1)/2
echo(%s:~,-1%.%s:~-1%
echo(%m%

Lê a chave de resposta em STDIN primeiro e depois n*3questiona as linhas. Nota: A pontuação é impressa sem um zero à esquerda se for menor que 1.0. As respostas perdidas são impressas com um espaço à esquerda.

Neil
fonte
0

CJam , 47 45 bytes

lqN/(;3%_'|f#:).=.=__:+\,d/e2XmOn:!_,,:).*0-p

Experimente online!

Explicação

O programa está dividido em três partes principais:

Right/wrong list

l                    e# Read the first line of input (answer key)
 qN/                 e# Read the rest of the input and split it on newlines
    (;3%             e# Delete the first line, then select every 3rd line 
        _            e# Duplicate the array
         '|f#        e# Find the index of the first | in each answer
             :)      e# Increment each, gives the index of the selected letter for each answer
               .=    e# Vectorized get-element-at with the answer strings
                 .=  e# Vectorized equality check with the answer key

Após esta seção, temos uma matriz de 0s e 1s, onde 0indica uma resposta errada e 1uma resposta correta.

Score

__              e# Duplicate the right/wrong list twice
  :+            e# Take the sum of it (number of right answers)
    \,          e# Swap top elements and take the length (total number of questions)
      d/        e# Divide (casting to double so it's not integer division)
        e2      e# Multiply by 10^2
          XmO   e# Round to 1 decimal place
             n  e# Pop and print with a newline

Após esta seção, a pilha contém apenas a lista certa / incorreta e a pontuação percentual foi emitida.

Wrong answers

:!            e# Logically negate each element of the right/wrong list
  _,,:)       e# Generate the inclusive range 1...length(list)
       .*     e# Vectorized multiplication of the two lists
         0-   e# Remove any 0s from the result
           p  e# Print it
Gato de negócios
fonte
0

Jolf, 46 bytes

Não consigo quebrar 46 bytes. Eu tenho duas soluções desse tamanho. Experimente um aqui!

ΆRγψ~mΖ mi«\|..»d?=€H.xSEhSdHήSmX*~1/-lζlγlζ_1

(Substitua por 0x7fno próximo)

ΆRγψΜΖψGi'|d=1lHd?□=H.xShSEdHήSmX*~1/-lζlγlζ_1

Em ambos os casos, de 15 bytes para o arredondamento: mX*~1/-lζlγlζ_1. Eles são, na maioria das vezes, os mesmos, exceto que um usa uma correspondência de regex para obter os resultados e o outro se divide nos tubos.

Conor O'Brien
fonte