InfoMC 7. labor

Feladat

Készítsünk olyan ábrát, ahol a (0,0), (2,0), (1,2) háromszöget ábrázoljuk. Tegyük egy Manipulate-be, aminek egy jelölőnégyzete (checkbox) van (igaz vagy hamis) és az egyik értékre az előbbi háromszög beírható, a másikra a köré írható háromszöget rajzolja.

A beírható kör sugara tan(((arctan(2))/2)), a köré írhatóé (5/4).

Manipulate[
Graphics[{
{White,EdgeForm[Black],Triangle[{{0,0},{2,0},{1,2}}]},
If[t, Circle[{1,Tan[((ArcTan[2])/2)]},Tan[((ArcTan[2])/2)]], Circle[{1,2-(5/4)},(5/4)]]
}, PlotRange->{{-1,3},{-1,3}}]
,{t,{True, False}}]

Feladat

Rajzoljuk le az alábbi "házikót" egy törtvonallal. Tegyük Manipuate-be ahol lépésenként jelenik meg (8 vonal kell hozzá).

Graphics[{EdgeForm[Black],Opacity[0],Rectangle[{0,0},{1,1}],Triangle[{{0,1},{1,1},{0.5,2}}] ,Opacity[1],Line[{{0,0},{1,1}}],Line[{{0,1},{1,0}}] }]

L={{0,0},{0,1},{1,0},{1,1}, {0,1},{0.5,2},{1,1}, {0,0},{1,0}};
Manipulate[
Graphics[{
Line[L[[;;n]]]
}, PlotRange->{{-1,3},{-1,3}}]
,{n,2,Length[L],1}]

Feladat

Sudoku

a)

Készítsünk sudoku táblázatot rajzoló függvényt.

Ez 81 darab kis négyzetből áll és 9 darab vastagabb, nagyobb négyzetből.

A négyzeteket állítsuk elő a Table paranccsal.

Graphics[{
{
EdgeForm[Black],Opacity[0],
Table[Table[Rectangle[{i,j},{i+1,j+1}],{j,1,9,1}],{i,1,9,1}]
}, {
EdgeForm[Directive[Thick, Black]],Opacity[0],
Table[Table[Rectangle[{i,j},{i+3,j+3}],{j,1,9,3}],{i,1,9,3}]
}
}]

b)

Írjunk olyan függvényt, aminek egy változója van, egy 9×9-es táblázat, benne 0-9-ig számok (0 ha nincs kitöltve) és kirajzolja azt a sudoku állást.

A mezőkbe írjunk a Text paranccsal.

Sudoku[S_]:=Graphics[{
{
EdgeForm[Black],Opacity[0],
Table[Table[Rectangle[{j,i},{j+1,i+1}],{j,1,9,1}],{i,1,9,1}]
}, {
EdgeForm[Directive[Thick, Black]],Opacity[0],
Table[Table[Rectangle[{j,i},{j+3,i+3}],{j,1,9,3}],{i,1,9,3}]
},
Table[Table[If[S[[i,j]]==0,Text["", {j+0.5,10-i+0.5}],Text[S[[i,j]],{j+0.5,10-i+0.5} ] ],{j,1,9,1}],{i,1,9,1}]
}]

A=ConstantArray[0,{9,9}];
A[[1,1]]=1;
A[[1,3]]=3;

Sudoku[A]

c)

Készítsünk olyan függvényt, ami egy sudoku állásról leellenőrzi, hogy helyes-e. Legyen a bemenete egy 9×9-es táblázat, aminek minden eleme 0-9-ig egy egész szám (0 ha nincs kitöltve). A függvény adjon True-t, ha nincs ellentmondás, False-t ha van.

Tegyük fel, hogy rossz bemenetet nem kapunk, azaz csak 0-9-ig számok szerepelnek a táblázatban.

Egy sorra úgy ellenőrizzük le, hogy kiszedjük a nem nullákat. És ha azok között van ismétlődés, akkor rossz.
Egy listában akkor van ismétlődés, ha a benne lévő számok uniója rövidebb, mint az eredeti lista.

Union[{1,2,3}]
Union[{1,2,3,2}]

JoE[sor_]:=Length[Union[Select[sor, Positive]]] == Length[Select[sor, Positive]]
RosszE[sor_]:=Length[Union[Select[sor, Positive]]] != Length[Select[sor, Positive]]

JoE[{1,2,3,0, 0,9}]

Sor[S_, i_]:=S[[i]]
Oszlop[S_, i_]:=S[[;;,i]]
Negyzet[S_, i_, j_]:=S[[(i-1)*3+1;;(i-1)*3+3, (j-1)*3+1;;(j-1)*3+3]]

Negyzet[A, 1,1]

SudokuCheck[S_]:={
Select[Table[Sor[S, i], {i,1,9,1}], RosszE],
Select[Table[Oszlop[S, i], {i,1,9,1}], RosszE],
Select[Table[Join@@Negyzet[S, i,j], {i,1,3,1},{j,1,3,1}], RosszE]
}=={{},{},{}}

SudokuCheck2[B]

B=ConstantArray[1,{9,9}];
Sudoku[B]
SudokuCheck[B]

B=ConstantArray[0,{9,9}];
B[[1,2]]=9; B[[1,7]]=5; B[[1,9]]=4;
B[[2,1]]=4; B[[2,3]]=6; B[[2,7]]=3;B[[2,8]]=1; B[[2,9]]=8;
B[[3,2]]=7; B[[3,3]]=5; B[[3,5]]=8;B[[3,6]]=3; B[[3,9]]=9;
B[[4,2]]=6;B[[4,5]]=4;B[[4,6]]=2;
B[[5,1]]=9;B[[5,2]]=4;B[[5,8]]=6;B[[5,9]]=1;
B[[6,4]]=9;B[[6,5]]=6;B[[6,8]]=4;
B[[7,1]]=3;B[[7,4]]=2;B[[7,5]]=5;B[[7,7]]=7;B[[7,8]]=9;
B[[8,1]]=7;B[[8,2]]=8;B[[8,3]]=9;B[[8,7]]=4;B[[8,9]]=2;
B[[9,1]]=6;B[[9,3]]=2;B[[9,8]]=8; 
Sudoku[B]
SudokuCheck[B]

B[[5,5]]=1;
Sudoku[B]
SudokuCheck[B]

d)

A függvény adja vissza azt is, hogy hol van a hiba; üres listát, ha nincsen, egyébként párok listáját, hogy sor, oszlop vagy négyzet és azon belül melyik.
Például:
{{“sor”, 1}, {“oszlop”, 2}}

NemNulla[x_]:=If[IntegerQ[x], x!=0,True]

SudokuCheck2[S_]:=Join@@{
Select[Table[If[RosszE[Sor[S, i]],{"sor", i},0], {i,1,9,1}],NemNulla],
Select[Table[If[RosszE[Oszlop[S, i]],{"oszlop", i},0], {i,1,9,1}],NemNulla],
Select[Join@@Table[If[RosszE[Join@@Negyzet[S, i,j]],{"negyzet", {i,j}},0], {i,1,3,1},{j,1,3,1}],NemNulla]
}

SudokuCheck2[B]

B[[9,4]]=2;
Sudoku[B]
SudokuCheck2[B]

e)

Készítsünk egy másik függvényt, ami ábrázolja az előző eredményét, rendezze táblázatba a számokat és pirossal jelölje a hibát.

SudokuCheck3[S_]:=Show[Sudoku[S],
Graphics[{Red,Opacity[0.5],
Table[
If[
error[[1]]=="sor",
Rectangle[{1,10-error[[2]]},{10,11-error[[2]]}],
If[error[[1]]=="oszlop", 
Rectangle[{error[[2]],1},{error[[2]]+1,10}],
Rectangle[{3*error[[2,2]]-2,13-3*error[[2,1]]},{3*error[[2,2]]+1,10-3*error[[2,1]]}]
]
]
,{error, SudokuCheck2[S]}]
}]
]

SudokuCheck3[B]