Taigi kokia galimybė yra atspėti tokį slaptažodį? Pati logiškiausia mintis yra sugalvoti matematinį metodą apskaičiuojant derinius.
Tai yra, reikia nustatyti pradines sąlygas:
- Kryptis turi vertę;
- Kiekvieną tašką galima pereiti tik kartą;
- Kad sujungtume du taškus, jie turi būti vienas prie kito. Tai yra pirmas taškas gali būti sujungtas tik su antru, o ne su trečiu;
- Viso taškų: nuo 5 iki 9.
1 sujungimas = 56 variantai;
2 sujungimai = 320 variantų;
3 sujungimai = 1624 variantai;
4 sujungimai = 7152 variantai;
5 sujungimai = rezultatas neaiškus.
Penkiems sujungimams žmogaus protui jau per sudėtinga. Taigi tam galima pasiremti programavimu. Paskalio programavimo kalboje galima pasinaudoti tokiu programos kodu:
Program First;
Uses Crt;
VAR
i,j,k,cur_i,cur_j,hop_count:byte;
A:array[1..3,1..3] of byte;
Bom:Array[1..10000,1..5] of byte;
path_num,total,m,n:longint;
Procedure PATH(cur_i,cur_j:byte; k:byte);
VAR
i,j:byte;
m,n:integer;
begin
{We will calclate only path amount, but not detailed paths, because of
limitation to array size.
Actually you can make detailed path up to 5 hops. You just should uncomment
calculating of array 'Bom'}
A[cur_i,cur_j]:=1;
for i:=1 to 3 do
begin
for j:=1 to 3 do
begin
{ Bom[path_num,k]:=cur_i*10+cur_j;}
if k1)and(A[i,2]=0))
or
((j=cur_j)and(abs(i-cur_i)>1)and(A[2,j]=0))
or
( (abs(i-cur_i)>1) and (abs(j-cur_j)>1) and (A[2,2]=0))
)
then
begin
{We will enlarge path number if hop amount in path is
qual to actual hop amount only}
if k=hop_count then
begin
path_num:=path_num+1;
{ Bom[path_num,k+1]:=i*10+j;}
end;
A[i,j]:=1;
{Recursive running of path calculation}
PATH(i,j,k+1);
A[i,j]:=0;
end;
end
else
begin
if (A[i,j]=0)and
not(
((i=cur_i)and(abs(j-cur_j)>1)and(A[i,2]=0))
or
((j=cur_j)and(abs(i-cur_i)>1)and(A[2,j]=0))
or
( (abs(i-cur_i)>1) and (abs(j-cur_j)>1) and (A[2,2]=0))
)
then
begin
{Enlarge path number after exit out of procedure}
{ Bom[path_num,k+1]:=i*10+j;}
path_num:=path_num+1;
end;
end;
end;
end;
end;
begin
{A[x,y] - Array of 0 and 1.
0 - this point isn't in path yet. You can move here.
1 - this point is in path already. You can't move here.
}
ClrScr;
writeln ('Let','''','s count amount of Android Graphical passwords.');
writeln;
i:=1;
j:=1;
k:=1;
for hop_count:=4 to 8 do
begin
path_num:=1;
for i:=1 to 3 do
for j:=1 to 3 do
begin
{ Bom[path_num,k]:=10*i+j;}
PATH(i,j,k);
a[i,j]:=0;
end;
writeln('Hops: ',hop_count,'. Path amount: ',path_num-1);
total:=total+path_num-1;
end;
writeln('===========================');
writeln('Total amount: ',total);
{Output of full list of paths.}
{for m:=1 to path_num do
begin
write('Path ', m,': (');
for n:=1 to hop_count+1 do
begin
write(Bom[m,n],' ');
end;
writeln(')');
readln;
end;{}
readln;
end.
Taigi gauname kiekį variantų kiekvienam sujungimo skaičiui. Nuo 1 iki 4 sujungimų gaunamas beveik tikslus skaičius su apskaičiuotu. O naudojant daugiau nei 8 sujungimus - atspėti galimybės nėra.
Paskalis turi 64 kb masyvo dydžio apribojimą. Todėl masyvas su dešimt tūkstančių elementų yra neįmanomas. Taigi apskaičiuoti duomenis galima tik iki 4 sujungimų:
Sekos 11-22-31-32-12 rezultatas:
Ir štai galutinis rezultatas:
Taigi galimi 389488 variantai.
Net gi jei iš jų išbraukus 50% pačių paprasčiausių variantų, gaunami 194744 variantai.
Android operacinė sistema suteikia 20 bandymų, po kurių telefonas yra užblokuojamas.
Taigi 20/194744=,0001. Tai 0.01%. Viena šimtoji procento!
Reikia būti tikru laimės kūdikiu, kad pavyktų pataikyti, tik iš tiek leidžiamų bandymų, į teisingą atsakymą.
Pasiremta: habrahabr.ru
Komentarų nėra:
Rašyti komentarą