¡Califique mi Scan-tron!


10

Las pruebas estandarizadas generalmente vienen con un scan-tron o algún tipo de documento de respuesta que registra su respuesta. Una computadora o persona (s) luego verificaría sus respuestas y determinaría su calificación. Entonces, aquí, dado un scan-tron y la clave de respuestas, determine el puntaje y las preguntas perdidas, si las hay. Un scan-tron es solo un documento con múltiples líneas con respuestas en las que el usuario completa (en este caso, en un círculo). Ejemplo:

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

Como puede ver, esta es la pregunta 1 con la opción de respuesta aseleccionada, ya que tiene un cuadro alrededor. Para el desafío, se le dará una exploración-tron con npreguntas ( 1 <= n <= 10) con sólo cuatro respuestas denota como a, b, c, o d. La clave de respuesta se dará como una cadena sin espacios y con minúsculas. Ejemplo scan-tron con clave de respuesta:

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

Answer Key
abb

Puede tomar la clave de respuesta y scan-tron como entradas separadas o en un orden elegido siempre que puedan identificarse (es decir, la clave de respuesta está separada del scan-tron). Los puntajes se redondearán a la décima de punto más cercana. Ejemplo de salida para lo anterior:

Score: 66.7
Missed #: 3

Otra respuesta aceptable sería:

66.7 
3

o si se pierden varias preguntas

66.7
3 4 5

siempre que los números de las preguntas para los perdidos estén separados por espacios y no en la misma línea que el puntaje.

Reglas y especificaciones

  • El scan-tron se puede ingresar como una cadena de varias líneas o una pregunta a la vez (como una cadena con nuevas líneas es aceptable)
  • Dado un scan-tron y una clave de respuesta, debe generar el puntaje en una línea y las preguntas omitidas en otra, con los números separados por espacios. Si no se pierden preguntas, no se deben emitir números de preguntas
  • Las puntuaciones se redondean a la décima más cercana.
  • Las respuestas seleccionadas están rodeadas por este cuadro:

    ---
    | |
    ---
    
  • En el scan-tron, cada pregunta ocupa tres espacios (la parte superior e inferior del cuadro ocupa dos líneas adicionales)
  • Debe funcionar para el ejemplo anterior
  • Suponga que siempre habrá una sola respuesta en el recuadro

Criterios ganadores

¡El código más corto gana!


el scan-tron puede ser una lista de preguntas? ¿Y cada pregunta será una sola cadena con nuevas líneas?
Rod

@ Rod Sí y aclararé eso
Anthony Pham

2
El lenguaje de "perdido" es confuso para mí, ya que una pregunta "perdida" podría significar una pregunta que el estudiante no respondió (a diferencia de su significado aparente, respondió incorrectamente ).
DLosc

@DLosc Siempre habrá una sola respuesta en un círculo
Anthony Pham el

¿Es 50aceptable un puntaje o tiene que serlo 50.0?
DLosc

Respuestas:


2

05AB1E , 43 bytes

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

Pruébalo en línea!

Explicación

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

4

Apilado , 68 + 1 = 69 bytes

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

Pruébalo en línea! +1 para -pbandera (este script se puede ejecutar como stacked -pe "...")

Toma dos entradas desde la parte superior de la pila.

Algunas características interesantes:

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

Esto produce todas las letras rodeadas de tuberías.

: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

Esto nos da todos los números de preguntas incorrectos.


3

Python 2 , 94 93 bytes

-1 byte gracias 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

Pruébalo en línea!


Bonito, mucho mejor que el mío. Puede reemplazar 100.con1e2
L3viathan

No creo que esto cumpla con el requisito de redondear el puntaje a "la décima de punto más cercana", ¿verdad?
DLosc

3

Pip , 49 46 44 48 45 bytes

Uf, ese redondeo toma tantos bytes ... 44 bytes de código, +1 para la -sbandera.

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

Toma datos como argumentos de línea de comando (la página scan-tron necesitará citar y escapar de nuevas líneas si la ejecuta desde una línea de comando real). Emite las preguntas perdidas primero, luego el puntaje. Pruébalo en línea!

Explicación

Voy a hacer esto en dos partes: la lista de preguntas incorrectas y el puntaje.

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)

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

Podría ahorrar 5 bytes usando comas y devolviendo todo una línea:

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

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%

Primero lee la clave de respuestas en STDIN, luego n*3pregunta las filas. Nota: La puntuación se imprime sin un cero a la izquierda si es menor que 1.0. Las respuestas perdidas se imprimen con un espacio inicial.


0

CJam , 47 45 bytes

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

Pruébalo en línea!

Explicación

El programa consta de tres partes principales:

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

Después de esta sección, tenemos una gran variedad de 0s y 1s, en donde 0indica una respuesta equivocada y 1una respuesta correcta.

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

Después de esta sección, la pila contiene solo la lista correcta / incorrecta, y se ha emitido el puntaje porcentual.

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

0

Jolf, 46 bytes

Parece que no puedo romper 46 bytes. Tengo dos soluciones de esta longitud. ¡Prueba uno aquí!

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

(Reemplazar con 0x7fen el siguiente)

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

En cualquiera de los casos, 15 bytes para el redondeo: mX*~1/-lζlγlζ_1. Son, en su mayor parte, iguales, excepto que uno usa una combinación de expresiones regulares para obtener los resultados, y el otro se divide en tuberías.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.