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

(* Global Options *)
Shuffle="true";Numbering="abc";
(* Numbers of select options and questions *)
SELNUM=5;Single="false";NUM=300;Title="平面を直線に写す行列";

TTS[mt_]:=ToString[TeXForm[StandardForm[mt]]];
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,8}]];
ci2tex[c_,s_]:=StringReplace[s,Table["\\text{"<>c<>TOT[i]<>"}"->"{\\mathbf "<>c<>"}_"<>TOT[i],{i,1,5}]];
ci2tex[c_,s_,tx_]:=StringReplace[s,Table["\\text{"<>c<>TOT[i]<>"}"->"{"<>tx<>c<>"}_"<>TOT[i],{i,1,8}]];
TOTci2tex[c_,s_]:=StringReplace[TOT[s],Table["\\text{"<>c<>TOT[i]<>"}"->"{\\mathbf "<>c<>"}_"<>TOT[i],{i,1,8}]];
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]]];
GCDL[L_]:=Module[{ct,ret=0,tmp},tmp=Flatten[L];
For[ct=1,ct≤Length[tmp],ct++,ret=GCD[ret,tmp[[ct]]]];Return[ret]];
MFT[m_]:=MatrixForm[Transpose[m]];
MF[m_]:=MatrixForm[m];

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

(* select pairs of matrices *)
MAlist=Range[-6,6];
QtList={}; For[ct=1,ct≤NUM*1.05,ct++,
Cn=RandomChoice[{0,1,1,1,2,2}];
While[(Peq=Table[RandomInteger[6]-3,3])=={0,0,0}];
g=GCDL[Peq];Peq=Peq/g;
NB=NullSpace[{Peq}];
ML={};While[Length[ML]<Cn,
NB1={{Rnz[2],Rnz[2]}}.NB;
While[MatrixRank[GM=Table[Table[Rnz[1],2],3]]<2];
ML=Append[ML,GM.NullSpace[NB1]];
ML=DeleteDuplicates[ML]];
QtList=Append[QtList,{Cn,Peq,NB,ML}]];
(* QtList=DeleteDuplicates[QtList]; *)
QtList=RandomSample[QtList,NUM];Length[QtList]

Clear[QtextF];QtextF[mm_]:=Module[{Cn,Peq,NB,Eqxyz,ML,eqS,ret},
{Cn,Peq,NB,ML}=QtList[[mm]];
Eqxyz={x,y,z}.Peq;
ret=IfDeb[TOT[Eqxyz]<>"="<>TOT[Rnz[3]],StringJoin[{
"3次正方行列\\(A\\)によって定まる空間(\\({\\mathbb R}^3\\))の",
"1次変換によって平面\\(\\pi:"<>TOT[Eqxyz]<>"="<>TOT[Rnz[3]]<>"\\)",
"全体はある直線全体に写されるという. このような性質を持つ \\(A\\)を次の中からすべて選べ."}]];
Return[ret]];

DebOff[];QtextF[3]

AListF[mm_]:=Module[{Cn,In,CIn,IC,Peq,NB,ML,g,M1,M2,fsL={},fsN,tmp,retC={},retI={}},
{Cn,Peq,NB,ML}=QtList[[mm]];
If[Cn==0,CIn={1,SELNUM-1},CIn={Cn,SELNUM-Cn}];
fsL=Append[fsL,"正解です. 他の行列ではすべて平面または1点に写ってしまいます."];
If[Cn>0,M1=ML[[1]];tmp=Col[M1.Transpose[NB],1];
If[tmp=={{0},{0},{0}},tmp=Col[M1.Transpose[NB],2]];
g=GCDL[Transpose[tmp]];tmp=tmp/g;
fsL=Append[fsL,"正解です. "<>TOT[tmp]<>"に平行な直線に移りますね."]];
If[Cn>1,M2=ML[[2]];tmp=Col[M2.Transpose[NB],1];
If[tmp=={{0},{0},{0}},tmp=Col[M2.Transpose[NB],2]];
fsL=Append[fsL,"正解です. "<>TOT[tmp]<>"に平行な直線に移りますね."]];
fsL=Append[fsL,"いえ,条件を満たす行列が他の選択肢にあります."];
fsL=Append[fsL,"平面に平行なベクトルが何に写るかもう一度確認しよう."];
(* Correct case *)
If[Cn==0,retC=Append[retC,{"C","他の選択肢に正解はない.",fsL[[1]]}],
retC=Append[retC,{"C",IfDeb[{MF[M1],MF[M1.Transpose[NB]]},"\\("<>TOT[M1]<>"\\)"],fsL[[2]]}];
If[Cn==2,retC=Append[retC,{"C",IfDeb[{MF[M2],MF[M2.Transpose[NB]]},"\\("<>TOT[M2]<>"\\)"],fsL[[3]]}]]];
(* Incorrect case *)
If[Cn>0,retI=Append[retI,{"I","他の選択肢に正解はない.",fsL[[Cn+2]]}]];While[Length[retI]<CIn[[2]],
While[MatrixRank[tmp=Table[Table[Rnz[2],3],3]]<3];
retI=Append[retI,{"I",IfDeb[{MF[tmp],MF[tmp.Transpose[NB]]},"\\("<>TOT[tmp]<>"\\)"],fsL[[Cn+3]]}];
tmp=Transpose[{Table[RandomInteger[4]-2,3]}].{Peq};
retI=Append[retI,{"I",IfDeb[{MF[tmp],MF[tmp.Transpose[NB]]},"\\("<>TOT[tmp]<>"\\)"],fsL[[Cn+3]]}]];
retI=RandomSample[retI,CIn[[2]]];
Return[Join[{CIn},retC,retI]]];

Plus@@{2,3,4}

QtList[[Range[50],1]]

AListF[13]

QtextF[39]

DebOn[];AListF[39]

DebOn[];AListF[3]

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

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

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

col=5

{x,y,z}.{1,2,3}