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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Quemo
User
Beiträge: 26
Registriert: Mittwoch 26. März 2008, 22:14

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
quemo.qu.ohost.de
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das was du suchst sind Permutationen (Hint: Forumssuche). Die kann man auf alle moeglichen Arten implementieren, zum Beispiel auch ueber Rekursion.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Itertools bringt aber auch schon ab der 2.6 alles nötige mit
DjFresH
User
Beiträge: 36
Registriert: Donnerstag 20. November 2008, 08:28

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*
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Aircrack gibt es fertig für linux
lunar

Aircrack bricht keine Passwörter ...
Quemo
User
Beiträge: 26
Registriert: Mittwoch 26. März 2008, 22:14

thx für die antworten... :)
ich werd jetzt mal bissl was probieren und gucken obs geht... poaste dann den quelli hier

Quemo
quemo.qu.ohost.de
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

scr1pt k1dd13!
(ich war auch mal einer)


sry fuer den troll post!
cp != mv
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

@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 ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dauerbaustelle hat geschrieben:Hab gestern mal sowas zusammengefummelt.
Hättest du auch mal testen sollen .... :wink:
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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ß
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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
['']
Quemo
User
Beiträge: 26
Registriert: Mittwoch 26. März 2008, 22:14

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
quemo.qu.ohost.de
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

@numerix: Ja, du verwendest die Version des Codes vor dem ersten Edit. Die hat alle Möglichkeiten und 3 Zeichen Länge ausgeschlossen :)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

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.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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".
Quemo
User
Beiträge: 26
Registriert: Mittwoch 26. März 2008, 22:14

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
quemo.qu.ohost.de
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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!
Antworten