-
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 и т.д, а затем определить сколько слов состоит только из согласных, а сколько только из гласных(это конечно проще)
Уважаемые мастера ПОМОГИТЕ! -
> сколько слов состоит только из согласных, а сколько только
> из гласных(это конечно проще)
Заведи массив "согласные" и "гласные" и проверяй. -
Skyhawk (03.04.08 16:31) [2]
> Заведи массив "согласные" и "гласные" и проверяй.
На это я и сам умный - не первый год на свете живу. Не катит - мне нужен полностью весь список (хотя это идиотизм - сотни тысяч вариантов) и процентное соотношение. -
> Не катит - мне нужен полностью весь список (хотя это идиотизм
> - сотни тысяч вариантов) и процентное соотношение.
Какие сотни тысяч ? У тебя 1 список вообще должен быть, по которому проверять будешь - согласная это или гласная.
ЗЫ: Некоторым годы разума не прибавляют. -
Skyhawk (03.04.08 16:50) [4]Список и есть один. Вопрос в том как его сформировать!
От А до ZZ я все понимаю, даже при дополнительном счетчике до ZZZ но дальше??? Каким образом отрегулировать последовательность если количество символов в слове колеблется от 2 до 9. Как мне осуществить переход например от ACDZZZZ к ACEAAAA как контролировать инкремент индекса следующего символа?
Чтобы обработать результат - его нужно получить.
> Некоторым годы разума не прибавляют.
>
Мы вроде не в детском саду. -
> 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? -
> Это при длине 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 символа. Пробовал массив слова сделать не динамическим, результат еще хуже - прога вылетает, комп виснет намертво, несмотря на то, что саму процедуру я не менял.