Çoktan seçmeli bir test yapın


14

Size bir test sunuyorum! Testiniz test etmektir. Test, test edeni, bir test cihazının size verdiği kısa test miktarında testlerle test etmektir . Özellikle, girdi olarak aldığınız çoktan seçmeli bir test vereceksiniz.

Bu meydan okumada, böyle bir girdi almalısınız:

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

Ve burada yapılan testin bir örneği:

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

Resmi şartname:

  • Giriş
    • Bir çizgi bir sayı ve ardından bir nokta ve boşluk ile başlıyorsa, o sayı ile bir sorudur. Sayılar her zaman 1'den başlar ve her soruda 1 yükselir.
    • Bir çizgi isteğe bağlı bir yıldız işareti, bir harf, iki nokta üst üste ve ardından boşlukla başlarsa, bu bir yanıttır. Cevaplar da her zaman sıralı olacaktır. Her soru için tek bir doğru cevap olacaktır.
    • Bir çizgi daha önce belirtilen yollardan başka bir şekilde başlamaz.
    • Giriş herhangi bir şekilde kabul edilebilir (bir dosyadan okuma, stdin, vb.) Ancak programınıza sabit olarak kodlanmamalıdır.
  • Çıktı (test alma aşaması)
    • İlk olarak, her soruyu sırayla yazdırın. Soruyu ve cevaplarını girdi olarak alındığı gibi yazdırın, ancak doğru cevapları gösteren yıldız işaretini yazdırmayın.
    • Ardından, yeni satır yazdırın ve "answer: ". Kullanıcı girişini bekleyin. Kullanıcı girişi her zaman bir cevaba karşılık gelecektir.
    • Doğru cevap (yıldız işareti olan) kullanıcı girdisi ile aynı ise, çıktı "correct!". Aksi takdirde çıktı "incorrect! the answer was " + correct_letter.
    • Her soruyu boş bir satırla ayırın, ardından başka soru kalmayana kadar önceki çıktı adımlarını tekrarlayın.
  • Çıktı (genel bakış aşaması)
    • Yazdır "overview: "ve ardından bir satırsonu.
    • Yazdır "{number of correct answers} correct, {incorrect answers} incorrect ({percent correct, rounded to the nearest whole number}%)"(elbette kıvırcık parantez içindeki ifadeleri kendi değerleriyle değiştirerek). Ardından boşluk bırakmak için boş bir satır yazdırın.
    • Şimdi, yanlış olan her soru için, soruyu (cevaplarını değil), sonra yeni bir satıra "you chose " + answer_you_choseve başka bir satıra yazdırın "the answer was " + correct_answer. Her yanlış cevabın genel görünümünü boş bir satırla ayırın.
  • Bir şeyleri tam anlamıyla yorumlayarak hile azaltmak için, burada aynı çıktı ve test alma aşamasında aynı girdi verildiğinde, programınız örnek çıktıyla tamamen aynı çıktıyı vermelidir.

Bu ; en kısa kod kazanır! (Ve A + (yeşil onay işareti) alır!)


2
Güzel meydan, ama örnek testi gibi muhtemelen zor durumları ihtiva isteyen \d\. , \w: ve \*sorular / cevaplar ortasında. (Örneğin şu anda *ile ortadan kaldırılabilir y/*//, doğru yol olarak uzun s/^\*//.)
manatwork

2
Hattın devam etmesine izin vermeli miyiz? Demek istediğim, “1 ile başlayan satırlar olacak mı? ”Veya“ A: ”? Cevabınız evet ise, lütfen bu tür vakaları örnek testine ekleyin.
manatwork

@manatwork (ilk yorum) Tamam, düzenleme (ikinci yorum) hayır, yapma. Açıklığa kavuşacağım.
Kapı tokmağı

1
Peki bu test testini nasıl test edeceksiniz?
Joe Z.

2
@JoeZ. Umm ... ne demek istediğinden emin değilim ... Test cihazını test etmek için test için bir test test çantası
sağladım

Yanıtlar:


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

Not: Çıktı biçimlendirmesi için yeni satırlar gereklidir.

Artık golf oynayamayacağımı her düşündüğümde yeni bir şey öğreniyorum! Okunaklı metinden yavaş yavaş daha fazla noktalama işareti haline geliyor ... Bence bu iyi bir şey mi?

Kullanımı: perl -e '...' test.txtveya perl test.pl test.txt.

Listede sunulmayan bir seçenek seçerseniz, genel bakışta yanlış çıktı alırsınız ( you chose: 1. Our site is called Programming Puzzles & Code ________.örneğin söyleyecektir ).

Örnek çalışma


Lütfen bir giriş ve çıkış örneği gösterin.
DavidC

@DavidCarraher üzerinden çıkışa güncelleştirilmiş bir link ekledi showterm.io . Hala terminaldeki ile aynı şekilde yakalanmasa da, statik çıktıdan biraz daha iyi olacağını düşündüm.
Dom Hastings

Bu, programınızın nasıl çalıştığına dair oldukça iyi bir fikir verir.
DavidC

3

Mathematica 144

Bu geçersiz bir girişim olabilir. Soruyu girişteki her cevaptan ayırdım. Ayrıca, doğru cevabı, alternatifin önündeki yıldız işareti yerine ayrı bir alandaki bir harfle belirtmiştim.

Neyse ...

Veri

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

Her soruya bir cevap bir iletişim kutusundan girilir. Sorular, cevaplar ve geri bildirimler yazdırılır.

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

Ölçek

f /@ questions

iletişim seçimi


vay etkileyici! giriş doğru biçimde değil ... yine de, bu kodun kısalığı ve ne kadar yaptığı için çok dikkat çekici!
Kapı tokmağı

Teşekkürler. Giriş dizesini Mathematica dostu bir yapıya masaj yapmak elbette mümkündür, ancak mevcut, uygun olmayan çözümün altında yatan şıklığı gizleyecektir.
DavidC

Güzel. Dört karakter daha kısa: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

Ve kullanmak Print@If[...]yerine bir tane daha kaydedin 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);

biçimlendirilmiş: 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);

Bu kesinlikle en kısa olmayacak, ancak hepsi kendi kendine yeten


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

İstediğimden çok daha uzun. Wiki ayarlanmış, bu yüzden ona sahip ol!

Ne yazık ki, stdout'u temizlemek için 32 karakter kaybediyoruz. Test komut dosyası, komut satırında belirtilmek yerine "t" adlı sabit bir dosyadan okunduysa, 38 karakter daha kaydedilebilir.

Soruda verilen girdi üzerinde çalıştırıldığında:

& 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.