подскажите пожалуйсто как организовать перебор всех возможных вариантов символов? например: a .. z aa ab .. az .. ba bb .. bz .. zz aaa aab ... zzz .... zzzzzzz.........
Всех вариантов - бесконечное количество (т.к. ты макс. длину не указал) А как можно организовать бесконечное?
условие - подобрать пароль методом перебора символов. длину пароля не знаю. если не сложно подскажите как такое организовать.
Кури перевод чисел из одной системы счисления в другую, в твоём случае основатель системы 26(число англ. букв), каждый разряд будет в диапазоне [0..25], перевести тебе надо будет из десятичной в то которую я указал. Потом получаное число прогоняем по всем разрярам и к разряду прибавляем 0x61 и поучлаем нужный символ, профит?
1. В бесконечном цикле пробегать по ASCII отвечающий за буквы, цифры. Code: myChar := Chr(66); // Использование Char для конвертирования Подробнее 2. Объявить в const базу пароля и по ней пробегать в цикле. Вот пример как реализовывать через const: PHP: const m='qwertyuioplkjhgfdsa'; // база Var i,j:integer; s,str:string; begin str:=''; for j:=1 to 15 do // кол-во символов*на базу begin for i:=1 to length(m) do begin s:=str+m[i]; memo1.Lines.Add(s); // что то делаем с генер, строкой end; str:=s; end; end; P.s. но лучше сделать 1 циклом, например в While (i=255) do.
Code: const ci_interval = 26; {â àãë. ñëîâàðå 26 áóêàô:)} ci_index = $61; { èíäåêñ ñèìâîë "à" â ascii} function IntToSymbols(Const bound : Cardinal) : String; Var i, curBound, c_mod : Cardinal; c_tmp : Char; Begin Result := ''; curBound := bound; while true do Begin if curBound < ci_interval then Begin Result := Result + Chr(ci_index + curBound); Break; end; c_mod := curBound mod ci_interval; curBound := curBound div ci_interval; Result := Result + Chr(ci_index + c_mod); end; {ïåðåâîðà÷èâàåì ñòðîêó} for i := 1 to Length(Result) div 2 do Begin c_tmp := Result[i]; Result[i] := Result[Length(Result)-i+1]; Result[Length(Result)-i+1] := c_tmp; end; end; Используем так : Code: procedure TForm1.Button1Click(Sender: TObject); var i : Integer; begin for i := 0 to *сколько надо вариантов* do Memo1.Lines.Add(IntToSymbols(i)); end; Будет выводить a b c .. z aa ab ac ...
Я вообще не понимаю смысла кода от JnK, выше код который даёт бесконечное число комбинации(точнее максимальное от Cardinal / 26)
интересно, что будет занимать больше времени? либо ?? Мне кажется что 1е, т.к. в цикле мы дополнительно сравниваем действительно ли 1=1...или я ошибаюсь? UPD: при 4х различных тестах пришел к выводу, что как бы ни было парадоксально, на 1 выполнение цикла уходит меньше времени чем на
Jingo Bo, У тебя пропускается вывод на aa .. az сразу с b Code: a .. z ba .. bz ca P.s. Прогонял в цикле 1000. Насчет кода я показывал метод реализации, и ниже дописал, что лучше сделать 1 циклом, насчет "бесконечного цикла" то ниже приведен код. Т.к. пароли имеют чувствительность к регистру и используются цифры, сделал на основе константы. PHP: const base='0987654321ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba'; var s,str:string; i:integer; begin i:=1; while true do begin s:=str+base[i]; memo1.Lines.add(s); if i>=length(base) then begin i:=1; str:=s; end; inc(i); end;
В обоих циклах идет сравние: 1. 1=1 2. true=true; (т.е. -1=-1) 2 GhostOnline, обзываться не стоит, перепутал условие. P.s. Сорри за оффтоп.
Это да, но это не сложно исправить, писалось та на скорую руку. Взорвал мозг))) Во-первых while 1=1 do уже удивляет и доставляет своей нелепостью(пс, первый раз такое вижу) Во-вторых при 1=1 будет 2 проверки, а с true - одна(не веришь - гоу в отладчик) В третьих действительно часто при проверки пишут такие обсурдные вещи как 1<>1 и т.д. для того что delphi со включённым(по дефолту) ключём {$OPTIMIZATION ON} не отбрасывала код в условии if false then (подобное используют что имитировать вложенную процедуру через метки(для оптимизации и уменьшения кода). Но всё равно это только от не знания деректив.
Проверьте код: PHP: program TestCycleDuration; {$APPTYPE CONSOLE} uses SysUtils, DateUtils; var i: integer; timeStart, timeEnd: TDateTime; begin Writeln('................................'); Writeln('................................'); Writeln('................................'); Writeln('................................'); Writeln('First test, cycle "while true do"'); Writeln('Testing...'); i := 0; timeStart := now; while true do begin i := i + 1; if i = 2000000000 then Break; end; timeEnd := Now; Writeln('Test duration: ' + inttostr(MilliSecondsBetween(timeEnd, timeStart)) + 'ms'); Writeln('................................'); Writeln('................................'); Writeln('................................'); Writeln('................................'); Writeln('Second test, cycle "while 1=1 do"'); Writeln('Testing...'); i := 0; timeStart := now; while 1 = 1 do begin i := i + 1; if i = 2000000000 then Break; end; timeEnd := Now; Writeln('Test duration: ' + inttostr(MilliSecondsBetween(timeEnd, timeStart)) + 'ms'); Readln; end. UPD2: подправил Рекомендуется тестировать при как можно меньшем кол-ве запущенных приложений! тест общий занимает около 2х секунд... интересны результаты... Абсолютно не претендую на адекватность теста, тем более скорее всего он не особо адекватен.. UPD3: Прогнав пару-тройку раз, заметил что результаты примерно одинаковые, на моей машине значения либо 671ms ибо 687ms