Daj test wielokrotnego wyboru

14

Przedstawiam wam test! Twój test to test. Test polega na przetestowaniu testowanego za pomocą testów, które daje tester, w mniejszej ilości kodu testowego . W szczególności podasz test wielokrotnego wyboru, który otrzymałeś jako wkład.

W tym wyzwaniu musisz wprowadzić następujące dane wejściowe:

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

A oto przykład przeprowadzanego testu:

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

Specyfikacja formalna:

  • Wejście
    • Jeśli linia zaczyna się od liczby, po której następuje kropka i spacja, jest to pytanie o tej liczbie. Liczby zawsze zaczynają się od 1 i zwiększają o 1 każde pytanie.
    • Jeśli linia zaczyna się od opcjonalnej gwiazdki, litery, dwukropka, a następnie spacji, jest to odpowiedź. Odpowiedzi będą również zawsze sekwencyjne. Na każde pytanie będzie tylko jedna poprawna odpowiedź.
    • Linia nie rozpocznie się w żaden inny sposób niż wcześniej wspomniane sposoby.
    • Dane wejściowe mogą być akceptowane w jakikolwiek sposób (odczyt z pliku, standardowe wejście itp.), Ale nie mogą być zapisane na stałe w programie.
  • Wyjście (faza testowania)
    • Najpierw wydrukuj kolejno każde pytanie. Wydrukuj pytanie i jego odpowiedzi zgodnie z otrzymanymi danymi wejściowymi, ale nie drukuj gwiazdki wskazującej prawidłowe odpowiedzi.
    • Następnie wydrukuj nowy wiersz i "answer: ". Poczekaj na dane wejściowe użytkownika. Dane wejściowe użytkownika zawsze będą odpowiadać na odpowiedź.
    • Jeśli poprawna odpowiedź (ta z gwiazdką) jest taka sama jak ta wprowadzona przez użytkownika, wyślij "correct!". W przeciwnym razie wyjście "incorrect! the answer was " + correct_letter.
    • Oddziel każde pytanie pustą linią, a następnie powtarzaj poprzednie kroki wyjściowe, aż nie będzie już żadnych pytań.
  • Wyjście (faza przeglądu)
    • Wydrukuj, "overview: "a następnie nowy wiersz.
    • Drukuj "{number of correct answers} correct, {incorrect answers} incorrect ({percent correct, rounded to the nearest whole number}%)"(oczywiście zastępując wyrażenia w nawiasach klamrowych ich odpowiednimi wartościami). Następnie wydrukuj pustą linię dla odstępów.
    • Teraz, dla każdego błędnego pytania, wydrukuj pytanie (nie jego odpowiedzi), a następnie w nowym wierszu "you chose " + answer_you_chosei w innym wierszu "the answer was " + correct_answer. Oddziel przegląd każdej błędnej odpowiedzi pustą linią.
  • Aby ograniczyć oszustwo poprzez dosłowną interpretację rzeczy, gdy otrzyma się tutaj takie same dane wyjściowe i takie same dane wejściowe w fazie wykonywania testu, program musi wyświetlać dokładnie to samo, co dane wyjściowe próbki.

To jest ; najkrótszy kod wygrywa! (I dostaje A + (zielony znacznik wyboru)!)

Klamka
źródło
2
Nicea wyzwanie, ale życzę test próbki zawierają ewentualnie trudnych sytuacjach, jak \d\. , \w: i \*w środku pytań / odpowiedzi. (Na przykład obecnie *można go wyeliminować y/*//, podczas gdy poprawny sposób jest długi jak s/^\*//.)
manatwork
2
Czy musimy zezwolić na kontynuację linii? Mam na myśli, czy będą linie, które nie zaczynają się od „1. ”Lub„ A: ”? Jeśli tak, prosimy o uwzględnienie takich przypadków w teście próbnym.
manatwork
@manatwork (pierwszy komentarz) Ok, edycja (drugi komentarz) nie, nie. Wyjaśnię.
Klamka
1
Jak zamierzasz przetestować ten test?
Joe Z.
2
@JoeZ. Umm ... nie jestem pewien, co masz na myśli ... Dostarczyłem testową skrzynkę testową do testu w celu przetestowania twojego testera
Klamka

Odpowiedzi:

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

Uwaga: Nowe wiersze są wymagane do formatowania wyjściowego.

Za każdym razem, gdy wydaje mi się, że nie mogę już grać w golfa, uczę się czegoś nowego! Powoli staje się coraz bardziej interpunkcyjny niż czytelny tekst ... Myślę, że to dobra rzecz?

Zastosowanie: perl -e '...' test.txtlub perl test.pl test.txt.

Jeśli wybierzesz opcję niewymienioną na liście, otrzymasz niepoprawne dane wyjściowe w przeglądzie (powiedzą you chose: 1. Our site is called Programming Puzzles & Code ________.na przykład).

Przykładowy przebieg

Dom Hastings
źródło
Uprzejmie pokaż przykład wejścia i wyjścia.
DavidC,
@DavidCarraher dodał zaktualizowany link do danych wyjściowych za pośrednictwem showterm.io . Pomyślałem, że byłoby to nieznacznie lepsze niż wyjście statyczne, chociaż nadal nie rejestruje go dokładnie tak samo, jak w terminalu.
Dom Hastings,
Daje to dość dobry obraz działania twojego programu.
DavidC,
3

Mathematica 144

To może być niepoprawna próba. Oddzieliłem pytanie od każdej odpowiedzi na wejściu. Prawidłową odpowiedź wskazałem również literą w oddzielnym polu zamiast gwiazdki przed alternatywą.

Tak czy siak...

Dane

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

Kod

Odpowiedź na każde pytanie jest wprowadzana w oknie dialogowym. Pytania, odpowiedzi i opinie są drukowane.

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

Test

f /@ questions

wybór okna dialogowego

DavidC
źródło
wow, imponujące! dane wejściowe nie są jednak w prawidłowej formie ... to jednak jest bardzo niezwykłe ze względu na zwięzłość kodu i jego wartość!
Klamka
Dzięki. Masowanie łańcucha wejściowego w strukturę przyjazną matematyce jest oczywiście możliwe, ale ukryłoby elegancję leżącą u podstaw obecnego, niekwalifikowalnego rozwiązania.
DavidC,
Ładny. Cztery postacie krótsze: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
I oszczędzaj jeszcze jeden, używając Print@If[...]zamiast 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);

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

To z pewnością nie będzie najkrótszy, ale jest samowystarczalny

reblerebel
źródło
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

Znacznie dłużej niż chciałbym. Ustawiono wiki, więc miej to!

Niestety, tracimy 32 postacie na kolorowanie stdout. Kolejne 38 znaków można by zapisać, gdyby skrypt testowy został odczytany ze stałego pliku o nazwie „t”, a nie określony w wierszu poleceń.

Po uruchomieniu na danych wejściowych podanych w pytaniu:

& 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
źródło