Geben Sie einen Multiple-Choice-Test

14

Ich präsentiere Ihnen einen Test! Ihr Test ist zu testen. Der Test besteht darin, den Probanden mit Tests zu testen, die Ihnen ein Tester in der Shortest - Codemenge gibt. Insbesondere geben Sie einen Multiple-Choice-Test, den Sie als Eingabe erhalten haben.

In dieser Herausforderung müssen Sie eine Eingabe wie folgt vornehmen:

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

Und hier ist ein Beispiel für den Test:

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

Formale Spezifikation:

  • Eingang
    • Beginnt eine Zeile mit einer Zahl, gefolgt von einem Punkt und einem Leerzeichen, handelt es sich um eine Frage mit dieser Zahl. Die Zahlen beginnen immer bei 1 und steigen bei jeder Frage um 1.
    • Wenn eine Zeile mit einem optionalen Sternchen, einem Buchstaben, einem Doppelpunkt und einem Leerzeichen beginnt, ist dies eine Antwort. Die Antworten werden auch immer sequentiell sein. Pro Frage gibt es nur eine richtige Antwort.
    • Eine Zeile beginnt nicht anders als auf die zuvor genannten Arten.
    • Eingaben können in irgendeiner Weise akzeptiert werden (Lesen aus einer Datei, stdin usw.), dürfen jedoch nicht fest in Ihr Programm codiert werden.
  • Ausgang (Testphase)
    • Drucken Sie zunächst jede Frage nacheinander aus. Drucken Sie die Frage und ihre Antworten wie in der Eingabe erhalten aus, aber drucken Sie nicht das Sternchen, das die richtigen Antworten angibt.
    • Drucken Sie dann eine neue Zeile und "answer: ". Warten Sie auf Benutzereingaben. Benutzereingaben entsprechen immer einer Antwort.
    • Wenn die richtige Antwort (die mit einem Stern) mit der vom Benutzer eingegebenen identisch ist, wird sie ausgegeben "correct!". Andernfalls wird ausgegeben "incorrect! the answer was " + correct_letter.
    • Trennen Sie jede Frage mit einer Leerzeile und wiederholen Sie die vorherigen Ausgabeschritte, bis keine Fragen mehr vorhanden sind.
  • Ausgabe (Übersichtsphase)
    • Drucken Sie "overview: "und dann eine neue Zeile.
    • Drucken "{number of correct answers} correct, {incorrect answers} incorrect ({percent correct, rounded to the nearest whole number}%)"(natürlich die Phrasen in geschweiften Klammern durch ihre jeweiligen Werte ersetzen). Dann drucken Sie eine leere Zeile für den Abstand.
    • Drucken Sie nun für jede Frage, die falsch war, die Frage (nicht die Antworten) in einer neuen Zeile "you chose " + answer_you_choseund in einer anderen Zeile aus "the answer was " + correct_answer. Trennen Sie die Übersicht jeder falschen Antwort mit einer Leerzeile.
  • Um das Schummeln zu reduzieren, indem Dinge wörtlich interpretiert werden, wenn hier dieselbe Ausgabe und in der Testphase dieselbe Eingabe erfolgt, muss Ihr Programm genau dasselbe wie die Beispielausgabe ausgeben.

Das ist ; kürzester Code gewinnt! (Und bekommt ein A + (grünes Häkchen)!)

Türknauf
quelle
2
Schöne Herausforderung, aber ich wünschte , der Probe - Test möglicherweise heikele Situationen zu enthalten, wie \d\. , \w: und \*in der Mitte von Fragen / Antworten. (Zum Beispiel kann derzeit die *mit beseitigt werden y/*//, während der richtige Weg langwierig ist s/^\*//.)
manatwork
2
Müssen wir die Fortsetzung der Leitung zulassen? Ich meine, wird es Zeilen geben, die nicht mit „1. " oder ein: "? Wenn ja, bitte solche Fälle in die Stichprobenprüfung einbeziehen.
Handarbeit
@manatwork (erster Kommentar) Ok, Bearbeitung (zweiter Kommentar) Nein, das tust du nicht. Ich werde klären.
Türklinke
1
Wie werden Sie diesen Testtest testen?
Joe Z.
2
@JoeZ. Umm ... nicht sicher, was du meinst ... Ich habe einen Test-Testfall für den Test
Türklinke

Antworten:

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

Hinweis: Die Zeilenumbrüche sind für die Ausgabeformatierung erforderlich.

Jedes Mal, wenn ich denke, ich kann nicht mehr Golf spielen, lerne ich etwas Neues! Es wird langsam mehr Interpunktion als lesbarer Text ... Ich denke, das ist eine gute Sache?

Verwendung: perl -e '...' test.txtoder perl test.pl test.txt.

Wenn Sie eine Option auswählen, die nicht in der Liste aufgeführt ist, wird in der Übersicht eine falsche Ausgabe angezeigt ( you chose: 1. Our site is called Programming Puzzles & Code ________.beispielsweise).

Beispiellauf

Dom Hastings
quelle
Bitte zeigen Sie ein Beispiel für Ein- und Ausgabe.
DavidC
@DavidCarraher hat einen aktualisierten Link zur Ausgabe über showterm.io hinzugefügt . Dachte, das wäre geringfügig besser als statische Ausgabe, obwohl es immer noch nicht genau so erfasst, wie es im Terminal ist.
Dom Hastings
Das gibt einen ziemlich guten Überblick darüber, wie Ihr Programm funktioniert.
DavidC
3

Mathematica 144

Dies kann ein ungültiger Versuch sein. Ich habe die Frage von jeder Antwort in der Eingabe getrennt. Ich habe die richtige Antwort auch durch einen Buchstaben in einem separaten Feld und nicht durch ein Sternchen vor der Alternative angegeben.

Wie auch immer...

Die Daten

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

Eine Antwort auf jede Frage wird über ein Dialogfeld eingegeben. Fragen, Antworten und Feedback werden gedruckt.

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

Prüfung

f /@ questions

Dialogauswahl

DavidC
quelle
Wow beeindruckend! Die Eingabe ist jedoch nicht in der richtigen Form. Trotzdem ist das sehr bemerkenswert für die Kürze des Codes und wie viel es bewirkt!
Türklinke
Vielen Dank. Das Einmassieren der Eingabezeichenfolge in eine Mathematica-freundliche Struktur ist natürlich möglich, aber es hätte die Eleganz verborgen, die der gegenwärtigen, nicht förderfähigen Lösung zugrunde liegt.
DavidC
Nett. Vier Zeichen kürzer: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
Und sparen Sie noch einen, indem Sie Print@If[...]stattdessen verwenden 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);

formatiert: 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);

Dies wird sicherlich nicht die kürzeste sein, aber es ist alles in sich geschlossen

reblerebel
quelle
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

Viel länger als ich möchte. Es ist Wiki so eingestellt, dass Sie es haben!

Leider verlieren wir 32 Zeichen, wenn wir stdout löschen. Weitere 38 Zeichen könnten gespeichert werden, wenn das Testskript aus einer festen Datei mit dem Namen "t" gelesen und nicht in der Befehlszeile angegeben würde.

Beim Ausführen der in der Frage angegebenen Eingabe:

& 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
quelle