Najpierw trochę liczenia, żebyś wiedział z czym się mierzysz.
Kod
$chars = array
(
array('A','X'),
array('B','C')
);
Dla takiej tablicy ilość kombinacji haseł (zakładając, że w każdej tablicy jesteśmy pewni ilość znaków jakie mogą wystąpić to 2) wynosi 2^2 czyli niewiele bo 4 hasła.
Załóżmy jednak, że następna tablica zawiera 3 znaki, które mogą wystąpić:
Kod
$chars = array
(
array('A','X'),
array('B','C'),
array('D','E','F')
);
Policzmy 2^2*3^1 = 12, to też niewiele, mówimy jednak o hasłach krótkich 3 literowych.
Policzmy trochę więcej liter, czyli dla pierwszego znaku mogą to być 2 litery, dla 2 - 2, dla 3 - 3 i dla 4 też 3:
Kod
$chars = array
(
array('A','X'),
array('B','C'),
array('D','E','F'),
array('G','H','I'),
array('J','K')
);
3^2*2^3=72
tyle możliwych haseł dla 5 literowego hasła po warunkiem jaki uczyniliśmy.
Idźmy dalej:
Kod
$chars = array
(
array('A','X'),
array('B','C'),
array('D','E','F'),
array('G','H','I'),
array('J','K'),
array('L','M','N'),
array('O','P','R'),
array('S','T','U','W'),
array('X')
);
Dla 9 literowego hasła w warunkach jakie założyliśmy, czyli taka a nie inna litera może być miejscach od 1 do 9 mamy:
4^1*3^4*2^3*1^1 = 2592
Tyle masz haseł do sprawdzenia dla hasła 9 literowego. Myślę, że nie ma sensu liczyć dalej i już wiesz o co chodzi.
Jeśli to tylko zagwostka programistyczna to jako ciekawostka w PHP można to zrobić prostą funkcja rekurencyjną, która wyświetli złożone hasła:
Kod
function show($str, $arr, $i)
{
if ($i < count($arr)){
foreach ($arr[$i] as $value)
show($str.$value, $arr, $i + 1);
}
else
{
echo $str.'<br>';
}
}
$chars = array
(
array('A','X'),
array('B','C'),
array('D','E','F'),
array('G','H','I'),
array('J','K'),
array('L','M','N'),
array('O','P','R'),
array('S','T','U','W'),
array('X')
);
show('', $chars, 0);
Ale to do haseł w miarę krótkich i przy założeniu, że jesteśmy pewni 2-3 znaków. Możesz policzyć ile będzie kombinacji haseł jeśli w każdej tablicy będziesz pewien 4,5 czy 6 znaków. Php jest ograniczone czasem wykonywania skryptu i wielkości złożonych danych, w związku z czym dla obciążenia takiej funkcji większą ilością danych (a dokładniej ilością tablic z możliwymi literami hasła, dosyć długiego jak piszesz) na pewno php się do tego nie nadaje i zacznie sypać błędami czy to przekroczeniem czau wykonania czy rozmiarem wyplutych danych.
Przeniesienie tego na język C/C++ czy inny nie powinno być raczej problemem.
Nie stawiam tego jako rozwiązanie problemu, raczej jako ciekawostkę i liczbę haseł do ewentualnego sprawdzenia przy ograniczonych warunkach.