Ten kod jest do d**y, dlatego takie dziwolągi niezrozumiałe wychodzą :]
Dlaczego akurat używana jest cyferka 6
to nie trudno zrozumieć - wystarczy sprawdzić sobie pod debugerem jakie wartości siedzą w iteratorach i1
, i2
i i3
, w każdej iteracji ostatniej pętli, albo przerobić procedurkę Writeln, aby wyświetlała wartości tych iteratorów:
program Anagram;
var
napis: array [0 .. 3] of Char = 'pora';
i1, i2, i3, i4: Integer;
begin
for i1 := 0 to 3 do
begin
for i2 := 0 to 3 do
begin
if i1 = i2 then
Continue;
for i3 := 0 to 3 do
begin
if (i3 = i1) or (i3 = i2) then
Continue;
i4 := 6 - i1 - i2 - i3;
WriteLn(i1:3, i2:3, i3:3, '|':3, (6 - i1 - i2 - i3):3);
end;
end;
end;
ReadLn();
end.
Na wyjściu dostaniesz teraz to:
0 1 2 | 3
0 1 3 | 2
0 2 1 | 3
0 2 3 | 1
0 3 1 | 2
0 3 2 | 1
1 0 2 | 3
1 0 3 | 2
1 2 0 | 3
1 2 3 | 0
1 3 0 | 2
1 3 2 | 0
2 0 1 | 3
2 0 3 | 1
2 1 0 | 3
2 1 3 | 0
2 3 0 | 1
2 3 1 | 0
3 0 1 | 2
3 0 2 | 1
3 1 0 | 2
3 1 2 | 0
3 2 0 | 1
3 2 1 | 0
Ostatnia kolumna to wynik odejmowania wartości trzech iteratorów od stałej 6
, czyli to co ląduje w zmiennej i4
; Gdyby użyć innej cyferki niż 6
to zmienna i4
dostawać będzie zły indeks ostatniego znaku i permutacje będą niepoprawne; Po prostu ta cyfra pasuje do obliczeń dla czterech znaków i ona właśnie została użyta;
Jednak ten sposób nie jest uniwersalny, ma na sztywno wbitą długość ciągów wyjściowych, więc takie obliczenia a nie inne trzeba zastosować;
PS: Gdybyś chciał dowiedzieć się tego jak obliczyć wartość stałej dla określonej ilości znaków ciągów wyjściowych to wystarczy użyć prostego wzoru - (n - 1)!
, gdzie n
to długość ciągów; Jeśli miałbyś generować 5-znakowe permutacje to trzeba by dołożyć jeszcze jedną pętlę oraz zamiast 6
użyć liczby 24
.