|
|
|
| Ответ 013 на задачу N 4.
С условиями задачи можно ознакомится по ссылке.
Решение задачи 004
Репетунов Алексей Репетунов aka PantiL
Сначала я хотел сделать, как наверное многие и сделали, цепочкой вложенных циклов. Но не помню кто-то сказал, что длина пароля не превышает 4 символов - а я не заметил этой тонкости - может же быть и меньше (автор задачи тоже, наверное не заметил тонкости в этой строчке :))
У меня проверка идет от q и заканчивается решением задачи либо завершение времени выполнения. Думал если не будет успевать придется промежуточный вариант запомниать, перезагружать страничку, но это не потребовалось
А для оригинальности решил придумать класс, кторый будет формировать комбинации для проверки.
Принимайте на суд:
Искомые слова
user = 6.080303сек
igor = 6.879374сек
lena = 15.507789сек
atom = 8.946640сек
|
<?
//Класс - искомый пароль
class Pass
{
private $arr_chars; //Массив символов из которых возможно состоит пароль
//Массив номеров(ключи массива arr_chars) символов из состоит проверяемая комбинация
//(символы проверяемого в данный момент вариата)
private $arr_num_chars;
//Конструктор класса
function __construct()
{
//инициализируем массив символов из которых может состоять пароль
//Символы в том порядке в каком они на клаве - я не знаю алфавита :)
$this->arr_chars = array("q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "a", "s", "d", "f", "g", "h", "j", "k", "l", "z", "x", "c", "v", "b", "n", "m");
$this->arr_num_chars = array(0);
}
//Вариант не подошел - делаем следующий
function plus_plus()
{
//В этом массиве записаны ключи номера символов из которых состоит проверяемая
//комбинация
$this->arr_num_chars[(count($this->arr_num_chars)-1)]++;
//Так как в лат. алфавите 26 символов,
//то мы перебираем массив и следим чтобы номер символа не вышел за пределы
//длины алфавита
for($i=(count($this->arr_num_chars)-1); $i>-1; $i--)
{
//Если всетаки вышли за предел
if($this->arr_num_chars[$i]>25)
{
//Значит номер этого символа 0
$this->arr_num_chars[$i] = 0;
//Если есть предыдущий символ то его номер увеличиваем на 1
//А если его нет то создадим его с номером 0
if(!isset($this->arr_num_chars[$i-1]))
{
array_unshift($this->arr_num_chars, "0");
}
else
{
$this->arr_num_chars[$i-1]++;
}
}
}
//Проверяемая комбинация символов
$str_return = "";
//Вот тут ее формируем
foreach($this->arr_num_chars as $val)
{
$str_return .= $this->arr_chars[$val];
}
return $str_return;
}
}
//Хеш ломаемого пароля
$md5_hash = "3e10f8c809242d3a0f94c18e7addb866";
//Создаем объект класса Пасс
$password = new Pass();
//Перебор выполняем пока не найдем результат или пока не закончится время
while(1)
{
$find_pass = $password->plus_plus();
$md5_find_pass = md5($find_pass);
if($md5_find_pass==$md5_hash)
{
echo $find_pass;
exit();
}
}
?>
|
http://www.softtime.ru/info/task.php?id_article=74 | |
|
|
|
|
|
|
|
для: SoftTime
(07.02.2006 в 22:53)
| | Скрипт несколько громоздок, а использование класса не оправдано причём приводит к заметному падению скорости вычислений (а для этой задачи скрость очень критична). Использование класса также приводит к снижению читабельности. Однако диапазон символов легко раширяем и в решении не используются вложенные циклы по числу символов в пароле. | |
|
|
|
|
|
|
|
для: cheops
(09.02.2006 в 00:07)
| | 2cheops
Протестируеты плиз все скрипты на своей машине (или пусть это сделает кто-то), чтоб скрипты выполнялись в одной среде. Вот тогда и решим чей быстрее. Показатели моего скрипты неплохие, если учесть что пароль перебирается от одного символа до 4-х. | |
|
|
|
|
|
|
|
|
для: SoftTime
(07.02.2006 в 22:53)
| | Скрипт трудно читаем, перегружен, не оправдано использование класса.
Плохо что используется while(1), надо выдавать предупреждение что не найден пароль. | |
|
|
|