Конференция "Основная" » Последовательный перебор элементов [D6, D7, Win2k, WinXP]
 
  • Skyhawk (03.04.08 16:09) [0]
    Есть два массива - один пустой, другой заполненный:

    var
    a1:array of Char;
    a2:array[0..25] of Char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    ......


    как составить алгоритм последовательного перебора элементов массива от A до ZZZZZZ (количество символов в слове не более 9)
    типа
    A
    B
    C
    AB
    AC
    BA
    BB
    BC
    CA
    CB
    CC
    AAA
    AAB и т.д, а затем определить сколько слов состоит только из согласных, а сколько только из гласных(это конечно проще)
    Уважаемые мастера ПОМОГИТЕ!
  • tesseract © (03.04.08 16:12) [1]

    > сколько слов состоит только из согласных, а сколько только
    > из гласных(это конечно проще)


    Заведи массив "согласные" и "гласные"  и проверяй.
  • Skyhawk (03.04.08 16:31) [2]

    > Заведи массив "согласные" и "гласные"  и проверяй.


    На это я и сам умный - не первый год на свете живу. Не катит - мне нужен полностью весь список (хотя это идиотизм - сотни тысяч вариантов) и процентное соотношение.
  • tesseract © (03.04.08 16:39) [3]

    > Не катит - мне нужен полностью весь список (хотя это идиотизм
    > - сотни тысяч вариантов) и процентное соотношение.


    Какие сотни тысяч ? У тебя 1 список вообще должен быть, по которому проверять будешь - согласная это или гласная.

    ЗЫ:  Некоторым годы разума не прибавляют.
  • Skyhawk (03.04.08 16:50) [4]
    Список и есть один. Вопрос в том как его сформировать!
    От А до ZZ я все понимаю, даже при дополнительном счетчике до ZZZ но дальше??? Каким образом отрегулировать последовательность если количество символов в слове колеблется от 2 до 9. Как мне осуществить переход например от ACDZZZZ к ACEAAAA как контролировать инкремент индекса следующего символа?

    Чтобы обработать результат - его нужно получить.


    > Некоторым годы разума не прибавляют.
    >

    Мы вроде не в детском саду.
  • tesseract © (03.04.08 16:55) [5]

    > ACDZZZZ к ACEAAAA как контролировать инкремент индекса следующего
    > символа?


    Это как я понял элементs массива типа string ?  Там вообще тогда буквы роли не играют.


    >  Каким образом отрегулировать последовательность если количество
    > символов в слове колеблется от 2 до 9


    Массиву вообще говоря то фонаря, что в нём содержиться. Заполняешь массив и всё.
  • MBo © (03.04.08 16:57) [6]
    12 093 235 слов из гласных
    538 947 368 421 слов из согласных
    5 646 683 826 135 слов всего
    Ты всё еще хочешь генерировать весь список?
  • Andy BitOff © (03.04.08 17:03) [7]
    > Skyhawk   (03.04.08 16:09) [0], [2]

    Зачем тебе ВЕСЬ список?
    В цикле формирования последовательности (в конце) проверяй есть ли там (в текущей последовательности) гласные. А уж соотношение, это ты уж как-нибудь сам, не бог весть какая задача.
  • Andy BitOff © (03.04.08 17:05) [8]
    > MBo ©   (03.04.08 16:57) [6]

    Это при длине 9?
  • tesseract © (03.04.08 17:13) [9]

    > Это при длине 9?


    Энторпия для позиционных чисел расчитываеться как :   (база системы счисления ) ^ (количество значащих позиций). Можешь сам посчитать :-)
  • MBo © (03.04.08 17:33) [10]
    >Это при длине 9?
    Да, длина от 1 до 9, 6 букв посчитал гласными
    Пустое слово учитывалось, так что единицу надо отнимать.
  • Anatoly Podgoretsky © (03.04.08 20:38) [11]
    > Skyhawk  (03.04.2008 16:31:02)  [2]

    Ты оптимист, не несколько сотен тысяч вариантов, а 5 * 10^15 не лопнешь? Даже если весь список хранить на диске, то это пторебуетсвыш 5000 террабайт, не говоря уже о том, что поседеешь пока список будешь составлять.
  • Skyhawk (04.04.08 10:54) [12]

    > tesseract
    >
    > Это как я понял элементs массива типа string ?  Там вообще
    > тогда буквы роли не играют.
    >


    см. вопрос: массив типа Char уже заполненный. Важны не буквы потому что как ты сам сказал "Массиву вообще говоря то фонаря, что в нем содержится".
    Так вот важны не буквы, а цифры, не список, а алгоритм.

    Начнем сначала: во-первых 9-максимальная а не потенциальная длина слова. То есть я должен просчитать варианты с длиной слова от 2 до 9. Соответственно средняя цифра 5. От нее и отталкиваюсь. Для слова длиной 2 символа можно использовать даже самый корявый алгоритм:

    procedure Generate;
    var
    myWord:array of Char;
    charArray:array[0..25] of Char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    charIndex,counter:integer;
    begin
    charIndex:=0;
    counter:=0;
    repeat
    myWord[charIndex]:=charArray[charIndex];
    for counter:=0 to 25 do   {образно количество элементов массива букв}
      begin
        myWord[charIndex+1]:=charArray[counter];
      end;
    inc(charIndex);
    until charIndex<2;
    end;



    Для трехсимвольного слова можно взять за основу средний индекс и контролировать предыдущий и последующий, но для динамического массива это практически не возможно. Я пытался для 5 символов зациклить последовательное сравнение значений индекса символа создав дополнительную процедуру (типа GetCharIndex) которая по букве выдает ее позицию в массиве. Получается хрень какая-то.

    P.S. В среднем через 5-7 секунд в живых остается только диспетчер задач. Прога начинает жрать всю память которую только можно.
    Хотя я ставлю длину слова 4 символа. Пробовал массив слова сделать не динамическим, результат еще хуже - прога вылетает, комп виснет намертво, несмотря на то, что саму процедуру я не менял.
 
Конференция "Основная" » Последовательный перебор элементов [D6, D7, Win2k, WinXP]
Есть новые Нет новых   [134484   +49][b:0][p:0.001]