Seite 1 von 2

Schwere Aufgabe ... (aber ich will das lösen)

Verfasst: Dienstag 9. Dezember 2008, 12:49
von Quemo
Hallo.
Ich bin noch ein Anfänger in sachen Python.
Hab aber ne spannende Aufgabe gefunden.

Ich habe eine Liste mit verschiedenen Zeichen:
liste = ['A','B','C','D']

jetzt will ich da mit hilfe von python alle kombinationen herrausfinden und die soll er mir dann auflisten.

insgesammt sind das ja 4 Zeichen dh.

anzahl_kombinationen = 4 * 3 * 2 * 1
also 24 kombinationen

wie soll ich das jetzt aber schlau machen... also welche Elemente in der Liste tauschen das ich alle kombinationen herrausfinde. Ich denke mit ner for schleife würd das sicher gehn... aber ich komm iwie ned drauf wie ich an alle kombinationen komm...

wenn ich jetzt 6 buchstaben hätte
dann wären die anzahl kombinationen
6 * 5 * 4 * 3 * 2 * 1 = 720 mögliche kombinationen

kann mir da jemand helfen?

ah ja... es ist kein Schulkrams ... in der schweiz lernen wir so zeug gar ned... aha ja und bin erst 15 :)

Quemo

Verfasst: Dienstag 9. Dezember 2008, 12:59
von Leonidas
Das was du suchst sind Permutationen (Hint: Forumssuche). Die kann man auf alle moeglichen Arten implementieren, zum Beispiel auch ueber Rekursion.

Verfasst: Dienstag 9. Dezember 2008, 13:01
von Lonestar
Itertools bringt aber auch schon ab der 2.6 alles nötige mit

Verfasst: Dienstag 9. Dezember 2008, 13:23
von DjFresH
jetzt will ich da mit hilfe von python alle kombinationen herrausfinden und die soll er mir dann auflisten.
:D klingt nach ner vorstufe zu nem passwort knacker *lol*

Verfasst: Dienstag 9. Dezember 2008, 15:38
von sea-live
Aircrack gibt es fertig für linux

Verfasst: Dienstag 9. Dezember 2008, 15:55
von lunar
Aircrack bricht keine Passwörter ...

Verfasst: Dienstag 9. Dezember 2008, 18:36
von Quemo
thx für die antworten... :)
ich werd jetzt mal bissl was probieren und gucken obs geht... poaste dann den quelli hier

Quemo

Verfasst: Dienstag 9. Dezember 2008, 19:53
von Costi
scr1pt k1dd13!
(ich war auch mal einer)


sry fuer den troll post!

Verfasst: Dienstag 9. Dezember 2008, 20:44
von Dauerbaustelle
@Costi: Oh man, was soll denn der Scheiß. Wer sich mit Brute-Force/Kryptographie auseinander setzt, kommt nicht drumrum, auch mal nen Brute-Force praktisch zu hacken. Und warum, um alles in der Welt, soll man dann ein "Scriptkiddie" sein?

@Quemo:
Hab gestern mal sowas zusammengefummelt.

Code: Alles auswählen

class Bruty:
    combinations = []
    def __init__(self, length, charset=map(chr, range(97,123))):
        self.length = length
        self.charset = charset

    def run(self):
        self.combinations.append(self.generate_combinations())

    def generate_combinations(self, chars=''):
        for char in self.charset:
            if len(chars) < self.length:
                self.combinations.append(self.generate_combinations(chars+char))
        return chars
Wie du sehen kannst, ist die Kombinations-Generation einfach nur eine rekursive Funktion. Das heißt, ich starte z.B. bei
"A" und schau, ob ich die gewünschte Länge erreicht habe. Wenn nicht, generiere ich für "A"+x (wobei x für je für ein Zeichen aus deiner Zeichenmenge `charset` steht) wieder die Kombinationen (rufe die Kombinationsgeneration mit "A"+x auf).
Jede erzeugte Kombination speichere ich in `combinations`.

Code: Alles auswählen

bruty = Bruty() # bzw Bruty(liste_deiner_zeichen)
bruty.run()
print bruty.combinations[:10] # mal nur die ersten 10, bin ja nicht wahnsinnig, die alle auszugeben ;)
Edit: btw, es sind nicht 5*4*3*2*1 (5! ("Fakultät 5")) Möglichkeiten. Sondern 5*5*5*5*5 (also 5^5, allgemein auch verwendete_zeichen^länge z.B. bei 5 Kleinbuchstaben dann 26^5). Du kannst das "A" ja auch an zweiter Stelle *nochmals* verwenden, du "verlierst" es ja nicht ;)

Verfasst: Dienstag 9. Dezember 2008, 20:48
von numerix
Dauerbaustelle hat geschrieben:Hab gestern mal sowas zusammengefummelt.
Hättest du auch mal testen sollen .... :wink:

Verfasst: Dienstag 9. Dezember 2008, 22:14
von Dauerbaustelle
numerix hat geschrieben:
Dauerbaustelle hat geschrieben:Hab gestern mal sowas zusammengefummelt.
Hättest du auch mal testen sollen .... :wink:
Äh... eigentlich tut das doch? O_o

Mir fällt grade auf, bei der Instanzierung von Bruty muss man als erstes Argument die maximale Länge angeben.
also Bruty(3) oder Bruty(3, ['a','b','c'])

Gruß

Verfasst: Dienstag 9. Dezember 2008, 22:31
von DasIch
Dauerbaustelle hat geschrieben:
numerix hat geschrieben:Hättest du auch mal testen sollen .... :wink:
Äh... eigentlich tut das doch? O_o

Code: Alles auswählen

>>> bruty = Bruty(3, ascii_letters)
>>> bruty.run()
>>> len(bruty.combinations) == len(ascii_letters) ** 3
False

Verfasst: Dienstag 9. Dezember 2008, 22:39
von numerix
Dauerbaustelle hat geschrieben:Äh... eigentlich tut das doch? O_o

Mir fällt grade auf, bei der Instanzierung von Bruty muss man als erstes Argument die maximale Länge angeben.
also Bruty(3) oder Bruty(3, ['a','b','c'])

Code: Alles auswählen

>>> bruty = Bruty(3)
>>> bruty.run()
>>> bruty.combinations
['']
>>> bruty = Bruty(3,["a","b","c"])
>>> bruty.run()
>>> bruty.combinations
['']

Verfasst: Mittwoch 10. Dezember 2008, 12:44
von Quemo
Hallo.

Hab mir jetzt mal was zusammengeproggd das problem ist nur das wenn ich einen string von mehr als 14 zeichen länge eingebe er meinen memory füllt
ist wegen der rekursion... wie kann ich das lösen?

Hier der Code: -- bitte ned wegen variabelnamen meckern... hab das so speed cooding art gemacht
http://rafb.net/p/VZ9J7817.html

Verfasst: Mittwoch 10. Dezember 2008, 13:44
von Dauerbaustelle
@numerix: Ja, du verwendest die Version des Codes vor dem ersten Edit. Die hat alle Möglichkeiten und 3 Zeichen Länge ausgeschlossen :)

Verfasst: Mittwoch 10. Dezember 2008, 16:03
von numerix
Dauerbaustelle hat geschrieben:@numerix: Ja, du verwendest die Version des Codes vor dem ersten Edit. Die hat alle Möglichkeiten und 3 Zeichen Länge ausgeschlossen :)
Offensichtlich; dass du den Code geändert hattest, habe ich nicht mitbekommen.

Mit der jetzt gezeigten Fassung erhalte ich als Ergebnis für denselben Aufruf:

Code: Alles auswählen

['aaa', 'aab', 'aac', 'aa', 'aba', 'abb', 'abc', 'ab', 'aca', 'acb', 'acc', 'ac', 'a', 'baa', 'bab', 'bac', 'ba', 'bba', 'bbb', 'bbc', 'bb', 'bca', 'bcb', 'bcc', 'bc', 'b', 'caa', 'cab', 'cac', 'ca', 'cba', 'cbb', 'cbc', 'cb', 'cca', 'ccb', 'ccc', 'cc', 'c', '']
Das ist ebenfalls nicht das, was herauskommen sollte. Es geht dem OP um Permutationen.

Quemo hat geschrieben:Hier der Code: -- bitte ned wegen variabelnamen meckern... hab das so speed cooding art gemacht
Du erwartest von anderen, dass sie sich mit deinem Code beschäftigen, es ist dir aber zu viel Arbeit (?) den Code - anscheinend wider besseres Wissen - so zu erstellen, dass er die Kriterien für "guten Code" erfüllt. Das bewirkt bei mir dann ein "speed watching": Ich sehe mir den Code gar nicht erst an.

Verfasst: Mittwoch 10. Dezember 2008, 16:50
von Lonestar
weil manns bei ProjecEuler in den ersten Aufgaben andauernd gebrauchen kann ist mir das hier nich ausm kopf gegangen:

Code: Alles auswählen

IDLE 2.6b2      
>>> from itertools import permutations
>>> for p in permutations("abc", 3):
	print p

	
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
>>> 
da hier ja schon einige Lösungen gepostet wurden hoffe ich mal ich nehme niemandem dem Spass am programmieren genommen habe.

Verfasst: Mittwoch 10. Dezember 2008, 16:57
von Dauerbaustelle
numerix hat geschrieben: Das ist ebenfalls nicht das, was herauskommen sollte. Es geht dem OP um Permutationen.
Ich dachte, es ginge ihm darum, Brute-Force zu schreiben, und er hätte da was verwechselt. Darum zeigte ich ihm auch den Code, der "wirkliches" Brute-Force "generiert".

Verfasst: Mittwoch 10. Dezember 2008, 17:18
von Quemo
Lonestar hat geschrieben:weil manns bei ProjecEuler in den ersten Aufgaben andauernd gebrauchen kann ist mir das hier nich ausm kopf gegangen:

Code: Alles auswählen

IDLE 2.6b2      
>>> from itertools import permutations
>>> for p in permutations("abc", 3):
	print p

	
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
>>> 
da hier ja schon einige Lösungen gepostet wurden hoffe ich mal ich nehme niemandem dem Spass am programmieren genommen habe.
genau so was will ich nur ich wills sleber proggen

Verfasst: Mittwoch 10. Dezember 2008, 17:53
von numerix
Dauerbaustelle hat geschrieben:Ich dachte, es ginge ihm darum, Brute-Force zu schreiben, und er hätte da was verwechselt. Darum zeigte ich ihm auch den Code, der "wirkliches" Brute-Force "generiert".
Es war wohl eher so, dass andere meinten, dass das sein Anliegen sei und sich der Thread vorübergehend dann in diese Richtung entwickelte. Der OP hat nie behauptet, dass das sein Anliegen gewesen sei ... :wink:

Dein Code ist trotz allem aber nicht uninteressant!