Avatar billede sprox Nybegynder
13. december 2002 - 00:20 Der er 6 kommentarer og
1 løsning

Såkaldt Bruteforce algoritme

Hej
Jeg fandt engang en algoritme her på eksperten som f.eks. ku bruges til at gætte password... det var vidst nok borrisholt der kom med den i dephi-delen...

Ikke fordi jeg er interesseret i at hacke nogen eller noget ...
Men jeg sad og legede med rekursive algoritmer osv :]
så hvis der var en af jer der kunne hitti den så :]
Avatar billede sprox Nybegynder
13. december 2002 - 15:11 #1
altså f.eks.

testfunc(3); // 3 levels

aaa
aab
aac
aba

osv.
Avatar billede dittmer Nybegynder
15. december 2002 - 01:37 #2
Okæh, nøgleordet er rekursion.

vector<string> testfunc(int n) {

  // Først opbygger vi et array indeholdende alle de tegn, der kan indgå i
  // den streng, vi prøver at gætte.
  char chararray[] = "abcdefghijklmnopqrstuvwxyzæøåABCDE"; // fortsæt selv

  // Dernæst laves dette array til en vector<char>.
  vector<char> characters = new vector<char>();
  characters.assign(chararray, &chararray[sizeof(chararray)-1]);

  // Hvis næste kodelinie eksisterer, dannes strenge af længden 0, ..., n tegn
  // Hvis kodelinien udkommenteres, er alle strenge nøjagtig n tegn lange
  characters.insert('', characters.begin());

  string temp = new string();
  vector<string> result = new vector<string>();

  createstrings(n, temp, result);

  return result;
}

// Her er rekursionsdelen - det er sq ikke den, der fylder... ;o)
void createstrings (int n, string seed, vector<string> result&) {
 
  for (vector<char>::iterator i = characters.begin();
      i != characters.end(); i++) {
    if (n > 1) {
      createstrings(n-1, seed + i, result);
    }
    else {
      result.insert(seed + i);
    }
  }
  return result;
}

Denne funktion kunne laves mere elegant med halerekursion og hvor resultatet returneres fra funktionen, men dette skulle osse klare problemet.

Dette er et resultat af "ottomh programming" - den er ikke testet, men det ka' sq ikke være helt galt...
Avatar billede sprox Nybegynder
15. december 2002 - 16:51 #3
takker, men jeg har aldrig 'leget' med vector før.. gider du ikke prøve at forklare det?
så smider jeg nogle flere points oveni hatten :)
Avatar billede dittmer Nybegynder
15. december 2002 - 17:18 #4
Joda...

Det er ikke vector, der er så interessant. Den bruges bare som et "dynamisk array", så du kan fylde mere og mere i den uden at spekulere på, om den "løber over". Vector forøger kapaciteten, når det er nødvendigt.

Linierne

      vector<char> characters = new vector<char>();
      characters.assign(chararray, &chararray[sizeof(chararray)-1]);

fylder blot dit array af char over i en vector på en smart måde, der ligger som en standard-metode på vector-klassen (templaten). Det er godt at bruge disse templates, da de er gennemprøvede og rimeligt optimerede.


vector<char> betyder blot, at det er en vector, der indeholder char, dvs. hvert element i denne vector er en char. vector er en såkaldt template, og den kan gives en vilkårlig type, så du ikke skal kode en ny vector for hver type, du vil lægge i den...

Linien

      characters.insert('', characters.begin());

betyder, at du vha. vectors indbyggede metode insert() indsætter et tomt tegn som det første element i den vector, der hedder characters. characters.begin() returnerer en iterator, der kan bruges til at løbe gennem (iterere) alle dine elementer i din vector. Det sidste element i denne vector peges på af iteratoren characters.end(). Denne iterator benyttes også i for-løkken i createstrings(). Iteratoren i skal her løbe fra begin() til end(). Ret intuitivt, ikke?

Har du problemer med selve rekursionen, eller er det klart? Spørg bare...
Avatar billede sprox Nybegynder
15. december 2002 - 19:20 #5
takker, prøver mig frem :)
Avatar billede sprox Nybegynder
15. december 2002 - 19:28 #6
fixer lige et spm med 50 points...
navn :takdittmer
Avatar billede dittmer Nybegynder
16. december 2002 - 08:58 #7
Takker for det...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester