Dar una prueba de opción múltiple

14

Te presento una prueba! Tu prueba es para probar. La prueba consiste en evaluar al examinado con las pruebas que le da un probador, en la cantidad de código de prueba shor . Específicamente, dará una prueba de opción múltiple que ha recibido como entrada.

En este desafío, debe tomar una entrada como esta:

1. Our site is called Programming Puzzles & Code ________.
A: Debugging
*B: Golf
C: Hockey
D: Programming
2. What is the *most* popular tag on our site?
A: [debug]
B: [program]
*C: [code-golf]
D: [number]
E: [c++]
3. We are part of the ________ Exchange network.
*A: Stack
B: Code
C: Programmer
D: Hockey
4. Is this the first question?
A: Yes
*B: No
5. Is this the last question?
*A: Yes
B: No

Y aquí hay un ejemplo de la prueba que se está tomando:

1. Our site is called Programming Puzzles & Code ________.
A: Debugging
B: Golf
C: Hockey
D: Programming
answer: B
correct!

2. What is the *most* popular tag on our site?
A: [debug]
B: [program]
C: [code-golf]
D: [number]
E: [c++]
answer: C
correct!

3. We are part of the ________ Exchange network.
A: Stack
B: Code
C: Programmer
D: Hockey
answer: B
incorrect! the answer was A

4. Is this the first question?
A: Yes
B: No
answer: B
correct!

5. Is this the last question?
A: Yes
B: No
answer: B
incorrect! the answer was A

overview:
3 correct, 2 incorrect (60%)

3. We are part of the ________ Exchange network.
you chose B: Code
the answer was A: Stack

5. Is this the last question?
you chose B: No
the answer was A: Yes

Especificación formal:

  • Entrada
    • Si una línea comienza con un número seguido de un punto y un espacio, es una pregunta con ese número. Los números siempre comenzarán desde 1 y subirán 1 en cada pregunta.
    • Si una línea comienza con un asterisco opcional, una letra, dos puntos y luego un espacio, es una respuesta. Las respuestas también serán siempre secuenciales. Solo habrá una respuesta correcta por pregunta.
    • Una línea no comenzará de ninguna otra manera que las formas mencionadas anteriormente.
    • La entrada puede ser aceptada de cualquier manera (lectura de un archivo, stdin, etc.) pero no debe estar codificada en su programa.
  • Salida (fase de prueba)
    • Primero, imprima cada pregunta secuencialmente. Imprima la pregunta y sus respuestas como se recibieron en la entrada, pero no imprima el asterisco que indica las respuestas correctas.
    • Luego, imprima una nueva línea y "answer: ". Espere la entrada del usuario. La entrada del usuario siempre corresponderá a una respuesta.
    • Si la respuesta correcta (la que tiene un asterisco) es la misma que la entrada, salida del usuario "correct!". De lo contrario, salida "incorrect! the answer was " + correct_letter.
    • Separe cada pregunta con una línea en blanco, luego repita los pasos de salida anteriores hasta que no haya más preguntas.
  • Salida (fase de resumen)
    • Imprimir "overview: "y luego una nueva línea.
    • Imprimir "{number of correct answers} correct, {incorrect answers} incorrect ({percent correct, rounded to the nearest whole number}%)"(por supuesto, sustituyendo las frases entre llaves con sus respectivos valores). Luego imprima una línea en blanco para espaciar.
    • Ahora, para cada pregunta que estuvo mal, imprima la pregunta (no sus respuestas), luego en una nueva línea "you chose " + answer_you_chosey en otra línea "the answer was " + correct_answer. Separe la descripción general de cada respuesta incorrecta con una línea en blanco.
  • Para reducir las trampas al interpretar las cosas literalmente, cuando se le da la misma salida aquí, y la misma entrada en la fase de toma de prueba, su programa debe emitir exactamente lo mismo que la salida de muestra.

Este es el ; el código más corto gana! (¡Y obtiene una A + (marca de verificación verde)!)

Pomo de la puerta
fuente
2
Buen desafío, pero deseo que el examen de muestra contenga situaciones posiblemente difíciles, como \d\. , \w: y \*en medio de preguntas / respuestas. (Por ejemplo, actualmente *se puede eliminar con y/*//, mientras que la forma correcta es larga como s/^\*//.)
manatwork
2
¿Necesitamos permitir la continuación de la línea? Quiero decir, ¿habrá líneas que no comiencen con “1. "O" A: "? En caso afirmativo, incluya tales casos en la prueba de muestra.
manatwork
@manatwork (primer comentario) Ok, edición (segundo comentario) no, no lo haces. Voy a aclarar
Pomo de la puerta
1
Entonces, ¿cómo vas a probar esta prueba de prueba?
Joe Z.
2
@JoeZ. Umm ... no estoy seguro de lo que quieres decir ... proporcioné un caso de prueba para que la prueba pruebe tu probador
Doorknob

Respuestas:

2

Perl 5, 279

$y=correct;@w=(the,$n=answer,was);map{s/^\*((.+?):.+)/$a=$1/me;print"$_$n: ";chop($@=<>);print$@eq($l=$2)?++$d&&"$y!

":(/^\d.+/,$o.=$&,/^$@.+/m,$o.="
you chose: $&
@w $a

")&&"in$y! @w $l

"}@_=split/(?=^\d)/m,join"",<>;printf"overview:
$d $y, %d in$y (%d%)

$o",@_-$d,$d/@_*100

Nota: Las nuevas líneas son necesarias para el formato de salida.

¡Cada vez que pienso que no puedo jugar más al golf, aprendo algo nuevo! Poco a poco se está convirtiendo en más puntuación que texto legible ... ¿Creo que es algo bueno?

Uso: perl -e '...' test.txto perl test.pl test.txt.

Si elige una opción que no se presenta en la lista, obtendrá un resultado incorrecto en la descripción general ( you chose: 1. Our site is called Programming Puzzles & Code ________.por ejemplo , dirá ).

Ejecución de ejemplo

Dom Hastings
fuente
Muestra amablemente un ejemplo de entrada y salida.
DavidC
@DavidCarraher agregó un enlace actualizado a la salida a través de showterm.io . Pensé que sería marginalmente mejor que la salida estática, aunque todavía no lo captura exactamente igual que en el terminal.
Dom Hastings
Eso ofrece una visión bastante buena de cómo funciona su programa.
DavidC
3

Mathematica 144

Esto puede ser un intento no válido. Separé la pregunta de cada respuesta en la entrada. También indiqué la respuesta correcta con una letra en un campo separado, en lugar de un asterisco antes de la alternativa.

De todas formas...

Los datos

questions={{{"\n1. Our site is called Programming Puzzles & Code ________.\n","A: Bugging\n","B: Golf\n","C: Hockey\n","D: Programming\n"},"B"},{{"\n2. What is the most popular tag on our site? \n","A: [debug]\n","B: [program]\n","C: [code golf]\n","D: [number]\n"},"C"},{{"\n3. We are part of the _______ Exchange network. \n","A: Stack\n","B: Code\n","C: Programmer\n","D: Hockey\n"},"A"},{{"\n4. Is this the first question? \n","A: Yes\n","B: No\n"},"B"},{{"\n5. Is this the last question? \n","A: Yes\n","B: No\n"},"A"}};

Código

Se ingresa una respuesta a cada pregunta a través de un cuadro de diálogo. Se imprimen preguntas, respuestas y comentarios.

f@x_:=
Print[If[((r=ChoiceDialog[Print[""<>#,"\nanswer: "];""<>#,StringTake[Rest@#,1]])==#2),
r<>"\ncorrect!", r<>"\nincorrect, the answer is "<>#2]&@@x] 

Prueba

f /@ questions

elección de diálogo

DavidC
fuente
¡Wow impresionante! sin embargo, la entrada no está en la forma correcta ... aún así, ¡eso es muy notable por la brevedad del código y cuánto lo hace!
Pomo
Gracias. Por supuesto, es posible masajear la cadena de entrada en una estructura amigable con Mathematica, pero habría ocultado la elegancia subyacente a la solución actual, no elegible.
DavidC
Agradable. Cuatro caracteres más cortos:g@{a_,b_}:=Print[If[(r=ChoiceDialog[Print[""<>a,"\nanswer: "];""<>a,Rest@a~StringTake~1])==b,r<>"\ncorrect!",r<>"\nincorrect, the answer is "<>b]]
Mr.Wizard
Y guarde uno más utilizando en Print@If[...]lugar de Print[If[...]].
Mr.Wizard
2

Java - 1210

int i,o;String q;String[]s={"1. Our site is called Programming Puzzles & Code ________.\n","2. What is the most popular tag on our site?\n","3. We are part of the ________ Exchange network.\n","4. Is this the first question?\n","5. Is this the last question?\n"},b={"B","C","A","B","A"},p=new String[5];String[][]a={{"A: Debugging\n","B: Golf\n","C: Hockey\n","D: Programming\n","answer: "},{"A: [debug]\n","B: [program]\n","C: [code-golf]\n","D: [number]\n","E: [c++]\n","answer: "},{"A: Stack\n","B: Code\n","C: Programmer\n","D: Hockey\n","answer: "},{"A: Yes\n","B: No\n","answer: "},{"A: Yes\n","B: No\n","answer: "}};java.util.Map<String,Integer>m=new java.util.HashMap(){{put("A",0);put("B",1);put("C",2);put("D",3);put("E",4);}};java.util.Scanner u=new java.util.Scanner(System.in);for(i=0;i<5;i++){q=s[i];for(o=0;o<a[i].length;)q+=a[i][o++];System.out.print(q);if(b[i].equals(p[i]=u.nextLine()))q="correct!";else q="incorrect! the answer was "+b[i];System.out.println(q+"\n");}q="";o=0;for(i=0;i<5;i++)if(b[i].equals(p[i]))o++;else q+=s[i]+"you chose "+a[i][m.get(p[i])]+"the answer was "+a[i][m.get(b[i])]+"\n";System.out.println("overview:\n"+o+" correct, "+(5-o)+" incorrect ("+o*100/5+"%)\n\n"+q);

formateado: 1980

String[] s = {"1. Our site is called Programming Puzzles & Code ________.\n",
        "2. What is the most popular tag on our site?\n",
        "3. We are part of the ________ Exchange network.\n",
        "4. Is this the first question?\n",
        "5. Is this the last question?\n"};
    String[][] a = {
        {"A: Debugging\n", "B: Golf\n", "C: Hockey\n", "D: Programming\n", "answer: "},
        {"A: [debug]\n", "B: [program]\n", "C: [code-golf]\n", "D: [number]\n", "E: [c++]\n", "answer: "},
        {"A: Stack\n", "B: Code\n", "C: Programmer\n", "D: Hockey\n", "answer: "},
        {"A: Yes\n", "B: No\n", "answer: "},
        {"A: Yes\n", "B: No\n", "answer: "}};

    java.util.Map<String, Integer> m = new java.util.HashMap<String, Integer>() {
        {
            put("A", 0);
            put("B", 1);
            put("C", 2);
            put("D", 3);
            put("E", 4);
        }
    };
    String[] b = {"B", "C", "A", "B", "A"};
    String[] p = new String[5];
    java.util.Scanner u = new java.util.Scanner(System.in);
    String q;
    int i;
    int o;
    for (i = 0; i < 5; i++) {
        q = s[i];
        for (o = 0; o < a[i].length;) {
            q += a[i][o++];
        }
        System.out.print(q);
        if (b[i].equals(p[i] = u.nextLine())) {
            q = "correct!";
        } else {
            q = "incorrect! the answer was " + b[i];
        }
        System.out.println(q + "\n");
    }
    q = "";
    o = 0;
    for (i = 0; i < 5; i++) {
        if (b[i].equals(p[i])) {
            o++;
        } else {
            q += s[i] + "you chose " + a[i][m.get(p[i])] + "the answer was " + a[i][m.get(b[i])] + "\n";
        }
    }
    System.out.println("overview:\n" + " correct, " + (5 - o) + " incorrect (" + o * 100 / 5 + "%)\n\n" + q);

Esto ciertamente no será el más corto, pero es todo autónomo.

reblerebel
fuente
0

Haskell, 598

import System.Environment
import System.IO
n=putStrLn
p=putStr
d#s=p$show d++s
v&(m:a)=n m>>q[]""a>>= \(r,(s,t))->n s>>n"">>b v m t&r
(r,w,s)&[]=n"overview:">>r#" correct, ">>w#" incorrect (">>((100*r)`div`(r+w))#"%)\n">>mapM_ n s
b(r,w,s)m t|null t=(r+1,w,s)|1<3=(r,w+1,s++"":m:t)
q u c(('*':a):r)=q u a(a:r)
q u c(a@(o:':':_):r)=n a>>q(([o],a):u)c r
q u c r=p"answer: ">>hFlush stdout>>(\i->(r,a(maybe i id$lookup i u)c))`fmap`getLine
a j c|j==c=("correct!",[])|1<3=("incorrect! the answer was "++[head c],["you choose "++j,"the answer was "++c])
main=getArgs>>=readFile.head>>=((0,0,[])&).lines

Mucho más de lo que me gustaría. Está configurado wiki, ¡así que tenlo!

Por desgracia, perdemos 32 caracteres por el stdout enrojecido. Se podrían guardar otros 38 caracteres si el script de prueba se leyera desde un archivo fijo llamado "t" en lugar de especificarse en la línea de comando.

Cuando se ejecuta en la entrada dada en la pregunta:

& runhaskell 15961-Tester.hs 15961-test.txt 
1. Our site is called Programming Puzzles & Code ________.
A: Debugging
B: Golf
C: Hockey
D: Programming
answer: B
correct!

2. What is the *most* popular tag on our site?
A: [debug]
B: [program]
C: [code-golf]
D: [number]
E: [c++]
answer: C
correct!

3. We are part of the ________ Exchange network.
A: Stack
B: Code
C: Programmer
D: Hockey
answer: B
incorrect! the answer was A

4. Is this the first question?
A: Yes
B: No
answer: B
correct!

5. Is this the last question?
A: Yes
B: No
answer: B
incorrect! the answer was A

overview:
3 correct, 2 incorrect (60%)

3. We are part of the ________ Exchange network.
you choose B: Code
the answer was A: Stack

5. Is this the last question?
you choose B: No
the answer was A: Yes
MtnViewMark
fuente