{ Petr Hruska }
{$R+}
Const SOUBOR_MRIZKY = 'mrizka.txt';
MaxN = 16;
Type TMrizka = Array [1 .. MaxN, 1 .. MaxN] Of Boolean;
TMrizky = Array [1 .. 4] Of TMrizka;
TBlok = Array [1 .. MaxN] Of String[MaxN];
TVelikost = 1 .. MaxN;
Var M : TMrizka;
M4 : TMrizky; { pole s pootocenymi mrizkami }
I : Integer;
B : TBlok;
N : TVelikost; { velikost mrizky }
Vstup, Vystup : Text;
{ nacte mrizku ze souboru }
Procedure NactiMrizku(Var N : TVelikost; Var M : TMrizka);
Var I, J, B : Integer;
F : Text;
Begin
{ otevreni souboru pro cteni }
Assign(F, SOUBOR_MRIZKY);
Reset(F);
{ nacteni dat }
Readln(F, N);
For J := 1 To N Do
Begin
For I := 1 To N Do
Begin
Read(F, B);
M[I, J] := B > 0;
End;
end;
{ uzavreni souboru }
Close(F);
End;
Procedure Rotace(N : Integer; Var M : TMrizka);
Var P : TMrizka; { pomocna mrizka }
I, J : Integer;
Begin
For J := 1 To N Do
For I := 1 To N Do
P[N+1-J, I] := M[I, J];
For J := 1 To N Do
For I := 1 To N Do
M[I, J] := P[I, J];
End;
Procedure TiskniMrizku(N : TVelikost; Var M : TMrizka);
Var I, J : Integer;
Begin
Writeln(N);
For J := 1 To N Do
Begin
For I := 1 To N Do Write(Ord(M[I, J]), ' ');
Writeln;
End;
End;
Procedure OtevriSoubory(Var Vstup, Vystup : Text);
Begin
Assign(Vstup, 'vstup.txt');
Reset(Vstup);
Assign(Vystup, 'vystup.txt');
Rewrite(Vystup);
End;
Procedure NactiBlok(N : TVelikost; Var B : TBlok; Var Vstup : Text);
Var I : Integer;
Begin
For I := 1 To N Do Readln(Vstup, B[I]);
{ For I := 1 To N Do Writeln(B[I]);}
End;
Procedure ZavriSoubory(Var Vstup, Vystup : Text);
Begin
Close(Vstup);
Close(Vystup);
End;
Procedure Prilozeni(N : TVelikost; Var M : TMrizka; Var B : TBlok; Var Vystup : Text);
Var I, J : Integer;
S : String;
Begin
S := '';
For J := 1 To N Do
For I := 1 To N Do
If M[I, J] Then S := S + B[J][I];
Writeln(Vystup, S);
End;
{ Desifruje a zapise do souboru desifrovany text }
Procedure DesifrujBlok(N : TVelikost; Var M4 : TMrizky; Var B : TBlok; Var Vystup : Text);
Var I : Integer;
Begin
For I := 1 To 4 Do Prilozeni(N, M4[I], B, Vystup);
End;
Begin
NactiMrizku(N, M);
For I := 1 To 4 Do
Begin
M4[I] := M;
Rotace(N, M);
End;
OtevriSoubory(Vstup, Vystup);
While Not Eof(Vstup) Do
Begin
NactiBlok(N, B, Vstup);
DesifrujBlok(N, M4, B, Vystup);
End;
ZavriSoubory(Vstup, Vystup);
End.