Laden...

Buchstaben-BruteForce mit 3 Zeichen

Erstellt von Snowman25 vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.893 Views
S
Snowman25 Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren
Buchstaben-BruteForce mit 3 Zeichen

Erstmal Hallo an alle hier

und nun zu meinem Problem bzw. Denkfehler:
Ich hab einen 30 Zeichen langen String "oooooooooooooooooooooooooooooo" der als erstes Element in eine String-Liste wandert.
Der String wird dann weiterverarbeitet, das erste Zeichen zu einem 'a' verwandelt, zurückgegeben und dann wird dieser String in die Liste aufgenommen. Danach soll aus dem 'a' ein 'l' werden und danach wieder ein 'o' und der 2. Buchstabe ein 'a'. Ein eigentlich recht simpler BruteForce eben.

Hab zum debuggen die Ausgabe jeden Strings angeordnet. Allerdings kommt nur folgendes heraus:

oooooooooooooooooooooooooooooo aooooooooooooooooooooooooooooo looooooooooooooooooooooooooooo aaoooooooooooooooooooooooooooo lloooooooooooooooooooooooooooo aaaaoooooooooooooooooooooooooo lllloooooooooooooooooooooooooo aaaaaaaaoooooooooooooooooooooo lllllllloooooooooooooooooooooo aaaaaaaaaaaaaaaaoooooooooooooo

das zeigt mir schon mal 2 Probleme.
1.: Die Iteration des BruteForce funktioniert nicht richtig.
2.: Ich befinde mich in einer Endlosschleife, da das Programm "end" anzeigen sollte, sobald ich durch bin.

Irgendwo habe ich einen herben Denkfehler im Code, aber ich komm einfach nicht darauf wo!

Hier mal der Code, markiert ist die Stelle der Endloschschleife nach ein paar Durchläufen:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Problem_191 {
    class Program {
        static int upTo = 1;
        static bool startnew = false;
        static void Main(string[] args) {
            List<string> Prizelist = new List<string>(30);
            Prizelist = createList(Prizelist);
            foreach (string s in Prizelist) {
                Console.WriteLine(s);
            }
            searchAndDestroy(Prizelist);
        }

        private static void searchAndDestroy(List<string> Prizelist) {
            Console.WriteLine("end");
            Console.ReadLine();
        }

        private static List<string> createList(List<string> ls) {
            ls.Add("oooooooooooooooooooooooooooooo");
            for (int listindex = 0; listindex <= 26999; listindex++) {
                ls.Add(getNextItem(ls[listindex]));
                Console.WriteLine(ls[listindex]);
            }
            return ls;
        }

        private static string getNextItem(string rstring) {
            int charindex = 0;
            char[] tmCharr = new char[30];
            if (startnew == true) {
                upTo = 1;
                startnew = false;
            }
            tmCharr = rstring.ToCharArray();
            while (charindex != upTo) {
                switch (tmCharr[charindex]) {
                    case 'o':
                        tmCharr[charindex] = 'a';
                        if (charindex != 29)
                            charindex++;
                        break;
                    case 'a':
                        tmCharr[charindex] = 'l';
                        if (charindex != 29)
                            charindex++;
                        break;
                    case 'l':
                        tmCharr[charindex] = 'o';
                        if (charindex != upTo) {
                            upTo++;
                        } else {
                            if (charindex != 29) {
                                charindex++;
                            } else {
                                startnew = true;
                                break;
                            }
                        }
                        break;
                }
            }
            rstring = new string(tmCharr);
            return rstring;
        }
    }
}

Wo ist mein Fehler?
Ich bin ratlos...
(und momentan bekomme ich auch ein klein wenig Hunger)

int intelligence = 0;
while (intelligence == 0) {
	intelligence *= 10;
}
1.002 Beiträge seit 2007
vor 14 Jahren

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

S
Snowman25 Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

Danke m0rius,
aber das ist nicht ganz das, was ich gesucht habe 😉

Ich brauche die Einträge ja dann wieder in meiner Liste (falls du dir den Quelltext angeschaut hast, weißt du welche), und ausserdem möchte ich gerne eine eigene Lösung bauen und den Fehler finden, nicht auf bereits vorhandene Snippets zurückgreiffen.
Ich bin noch am Lernen und möchte besser werden. Das schaffe ich nur schwierig wenn ich auf Snippets zurückgreiffe, die ich nicht selbst geschrieben habe.

int intelligence = 0;
while (intelligence == 0) {
	intelligence *= 10;
}
K
593 Beiträge seit 2007
vor 14 Jahren

Hallo Snowman25,

wenn du lernen willst du schreibst, dann solltest du dir das snippet genauer anschauen den genau so wird es gemacht. Die Lösung ist gut und schön und macht schon jetzt alles was du willst.

Viele Grüße

Kaji

5.941 Beiträge seit 2005
vor 14 Jahren

Hallo Snowman25

aber das ist nicht ganz das, was ich gesucht habe 😉

Das glaube ich dir.

Denn das Snippet macht eine Ausgabe in die Konsole und gibt keine Liste zurück 😉.

[...] möchte ich gerne eine eigene Lösung bauen und den Fehler finden, nicht auf bereits vorhandene Snippets zurückgreiffen.
Ich bin noch am Lernen und möchte besser werden. Das schaffe ich nur schwierig wenn ich auf Snippets zurückgreiffe, die ich nicht selbst geschrieben habe.

Es funktioniert - laut meiner Erfahrung - beim Lernen so, dass du eine Lösung schreibst, diese nicht genau so funktionert wie du es willst, nicht so sauber aussieht oder nicht so schlank ist wie du möchtest und schlussendlich eine andere Lösung hernimmst.

Jetzt hast du hier eine Lösung die 1:1 das ist was du willst. Du musst nur noch die Einträge zu einer Liste hinzufügen und diese zurückgeben.
Wenn du das erledigt hast, hast du schon etwas gelernt 😉.

Zusätzlich kann ich zu deinen Argumenten sagen, das du sehr gut mit dem Lesen und vorallem Verstehen von fremden Code lernen kannst.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
Snowman25 Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

Nunja, es ist noch aus einem anderen Grund nicht das, was ich gesucht habe:
Das Snippet erstellt alle Kombinationen aus einer n-elementige Menge, was bedeutet, dass die Anzahl der Elemente gleichzeitig die Länge vorgibt. Meine Menge besteht allerdings nur aus 3 Zeichen. Allerdings mit 30 Stellen. Daraus ergeben sich 27.000 Ergebnisse, nicht 27 😜

int intelligence = 0;
while (intelligence == 0) {
	intelligence *= 10;
}
C
401 Beiträge seit 2007
vor 14 Jahren

Um genau zu seinsind es sogar 205891132094649 Kombinationen... also 3^30... Könnte einige Zeit dauern...

S
Snowman25 Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

das wäre nur der Fall, wenn es 30 Zeichen auf 3 stellen sind. aber bei 3 zeichen auf 30 Stellen ist es 30^3, also 27.000 😉

int intelligence = 0;
while (intelligence == 0) {
	intelligence *= 10;
}
C
401 Beiträge seit 2007
vor 14 Jahren

Ähhhh.... nein... Bei 32bit hast du auch nur 2 Zustände und berechnest die Möglichen Werte mit 2^32... Ein bisschen im Unterricht geschlafen, wa?

S
Snowman25 Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

pfft meinetwegen... trotzdem suche ich immer noch den Fehler in meinem Quelltext (keine Snippets!)

int intelligence = 0;
while (intelligence == 0) {
	intelligence *= 10;
}
1.002 Beiträge seit 2007
vor 14 Jahren

Hallo Snowman25,

pfft meinetwegen

nunja, da liegt immerhin der Faktor 7625597485 dazwischen. Aber was soll's, phh, 7,6 Milliarden ist ja auch ein Pappenstiel.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

S
Snowman25 Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

nunja, da liegt immerhin der Faktor 7625597485 dazwischen. Aber was soll's, phh, 7,6 Milliarden ist ja auch ein Pappenstiel.

eben 😁 solange man genug Festplattenspeicher hat (für die Auslagerungsdatei) is das doch i.O. 🙂

oder ich schau gleich nach der erstellung eines einzelnen Strings nach ob er zu gebrauchen ist oder nicht und kann ihn dann verwerfen. Würde mit wohl viel Rechenzeit sparen

int intelligence = 0;
while (intelligence == 0) {
	intelligence *= 10;
}
5.299 Beiträge seit 2008
vor 14 Jahren

Danke m0rius,
aber das ist nicht ganz das, was ich gesucht habe 😉

...und ausserdem möchte ich gerne eine eigene Lösung bauen und den Fehler finden, nicht auf bereits vorhandene Snippets zurückgreiffen.
Ich bin noch am Lernen und möchte besser werden. Das schaffe ich nur schwierig wenn ich auf Snippets zurückgreiffe, die ich nicht selbst geschrieben habe.

Ich find das perfekt zum lernen.
Du musst jetzt den Snippet verstehen, und umschreiben. Das lernt ungemein. 😁 Und dann hastn doch selbst geschrieben.

Du kannst nicht von uns erwarten, dass wir die Fehler (das können beliebig viele sein, auch der Ansatz kann voll daneben liegen) verstehen und umschreiben, und dir erklären. Das würde auch nicht viel lernen.

Der frühe Apfel fängt den Wurm.

D
10 Beiträge seit 2008
vor 14 Jahren

Zum Thema 'Endlosschleife' : es hilft ungemein, wenn man die Variable für die Obergrenze nicht hochsetzt (case 'l')

Zum Thema 'Snippet' da kann ich meinen Vorrednern nur zustimmen. Verstehen und Umschreiben schult durchaus 🙂
Und wenn ich jetzt nicht von aller Logik verlassen bin, kann das Snippet doch das, was du willst, du musst nur die Menge mit den entsprechenden Zeichen füllen - sprich ein "a", ein "l" und 28 "o" und alle Ergebnisse mit der Länge 30 sind die, die dich interessieren. 😁

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Snowman25,

pfft meinetwegen... trotzdem suche ich immer noch den Fehler in meinem Quelltext (keine Snippets!)

nicht den Fehler, sondern die Fehler, es gibt ja mehr als einen. Und auf einen der Fehler hat Corpsegrinder dich ja gerade hingewiesen. Die Schleifenbedingung listindex <= 26999 ist falsch. Das hast du mit einem "pfft meinetwegen" abgetan. Und da sollen wir dann Lust haben, dir noch weiter zu helfen? Schnapp dir den Debugger und such die Fehler selbst. Insgesamt liegt das Problem wohl ohnehin in [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore