(* Require XMLgen_MC.nb ver >=0.24 *)
SetDirectory[NotebookDirectory[]];
<<XMLgenMC.mx;
DebugMode=False;
ThisNo=StringReplace[StringSplit[ NotebookFileName[],"/"][[-1]],{"LA_"->"",".nb"->"","_"->"-"}];
Category="LA/"<>ThisNo<>".";

TOT[mt_]:=ToString[OneLineTeXForm[mt]];
TOTT[mt_]:=ToString[OneLineTeXForm[Transpose[mt]]];
TTSt[eq_]:=ToString[TeXForm[StandardForm[eq]]];
TOC[mt_,c_]:=TOTT[{Transpose[mt][[c]]}];
TTD[r_]:=StringReplace[TT[r],"\\frac"->"\\dfrac"];
Rnz[m_]:=(RandomInteger[m]+1)*(2*RandomInteger[1]-1); (* \\pm 1,\pm2,...,\pm(m+1) *)
Rpos[m_]:=RandomInteger[m]+1; (* 1,2,...,m+1 *)
Rbtw[m_]:=RandomInteger[2m]-m;
TTC[A_,n_]:=TOTT[{(Transpose[A])[[n]]}];
PtString[M_]:=StringReplace[ToString[M],{"{"->"(","}"->")"}];
ai2tex[s_]:=StringReplace[TOT[s],Table["\\text{a"<>TOT[i]<>"}"->"{\\mathbf a}_"<>TOT[i],{i,1,5}]];
ci2tex[c_,s_]:=StringReplace[s,Table["\\text{"<>c<>TOT[i]<>"}"->"{\\mathbf "<>c<>"}_"<>TOT[i],{i,1,5}]];
TOTci2tex[c_,s_]:=StringReplace[TOT[s],Table["\\text{"<>c<>TOT[i]<>"}"->"{\\mathbf "<>c<>"}_"<>TOT[i],{i,1,5}]];
TpStr[L_]:="\\("<>TOT[L[[1]]]<>"\\times"<>TOT[L[[2]]]<>"\\)";
TpTpse[L_]:=If[L=={},{},{L[[2]],L[[1]]}];
PType[A_,B_]:=If[A=={}||B=={},Return[{}],
If[A[[2]]===B[[1]],Return[{A[[1]],B[[2]]}],Return[{}]]];
PTypeL[L_]:=Module[{ct,len,tmp},len=Length[L];
Which[len==0,Return[{}],len==1,Return[L[[1]]],
len==2,Return[PType[L[[1]],L[[2]]]],
True,tmp=L[[1]];For[ct=2,ct≤len,ct++,tmp=PType[tmp,L[[ct]]]];Return[tmp]]];
MF[m_]:=MatrixForm[m];MFT[m_]:=MatrixForm[Transpose[m]];

(* Global Options *)
Numbering="abc";Title="連立1次方程式の解法(v3r2-3)";
(* Numbers of select options and questions *)
Shuffle="false";Single="true";SELNUM=8;NUM=300;
GeneralFeedback="";

Clear[p,q,r,s,t,u,v,x,y,z]

RElist={-3,-2,-1,0,1,2,3,4,5};
(* select pairs of matrices *)
QtList={}; For[ct=1,ct≤300,ct++,
Cn=RandomChoice[{0,1,1,1,1,1}]; (* -1 means eq has no sol *)
tp=RandomChoice[{0,1,2,2,2,2}]; (* 0:不能,1:一意解,2:不定(rk=2) *)
row=3;col=4;
While[Abs[Det[GM=Table[Table[Rnz[3],row],row]]]≠1];
{a1,a2,b1,b2,b3}=RandomSample[RElist,5];
MA=GM.{{1,0,a1},{0,1,a2},{0,0,0}};
Which[tp==0,Mb=Col[GM,3],
tp==1,MA=GM;Mb=GM.{{b1},{b2},{b3}},
tp==2,Mb=GM.{{b1},{b2},{0}}];
QtList=Append[QtList,{Cn,tp,MA,Mb,{a1,a2,b1,b2,b3}}]];
(* QtList=DeleteDuplicates[QtList]; *)
QtList=RandomSample[QtList,NUM];Length[QtList]

Clear[QtextF];QtextF[mm_]:=Module[{Cn,tp,MA,Mb,abL,Wx,ret},
{Cn,tp,MA,Mb,abL}=QtList[[mm]];Wx="{\\mathbf x}";
ret=IfDeb[{MF[MA],MF[Mb]},
"以下の係数行列\\(A\\)とベクトル\\({\\mathbf b}\\)に対し,"
<>"方程式\\(A{\\mathbf x}={\\mathbf b}\\)の解について"
<>"正しいものを<u>1つ</u>選べ.<br/>\n"
<>"\\(A="<>TOT[MA]<>",{\\mathbf b}="<>TOT[Mb]<>"\\)"];
Return[ret]];

AListF[mm_]:=Module[{Cn,tp,MA,Mb,a1,a2,b1,b2,b3,Wx,Vc,Vc1,VcL,Vu,Vu1,VuL,fsL={},aret,ct,sL={},ret={}},
{Cn,tp,MA,Mb,{a1,a2,b1,b2,b3}}=QtList[[mm]];fsL=Append[fsL,"正解です."]; (*1*)
fsL=Append[fsL,"正解です. この方程式は解を持ちません."]; (*2*)
fsL=Append[fsL,"正解です. 上の選択肢に正しい解はありません."]; (*3*)
fsL=Append[fsL,"残念. そのパラメータ表示は正しくありません.検算してみよう."];(*4*)
fsL=Append[fsL,"残念. この方程式は解を持ちます."];(*5*)
fsL=Append[fsL,"残念. 違います."];(*6*)
fsL=Append[fsL,"残念. 選択肢に正解があります."];(*7*)
Vc=If[tp==1,Transpose[{{b1,b2,b3}}],Transpose[{{b1,b2,0}}]];
Vu=Transpose[{{-a1,-a2,1}}];Vu1=Transpose[{{a1,a2,1}}];
If[Vu==Vu1,Print["Vu1:Error"]];
Wx="\\begin{pmatrix}x\\\\y\\\\z\\end{pmatrix}=";
sL=Append[sL,IfDeb["NG","不能(解なし)"]];(*1*)
sL=Append[sL,IfDeb[MF[Vc],"\\("<>Wx<>TOT[Vc]<>"\\)"]];(*2*)
sL=Append[sL,IfDeb[{MF[Vc],MF[Vu]},"\\("<>Wx<>TOT[Vc]<>"+t"<>TOT[Vu]<>",t\\in{\\mathbb R}\\)"]];(*3*)
sL=Append[sL,IfDeb[{MF[Vu],MF[Vc]},"\\("<>Wx<>TOT[Vu]<>"+t"<>TOT[Vc]<>",t\\in{\\mathbb R}\\)"]]; (*4*)
sL=Append[sL,IfDeb[{MF[Vc],MF[Vu1]},"\\("<>Wx<>TOT[Vc]<>"+t"<>TOT[Vu1]<>",t\\in{\\mathbb R}\\)"]]; (*5*)
sL=Append[sL,IfDeb["No option.","上の選択肢に正解はない."]];(*6*)
(* noises 7-10 *)
VcL={};VuL={};
While[Length[VcL]<4,While[MA.(Vc1=Transpose[{Table[Rnz[2],3]}])==Transpose[{Mb}]];
VcL=DeleteDuplicates[Append[VcL,Vc1]]];
While[Length[VuL]<4,While[MA.(Vu1=Transpose[{Table[Rnz[2],3]}])==Transpose[{{0,0,0}}]];VuL=DeleteDuplicates[Append[VuL,Vu1]]];
sL=Append[sL,IfDeb[{MF[Vc],MF[VuL[[1]]]},"\\("<>Wx<>TOT[Vc]<>"+t"<>TOT[VuL[[1]]]<>",t\\in{\\mathbb R}\\)"]];
sL=Append[sL,IfDeb[{MF[VcL[[1]]],MF[Vu]},"\\("<>Wx<>TOT[VcL[[1]]]<>"+t"<>TOT[Vu]<>",t\\in{\\mathbb R}\\)"]];
sL=Append[sL,IfDeb[{MF[VcL[[2]]],MF[VuL[[2]]]},"\\("<>Wx<>TOT[VcL[[2]]]<>"+t"<>TOT[VuL[[2]]]<>",t\\in{\\mathbb R}\\)"]];sL=Append[sL,IfDeb[{MF[VcL[[3]]],MF[VuL[[3]]]},"\\("<>Wx<>TOT[VcL[[3]]]<>"+t"<>TOT[VuL[[3]]]<>",t\\in{\\mathbb R}\\)"]];
aret[ic_,s_,n_]:=Module[{},ret=DeleteDuplicates[Append[ret,{ic,sL[[s]],fsL[[n]]}]]];
Which[tp==0,aret["I",2,6];aret["I",3,6];aret["I",4,6];aret["I",5,6],
tp==1,aret["I",1,5];aret["I",3,6];aret["I",4,6];aret["I",5,6],
tp==2,aret["I",1,5];aret["I",2,6];aret["I",4,4];aret["I",5,4]];
For[ct=7,ct≤10,ct++,aret["I",ct,6]];
If[Cn==1,ret=RandomSample[ret,SELNUM-2];Which[tp==0,aret["C",1, 2],tp==1,aret["C",2,1],tp==2,aret["C",3,1]],
ret=RandomSample[ret,SELNUM-1]];
ret=RandomSample[ret];If[Length[ret]≠SELNUM-1,Print["Length:ERROR"]];
If[Cn==0,aret["C",6,3],aret["I",6,7]];
Return[Join[{{1,SELNUM-1}},ret]]];

DebOn[];AListF[7]

For[Ct=1,Ct≤NUM,Ct++,QtextF[Ct];AListF[Ct]]; (* Error Check *)

DebOff[];GenMCxmlV2[DFname[1],Category<>Title<>"(MC2)",Title,NUM,Single,QtextF,AListF]

QtextF[40]

#->Nothing &/@ Permutations[{1,2,3},{2}]

RandomEchelonRank[3,4,0,{-1,1}]