[Delphi] Kombinacje wyrazów z liter a-z


(Venice3000) #1

Witam!

Wstępnie oceniając problem zwracania w memo (po kliku buttona) wszystkich wyrazów 5 literowych z liter całego alfabetu a-z (26 liter) na myśl przychodzi mi tylko zapętlanie.

Jednak tutaj pytam fachowców jak to sprawnie zrobic?

Pozdrawiam


(somekind) #2

Chodzi Ci o wariacje z powtórzeniami, od "aaaaa" do "zzzzz"? Wiesz ile ich będzie? Zmieści Ci się to wszystko do tego memo?

Też bym pomyślał o zapętlaniu, jaj zrobiłem tak w C++, to trwało 455 sekund - fajny benchmark.


(Venice3000) #3

Sprawdzilbym jak długo u mnie potrwa, ale prosiłbym o jakiś kodzik, bo temu zapętleniu samemu nie podołam xD


(Sawyer47) #4

Wszystkie raczej nie zmieszczą Ci się do pamięci, a nawet jeśli to będzie to zajmowało duuużo pamięci. Można generować n-tą wariację, ale nie wszystkie naraz.


(Venice3000) #5

Tzn. ja nie chce wszystkich zapisywac do memo ... tylko te ktore spełnia wymagany warunek.

Także najwięcej ok. 30 sztuk będzie w memo. O brak pamieci się martwie xD.

Potrzebny mi kodzik, bo chce pokombinowac na 'nmhttp'.


(somekind) #6

Jaki warunek?

Bo raczej łatwiej wygenerować spełniające warunek, niż wszystkie, a potem sprawdzać, czy spełniają. Mówimy o prawie 12 milionach wariacji!

Jeśli chodzi o kod, to mogę Ci dać kod w C++, bo nie tworzę w tak pogmatwanych językach jak Delphi.

int main()

{

    const int LICZBA_LITER = 5;

    const int START = 97;

    const int STOP = 122;


    char slowo[LICZBA_LITER + 1];

    slowo[LICZBA_LITER] = 0;

    int ity[LICZBA_LITER];


    for(ity[0] = START; ity[0] <= STOP; ity[0]++)

        for(ity[1] = START; ity[1] <= STOP; ity[1]++)

            for(ity[2] = START; ity[2] <= STOP; ity[2]++)

                for(ity[3] = START; ity[3] <= STOP; ity[3]++)

                    for(ity[4] = START; ity[4] <= STOP; ity[4]++)

                    {

                        for(int i = 0; i < LICZBA_LITER; i++)

                            slowo[i] = ity[i];

                        cout << slowo << endl;

                    }


    cout << "Koniec!" << endl;


    return 0;

}