Auto Exam v0.1 問題作成用

もうサポートは終わっているようですが,練習問題に使わせていただいているCGIのAuto Exam v0.1は大変便利です。以下はその問題作成用スクリプトです。
たとえば,正解を回答例の筆頭とするタブ区切りの以下のようなデータ jugemu.txt
「じゅげむじゅげむ」の次は?	ごこうのすりきれ	かいじゃりすいぎょのすいぎょうまつ	うんらいまつ	ふうらいまつ	くうねるところにすむところ
「やぶらこうじのぶらこうじ」の次は?	ぱいぽぱいぽ	ぱいぽのしゅーりんがん	しゅーりんがんのぐーりんだい	ぐーりんだいのぽんぽこぴーの	ぽんぽこなーの
「ちょうきゅうめいの」の次は?	ちょうすけ	じゅげむじゅげむ	ごこうのすりきれ	うんらいまつ	ふうらいまつ
を,gawk -f 2AE.awk jugemu.txt のように処理すると,回答例がランダムに並び替えられ,jugemu.ae
Q1:「じゅげむじゅげむ」の次は?
S1:ふうらいまつ,くうねるところにすむところ,うんらいまつ,ごこうのすりきれ,かいじゃりすいぎょのすいぎょうまつ
A1:4
M1:1

Q2:「やぶらこうじのぶらこうじ」の次は?
S2:しゅーりんがんのぐーりんだい,ぱいぽのしゅーりんがん,ぽんぽこなーの,ぐーりんだいのぽんぽこぴーの,ぱいぽぱいぽ
A2:5
M2:1

Q3:「ちょうきゅうめいの」の次は?
S3:ふうらいまつ,ごこうのすりきれ,ちょうすけ,じゅげむじゅげむ,うんらいまつ
A3:3
M3:1
が出力されます。練習問題をいくつも作るのに便利です。ランダムに並び替えるところは極めて原始的な方法を用いました。もっとスマートにならないかな・・・。
# 2AE.awk	AutoExam 整形用
BEGIN	{
	FS="\t"
	split(ARGV[1], f, ".")
	outfile = f[1]".ae"
	ln = 0
	srand()
}
	{ 
	ln++;
	print "Q"ln":"$1 > outfile
#
	x=int( 120*rand() ) + 1
	s=select5(x)
	split(s, ss, ",")
	printf("S%d:", ln) > outfile
#
	tt = ss[1] + 1
	printf("%s,", $tt) > outfile
	tt = ss[2] + 1
	printf("%s,", $tt) > outfile
	tt = ss[3] + 1
	printf("%s,", $tt) > outfile
	tt = ss[4] + 1
	printf("%s,", $tt) > outfile
	tt = ss[5] + 1
	printf("%s", $tt) > outfile
	print "" > outfile
#
	for(i=1; i<=5; i++) {
		if(ss[i] == 1) { ans = i; break }
	}
	print "A"ln":"ans > outfile
	print "M"ln":1\n" > outfile	# 便宜上,配点はすべて1点とする.

	printf("%d\r", NR)
}
END	{ print "" }
function select5(x,  t) {
	t[1]="1,2,3,4,5"
	t[2]="1,2,3,5,4"
	t[3]="1,2,4,3,5"
	t[4]="1,2,4,5,3"
	t[5]="1,2,5,3,4"
	t[6]="1,2,5,4,3"
	t[7]="1,3,2,4,5"
	t[8]="1,3,2,5,4"
	t[9]="1,3,4,2,5"
	t[10]="1,3,4,5,2"
	t[11]="1,3,5,2,4"
	t[12]="1,3,5,4,2"
	t[13]="1,4,2,3,5"
	t[14]="1,4,2,5,3"
	t[15]="1,4,3,2,5"
	t[16]="1,4,3,5,2"
	t[17]="1,4,5,2,3"
	t[18]="1,4,5,3,2"
	t[19]="1,5,2,3,4"
	t[20]="1,5,2,4,3"
	t[21]="1,5,3,2,4"
	t[22]="1,5,3,4,2"
	t[23]="1,5,4,2,3"
	t[24]="1,5,4,3,2"
	t[25]="2,1,3,4,5"
	t[26]="2,1,3,5,4"
	t[27]="2,1,4,3,5"
	t[28]="2,1,4,5,3"
	t[29]="2,1,5,3,4"
	t[30]="2,1,5,4,3"
	t[31]="2,3,1,4,5"
	t[32]="2,3,1,5,4"
	t[33]="2,3,4,1,5"
	t[34]="2,3,4,5,1"
	t[35]="2,3,5,1,4"
	t[36]="2,3,5,4,1"
	t[37]="2,4,1,3,5"
	t[38]="2,4,1,5,3"
	t[39]="2,4,3,1,5"
	t[40]="2,4,3,5,1"
	t[41]="2,4,5,1,3"
	t[42]="2,4,5,3,1"
	t[43]="2,5,1,3,4"
	t[44]="2,5,1,4,3"
	t[45]="2,5,3,1,4"
	t[46]="2,5,3,4,1"
	t[47]="2,5,4,1,3"
	t[48]="2,5,4,3,1"
	t[49]="3,1,2,4,5"
	t[50]="3,1,2,5,4"
	t[51]="3,1,4,2,5"
	t[52]="3,1,4,5,2"
	t[53]="3,1,5,2,4"
	t[54]="3,1,5,4,2"
	t[55]="3,2,1,4,5"
	t[56]="3,2,1,5,4"
	t[57]="3,2,4,1,5"
	t[58]="3,2,4,5,1"
	t[59]="3,2,5,1,4"
	t[60]="3,2,5,4,1"
	t[61]="3,4,1,2,5"
	t[62]="3,4,1,5,2"
	t[63]="3,4,2,1,5"
	t[64]="3,4,2,5,1"
	t[65]="3,4,5,1,2"
	t[66]="3,4,5,2,1"
	t[67]="3,5,1,2,4"
	t[68]="3,5,1,4,2"
	t[69]="3,5,2,1,4"
	t[70]="3,5,2,4,1"
	t[71]="3,5,4,1,2"
	t[72]="3,5,4,2,1"
	t[73]="4,1,2,3,5"
	t[74]="4,1,2,5,3"
	t[75]="4,1,3,2,5"
	t[76]="4,1,3,5,2"
	t[77]="4,1,5,2,3"
	t[78]="4,1,5,3,2"
	t[79]="4,2,1,3,5"
	t[80]="4,2,1,5,3"
	t[81]="4,2,3,1,5"
	t[82]="4,2,3,5,1"
	t[83]="4,2,5,1,3"
	t[84]="4,2,5,3,1"
	t[85]="4,3,1,2,5"
	t[86]="4,3,1,5,2"
	t[87]="4,3,2,1,5"
	t[88]="4,3,2,5,1"
	t[89]="4,3,5,1,2"
	t[90]="4,3,5,2,1"
	t[91]="4,5,1,2,3"
	t[92]="4,5,1,3,2"
	t[93]="4,5,2,1,3"
	t[94]="4,5,2,3,1"
	t[95]="4,5,3,1,2"
	t[96]="4,5,3,2,1"
	t[97]="5,1,2,3,4"
	t[98]="5,1,2,4,3"
	t[99]="5,1,3,2,4"
	t[100]="5,1,3,4,2"
	t[101]="5,1,4,2,3"
	t[102]="5,1,4,3,2"
	t[103]="5,2,1,3,4"
	t[104]="5,2,1,4,3"
	t[105]="5,2,3,1,4"
	t[106]="5,2,3,4,1"
	t[107]="5,2,4,1,3"
	t[108]="5,2,4,3,1"
	t[109]="5,3,1,2,4"
	t[110]="5,3,1,4,2"
	t[111]="5,3,2,1,4"
	t[112]="5,3,2,4,1"
	t[113]="5,3,4,1,2"
	t[114]="5,3,4,2,1"
	t[115]="5,4,1,2,3"
	t[116]="5,4,1,3,2"
	t[117]="5,4,2,1,3"
	t[118]="5,4,2,3,1"
	t[119]="5,4,3,1,2"
	t[120]="5,4,3,2,1"
#
	return t[x]
}

GAWKホームページに戻る