Donnez un test à choix multiples

14

Je vous présente un test! Votre test est de tester. Le test est de tester la testee avec les tests d' un testeur vous donne, dans le Shor test de quantité de code. Plus précisément, vous effectuerez un test à choix multiples que vous avez reçu en entrée.

Dans ce défi, vous devez prendre une entrée comme celle-ci:

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

Et voici un exemple du test effectué:

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

Spécification formelle:

  • Contribution
    • Si une ligne commence par un nombre suivi d'un point et d'un espace, c'est une question avec ce nombre. Les nombres commenceront toujours par 1 et monteront 1 à chaque question.
    • Si une ligne commence par un astérisque facultatif, une lettre, un deux-points, puis un espace, c'est une réponse. Les réponses seront également toujours séquentielles. Il n'y aura qu'une seule bonne réponse par question.
    • Une ligne ne commencera pas autrement que par les voies mentionnées précédemment.
    • L'entrée peut être acceptée de n'importe quelle manière (lecture à partir d'un fichier, stdin, etc.) mais ne doit pas être codée en dur dans votre programme.
  • Sortie (phase de test)
    • Tout d'abord, imprimez chaque question séquentiellement. Imprimez la question et ses réponses telles qu'elles ont été reçues en entrée, mais n'imprimez pas l'astérisque indiquant les bonnes réponses.
    • Ensuite, imprimez une nouvelle ligne et "answer: ". Attendez l'entrée de l'utilisateur. L'entrée utilisateur correspondra toujours à une réponse.
    • Si la bonne réponse (celle avec un astérisque) est la même que celle entrée par l'utilisateur, sortez "correct!". Sinon, sortez "incorrect! the answer was " + correct_letter.
    • Séparez chaque question par une ligne vierge, puis répétez les étapes de sortie précédentes jusqu'à ce qu'il n'y ait plus de questions.
  • Sortie (phase de présentation)
    • Imprimez "overview: "puis une nouvelle ligne.
    • Imprimer "{number of correct answers} correct, {incorrect answers} incorrect ({percent correct, rounded to the nearest whole number}%)"(en remplaçant bien sûr les phrases entre accolades par leurs valeurs respectives). Imprimez ensuite une ligne vierge pour l'espacement.
    • Maintenant, pour chaque question erronée, imprimez la question (pas ses réponses), puis sur une nouvelle ligne "you chose " + answer_you_choseet sur une autre ligne "the answer was " + correct_answer. Séparez l'aperçu de chaque mauvaise réponse par une ligne vierge.
  • Afin de réduire la tricherie en interprétant les choses littéralement, lorsque la même sortie est donnée ici et la même entrée dans la phase de test, votre programme doit produire exactement la même chose que la sortie d'échantillon.

C'est du ; le code le plus court gagne! (Et obtient un A + (coche verte)!)

Poignée de porte
la source
2
Beau défi, mais je souhaite que le test de l' échantillon pour contenir des situations éventuellement difficiles, comme \d\. , \w: et \*au milieu des questions / réponses. (Par exemple, actuellement, le *peut être éliminé avec y/*//, tandis que le bon chemin est long comme s/^\*//.)
Manatwork
2
Faut-il autoriser la poursuite de la ligne? Je veux dire, y aura-t-il des lignes ne commençant pas par «1. "Ou" A: "? Si oui, veuillez inclure ces cas dans le test de l'échantillon.
manatwork
@manatwork (premier commentaire) Ok, édition (deuxième commentaire) non, vous ne le faites pas. Je vais clarifier.
Poignée de porte
1
Alors, comment allez-vous tester ce test?
Joe Z.
2
@JoeZ. Umm ... je ne sais pas trop ce que vous voulez dire ... J'ai fourni un cas de test pour le test afin de tester votre testeur
Poignée de porte

Réponses:

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

Remarque: Les retours à la ligne sont requis pour le formatage de sortie.

Chaque fois que je pense que je ne peux plus jouer au golf, j'apprends quelque chose de nouveau! Il devient lentement plus de ponctuation que le texte lisible ... Je pense que c'est une bonne chose?

Utilisation: perl -e '...' test.txtou perl test.pl test.txt.

Si vous choisissez une option non présentée dans la liste, vous obtiendrez une sortie incorrecte dans l'aperçu (on dira you chose: 1. Our site is called Programming Puzzles & Code ________.par exemple).

Exemple d'exécution

Dom Hastings
la source
Veuillez montrer un exemple d'entrée et de sortie.
DavidC
@DavidCarraher a ajouté un lien mis à jour vers la sortie via showterm.io . Je pensais que ce serait légèrement meilleur que la sortie statique, bien qu'il ne la capture toujours pas exactement de la même manière que dans le terminal.
Dom Hastings du
Cela donne une assez bonne vision du fonctionnement de votre programme.
DavidC
3

Mathematica 144

Cela peut être une tentative non valide. J'ai séparé la question de chaque réponse dans l'entrée. J'ai également indiqué la bonne réponse par une lettre dans un champ séparé, plutôt que par un astérisque avant l'alternative.

En tous cas...

Les données

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"}};

Code

Une réponse à chaque question est entrée via une boîte de dialogue. Les questions, réponses et commentaires sont imprimés.

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

Tester

f /@ questions

choix de dialogue

DavidC
la source
wow, impressionnant! L'entrée n'est pas sous la bonne forme cependant ... encore, c'est très remarquable pour la brièveté du code et à quel point il le fait!
Poignée de porte
Merci. Il est bien sûr possible de masser la chaîne d'entrée dans une structure compatible avec Mathematica, mais cela aurait caché l'élégance sous-jacente à la solution inéligible actuelle.
DavidC
Agréable. Quatre caractères plus courts: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
Et économisez un de plus en utilisant Print@If[...]plutôt que 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);

formaté: 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);

Ce ne sera certainement pas le plus court mais tout est autonome

reblerebel
la source
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

Bien plus longtemps que je ne le souhaiterais. C'est un wiki défini alors ayez-le!

Hélas, nous perdons 32 caractères à la sortie de la sortie standard. 38 autres caractères pourraient être enregistrés si le script de test était lu à partir d'un fichier fixe nommé "t" plutôt que spécifié sur la ligne de commande.

Lorsqu'il est exécuté sur l'entrée donnée dans la question:

& 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
la source