c# van aaa tot ZZZ

Status
Niet open voor verdere reacties.

Tomboman

Gebruiker
Lid geworden
15 feb 2013
Berichten
32
Ik wil het volgende maken:
een script dat alle combinaties vanaf aaa tot zzz oproept.
Nu wil ik dat het aantal tekens (nu 3) uitbreidbaar word met een variabele (bijv. als int lengte 5 is, moet hij van aaaaa tot zzzzz gaan).

Nu ben ik hier een tijdje mee bezig maar ik kom er maar niet uit, ook op internet kan in geen voorbeelden vinden.

Heeft iemand hier toevallig een goed voorbeeld script van?
 
mij lijkt het slim om een formule te gebruiken.

dat je een aantal opgeeft.
er zijn 26 letter

je telt dan op tot bijvoorbeeld 26^26 = 676 (dus 2x van a t/m z is 2 rijen)
nu doe je een while loop met bijvoorbeeld int i die steeds met 1 ophoogt.
nu doe je als code.
i/26 is het 100 houd je 3 over.(afronden omlaag)
dan heb je de eerste letter (de 3de letter dus de letter c)
dus dan:

string antwoord = "c";

nu kijk je wat de restwaarde is als je door 26 deelt met % dus hou je bijvoorbeeld 100%26 =22 over.
dan zorg je dat string antwoord de 22e letter bevat dus antwoord = "d";
dan doe je :
antwoord = (antwoord + "d");
het antwoord zou dus bij combinatie 100 cd zijn


Dit doe je dus in de while loop met elk getal, je berekent dus tot i het gewenste getal heeft bereikt bij 2 rijen 676 bij 3 rijen 17576
 
Laatst bewerkt:
Ik heb aan de hand van je uitleg het volgende script geschreven. En voor een woord van 2 tekens werkt het dus ook goed.

Code:
double lengte = Math.Pow(26, 2);

            for (double i = 1; i <= lengte; i++)
            {
                double first = Math.Floor(i / 26);
                double second = Math.Floor(i % 26);

                string eerst = letters(first);
                string tweede = letters(second);
                if (eerst + tweede == txtLengte.Text)
                {
                    MessageBox.Show(eerst + tweede);
                    break;
                }
            }

Alleen nu weet ik niet hoe ik een derde teken kan toevoegen, omdat ik niet weet hoe ik het dan met de Math.Floor(..) moet doen.
Zou je me nog een keer kunnen helpen?
 
Bij het 3e teken heb je weer 676 x 26 = 17576 mogelijkheden dus dat is de maximale waarde.

nu moet je de waarde delen door 676

2200 / 676 = 3
antwoord = 3(c)

2200 % 676 = 172

172/ 26 = 6
antwoord = 3+6 (c+f)

172%26 = 16
antwoord = 3+6+16 = (c+f+p)

het antwoord is dan

cfp
 
Je kan het ook oplossen met een recursieve functie. Stel je wil alle combinaties met 3 letters. Dan gebeurt het volgende:

Code:
    MaakLetterCombinaties(3)
        de functie roept zichzelf aan met MaakLetterCombinaties(2)
            de functie roept zichzelf aan met MaakLetterCombinaties(1) 
                deze aanroep levert een lijst met de woorden a - z
            deze lijst wordt omgezet naar een lijst met woorden aa-zz
        deze lijst wordt omgezet naar een lijst met woorden aaa-zzz
    deze lijst wordt teruggegeven

En in echte code

Code:
    class Program
    {
        static void Main(string[] args)
        {
            List<string> combos;
            combos = MaakLetterCombinaties(4);
            foreach (var combo in combos)
            {
                Console.WriteLine(combo);
            }
        }

        // Geeft een lijst van alle 'woorden' die gemaakt kunnen worden met de letters a - z.
        // Elk 'woord' heeft dezelfde lengte
        static List<string> MaakLetterCombinaties(int lengte)
        {
            List<string> resultaat = new List<string>(); ;

            if (lengte > 1)
            {
                // Lengte is groter dan 1
                // Maak een lijst met woorden 1 korter dan de gewenste lengte
                List<string> korteWoorden = MaakLetterCombinaties(lengte - 1);

                // Voeg voor elk gevonden kort woord een combinatie met een van de letters a tot z toe aan het resultaat  
                foreach (string kortWoord in korteWoorden)
                {
                    for (int i = 0; i < 26; i++)
                    {
                        resultaat.Add(kortWoord + Char.ConvertFromUtf32(97 + i));
                    }
                }
            }
            else
            {
                // Maak woorden van 1 lang.
                for (int i = 0; i < 26; i++)
                {
                    resultaat.Add(Char.ConvertFromUtf32(97 + i));
                }
            }
            return resultaat;
        }
    }
 
resultaat.Add(Char.ConvertFromUtf32(97 + i)); dat kende ik nog niet thx
 
Je kan het ook oplossen met een recursieve functie. Stel je wil alle combinaties met 3 letters. Dan gebeurt het volgende:

Code:
    MaakLetterCombinaties(3)
        de functie roept zichzelf aan met MaakLetterCombinaties(2)
            de functie roept zichzelf aan met MaakLetterCombinaties(1) 
                deze aanroep levert een lijst met de woorden a - z
            deze lijst wordt omgezet naar een lijst met woorden aa-zz
        deze lijst wordt omgezet naar een lijst met woorden aaa-zzz
    deze lijst wordt teruggegeven

En in echte code

Code:
    class Program
    {
        static void Main(string[] args)
        {
            List<string> combos;
            combos = MaakLetterCombinaties(4);
            foreach (var combo in combos)
            {
                Console.WriteLine(combo);
            }
        }

        // Geeft een lijst van alle 'woorden' die gemaakt kunnen worden met de letters a - z.
        // Elk 'woord' heeft dezelfde lengte
        static List<string> MaakLetterCombinaties(int lengte)
        {
            List<string> resultaat = new List<string>(); ;

            if (lengte > 1)
            {
                // Lengte is groter dan 1
                // Maak een lijst met woorden 1 korter dan de gewenste lengte
                List<string> korteWoorden = MaakLetterCombinaties(lengte - 1);

                // Voeg voor elk gevonden kort woord een combinatie met een van de letters a tot z toe aan het resultaat  
                foreach (string kortWoord in korteWoorden)
                {
                    for (int i = 0; i < 26; i++)
                    {
                        resultaat.Add(kortWoord + Char.ConvertFromUtf32(97 + i));
                    }
                }
            }
            else
            {
                // Maak woorden van 1 lang.
                for (int i = 0; i < 26; i++)
                {
                    resultaat.Add(Char.ConvertFromUtf32(97 + i));
                }
            }
            return resultaat;
        }
    }

Het is gelukt.
Bedankt voor je reactie en de code begrijp ik goed de je stuurde.
Volgens mij is resultaat een array?
Alleen als je de dan returned, hoe kan je die dan weer goed opvangen?
Ik heb namelijk nog nooit een array gereturned.

Met een C# button.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan