перебор символов(DELPHI)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by qwerty001, 5 Apr 2010.

  1. qwerty001

    qwerty001 New Member

    Joined:
    5 Apr 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    подскажите пожалуйсто как организовать перебор всех возможных вариантов символов?
    например:
    a
    ..
    z
    aa
    ab
    ..
    az
    ..
    ba
    bb
    ..
    bz
    ..
    zz
    aaa
    aab
    ...
    zzz
    ....
    zzzzzzz.........
     
  2. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Всех вариантов - бесконечное количество (т.к. ты макс. длину не указал)
    А как можно организовать бесконечное?
     
  3. fenixelite

    fenixelite Banned

    Joined:
    7 Feb 2010
    Messages:
    294
    Likes Received:
    56
    Reputations:
    6
    Допиши условие, тогда уже можно будет обсуждать как сделать!
     
  4. qwerty001

    qwerty001 New Member

    Joined:
    5 Apr 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    условие - подобрать пароль методом перебора символов. длину пароля не знаю. :) если не сложно подскажите как такое организовать.
     
  5. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Кури перевод чисел из одной системы счисления в другую, в твоём случае основатель системы 26(число англ. букв), каждый разряд будет в диапазоне [0..25], перевести тебе надо будет из десятичной в то которую я указал. Потом получаное число прогоняем по всем разрярам и к разряду прибавляем 0x61 и поучлаем нужный символ, профит?:)
     
  6. qwerty001

    qwerty001 New Member

    Joined:
    5 Apr 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    не профит. я ничего не понял. =\
     
  7. qwerty001

    qwerty001 New Member

    Joined:
    5 Apr 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    а если ещё цифры вкючить и символы в перебор?
     
  8. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Эх, щас напишу тада как это сделать
     
  9. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    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.
     
  10. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    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
    ...
     
  11. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    PHP:
    While (1=1) do  // или  while true do
    begin
     
    .... // прервать команда Break;
    end;
     
    #11 JnK, 5 Apr 2010
    Last edited: 5 Apr 2010
  12. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Точнее так:
    Code:
    While (1=1) do
    begin
     ....
    end;
     
  13. qwerty001

    qwerty001 New Member

    Joined:
    5 Apr 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    спасибо большое :)
     
  14. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Я вообще не понимаю смысла кода от JnK, выше код который даёт бесконечное число комбинации(точнее максимальное от Cardinal / 26) :)
     
  15. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Дурак?

    while true do
    begin
    end;

    где здесь организация?
     
  16. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    интересно, что будет занимать больше времени?

    либо
    ??

    Мне кажется что 1е, т.к. в цикле мы дополнительно сравниваем действительно ли 1=1...или я ошибаюсь?


    UPD: при 4х различных тестах пришел к выводу, что как бы ни было парадоксально, на 1 выполнение цикла
    уходит меньше времени чем на
     
    #16 AlexTheC0d3r, 5 Apr 2010
    Last edited: 5 Apr 2010
  17. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    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(basethen
        begin
          i
    :=1;
          
    str:=s;
        
    end;
        
    inc(i);
      
    end;
     
  18. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    В обоих циклах идет сравние:
    1. 1=1
    2. true=true; (т.е. -1=-1)

    2 GhostOnline, обзываться не стоит, перепутал условие.

    P.s. Сорри за оффтоп.
     
  19. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Это да, но это не сложно исправить, писалось та на скорую руку.

    Взорвал мозг))) Во-первых while 1=1 do уже удивляет и доставляет своей нелепостью(пс, первый раз такое вижу):) Во-вторых при 1=1 будет 2 проверки, а с true - одна(не веришь - гоу в отладчик) :) В третьих действительно часто при проверки пишут такие обсурдные вещи как 1<>1 и т.д. для того что delphi со включённым(по дефолту) ключём {$OPTIMIZATION ON} не отбрасывала код в условии if false then (подобное используют что имитировать вложенную процедуру через метки(для оптимизации и уменьшения кода). Но всё равно это только от не знания деректив.
     
    1 person likes this.
  20. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Проверьте код:

    PHP:
    program TestCycleDuration;

    {
    $APPTYPE CONSOLE}

    uses
      SysUtils
    DateUtils;
    var
      
    iinteger;
      
    timeStarttimeEndTDateTime;

    begin
      Writeln
    ('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('First test, cycle "while true do"');
      
    Writeln('Testing...');
      
    := 0;
      
    timeStart := now;
      while 
    true do
      
    begin
        i 
    := 1;
        if 
    2000000000 then
          
    Break;
      
    end;
      
    timeEnd := Now;
      
    Writeln('Test duration: ' inttostr(MilliSecondsBetween(timeEndtimeStart)) +
        
    'ms');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('................................');
      
    Writeln('Second test, cycle "while 1=1 do"');
      
    Writeln('Testing...');
      
    := 0;
      
    timeStart := now;
      while 
    do
      
    begin
        i 
    := 1;
        if 
    2000000000 then
          
    Break;
      
    end;
      
    timeEnd := Now;
      
    Writeln('Test duration: ' inttostr(MilliSecondsBetween(timeEndtimeStart)) +
        
    'ms');
      
    Readln;
    end.
    UPD2: подправил

    Рекомендуется тестировать при как можно меньшем кол-ве запущенных приложений!

    тест общий занимает около 2х секунд... интересны результаты... Абсолютно не претендую на адекватность теста, тем более скорее всего он не особо адекватен..

    UPD3: Прогнав пару-тройку раз, заметил что результаты примерно одинаковые, на моей машине значения либо 671ms ибо 687ms
     
    #20 AlexTheC0d3r, 5 Apr 2010
    Last edited: 5 Apr 2010