(* 15_04 *)

(* Require XMLgen_MC.nb ver >=0.08 *)
SetDirectory[NotebookDirectory[]];
<<XMLgenMC.mx;
Category="LA/15_04.";
Title="一部の列ベクトルが指定された行列による像";
SELNUM=6;
Single="true";
NUM=300;

TTS[mt_]:=ToString[TeXForm[StandardForm[mt]]];
TOT[mt_]:=ToString[OneLineTeXForm[mt]];
TOTT[mt_]:=ToString[OneLineTeXForm[Transpose[mt]]];
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]]}];
Col[A_,n_]:=Transpose[{A[[Range[Length[A]],n]]}];
ColCat[CL_]:=Join@@@(Transpose@CL);
RowCat[CL_]:=Join@@(CL);
PtString[M_]:=StringReplace[ToString[M],{"{"->"(","}"->")"}];
ei2tex[s_]:=StringReplace[TTS[s],Table["\\text{e"<>TOT[i]<>"}"->"{\\mathbf e}_"<>TOT[i],{i,1,8}]];
vi2tex[s_]:=StringReplace[TOT[s],Table["\\text{v"<>TOT[i]<>"}"->"{\\mathbf v}_"<>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]]];

(* select pairs of matrices *)
QtList={}; For[ct=1,ct≤300,ct++,
Cn=RandomChoice[{0,0,0,1,1,1,1,1,1,1}];
row=RandomChoice[{3,3,3,4,4}];
col=RandomChoice[{2,2,2,3,3}];
Cs=Sort[RandomSample[Range[8],col]];
Vs=Table[Table[Rnz[3],col],row];
While[MatrixRank[Vs]<col,Vs=Table[Table[Rnz[3],col],row]];
LCs=RandomSample[{-4,-3,-2,-1,1,2,3,4,5},col];
QtList=Append[QtList,{Cn,{Vs,Cs,LCs}}]];
(* QtList=DeleteDuplicates[QtList]; *)
QtList=RandomSample[QtList,NUM];Length[QtList]

? Apply

ToExpression[StringJoin["e",ToString[#]] &/@ Range[3]]

Clear[e1,e2,e3,e4,e5,e6,e7,e8];

Clear[QtextF];QtextF[mm_]:=Module[{Cn,Vs,Cs,LCs,ct,Ai="",Sv},
{Cn,{Vs,Cs,LCs}}=QtList[[mm]];
Sv=ToExpression[StringJoin["e",ToString[#]] &/@ Cs].LCs;
(* Which[col==2,Sv=RandomSample[{x,y},2],col==3,Sv={x,y,z},col==4,Sv={w,x,y,z}]; *)
For[ct=1,ct≤Length[Cs],ct++,
Ai=Ai<>"\\({\\mathbf a}_"<>TOT[Cs[[ct]]]<>"="<>TOT[Col[Vs,ct]]<>"\\)"
<>If[ct<Length[Cs],",",""]<>"\n"];
Return["ある行列\\(A\\)の第\\(j\\)列ベクトル\\({\\mathbf a}_j\\)について,\n"<>Ai<>"がわかっている."
<>"\\(A\\)によって定まる線形写像\\(f\\)について\n"
<>"\\(f\\left("<>ei2tex[Sv]<>"\\right)\\)を求めよ. 以下から選択せよ."]];

CListF[mm_]:=Module[{Cn,Vs,Cs,LCs,Ans,fs,ret={}},
{Cn,{Vs,Cs,LCs}}=QtList[[mm]];fs="正解です.";
Ans=Vs.LCs;
If[Cn==0,ret=Append[ret,{"この中に他に正解はない",fs<>"正解は"<>TOTT[{Ans}]<>"です."}],
ret=Append[ret,{"\\("<>TOTT[{Ans}]<>"\\)",fs}]];
Return[RandomSample[ret,1]]];

Permutations[Range[3]] /. {1,2,3}->Nothing

ICListF[mm_]:=Module[{Cn,Vs,Cs,LCs,LCs1,Ans,Ans1,fs,ct,col,Pm,pm,ret={}},
{Cn,{Vs,Cs,LCs}}=QtList[[mm]];col=Length[LCs];
Ans=Vs.LCs;
fs="係数の符号を間違えていませんか.";
For[ct=0,ct≤2^col-2,ct++,
LCs1=LCs*Table[2*BitGet[ct,i-1]-1,{i,1,Length[LCs]}];
Ans1=Vs.LCs1;If[Ans==Ans1,Print["Error,LCs="<>TOT[LCs1]]];
ret=Append[ret,{"\\("<>TOTT[{Ans1}]<>"\\)",fs}]];
fs="係数とベクトルの順序を間違えていませんか.";
Pm=Permutations[Range[col]] /. {{1,2,3}->Nothing,{1,2}->Nothing};
For[ct=1,ct≤Length[Pm],ct++,pm=Pm[[ct]];
LCs1=Table[LCs[[pm[[i]]]],{i,1,col}];Ans1=Vs.LCs1;
ret=Append[ret,{"\\("<>TOTT[{Ans1}]<>"\\)",fs}]];
fs="何らかの計算ミスかも.";
For[ct=1,ct≤4,ct++,Ans1=Vs.LCs1+Table[Rnz[1],Length[Col[Vs,1]]];
ret=Append[ret,{"\\("<>TOTT[{Ans1}]<>"\\)",fs}]];
ret=DeleteDuplicates[ret];
If[Cn==1,ret=Append[ret,{"この中に他に正解はない.","正解はあります."}]];
Return[RandomSample[ret,SELNUM-1]]];

QtList[[3]]

CListF[11]

ICListF[11]

Sort@Permutations[Range[3],{2}]

For[ct=1,ct≤NUM,ct++,QtextF[ct];CListF[ct];ICListF[ct]] (* Error check *)

GenerateMCxml[DFname[],Category<>Title<>"(MC1)",Title,NUM,Single,QtextF,CListF,ICListF]

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