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
Schwere Aufgabe ... (aber ich will das lösen)
-
- 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
-
- 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.
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`.
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 ;)
@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
"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 ;)
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Äh... eigentlich tut das doch? O_onumerix hat geschrieben:Hättest du auch mal testen sollen .... :wink:Dauerbaustelle hat geschrieben:Hab gestern mal sowas zusammengefummelt.
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ß
Dauerbaustelle hat geschrieben:Äh... eigentlich tut das doch? O_onumerix hat geschrieben:Hättest du auch mal testen sollen ....
Code: Alles auswählen
>>> bruty = Bruty(3, ascii_letters)
>>> bruty.run()
>>> len(bruty.combinations) == len(ascii_letters) ** 3
False
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
['']
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
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
-
- 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 :)
Offensichtlich; dass du den Code geändert hattest, habe ich nicht mitbekommen.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
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', '']
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.Quemo hat geschrieben:Hier der Code: -- bitte ned wegen variabelnamen meckern... hab das so speed cooding art gemacht
weil manns bei ProjecEuler in den ersten Aufgaben andauernd gebrauchen kann ist mir das hier nich ausm kopf gegangen:
da hier ja schon einige Lösungen gepostet wurden hoffe ich mal ich nehme niemandem dem Spass am programmieren genommen habe.
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')
>>>
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
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".numerix hat geschrieben: Das ist ebenfalls nicht das, was herauskommen sollte. Es geht dem OP um Permutationen.
genau so was will ich nur ich wills sleber proggenLonestar hat geschrieben:weil manns bei ProjecEuler in den ersten Aufgaben andauernd gebrauchen kann ist mir das hier nich ausm kopf gegangen:
da hier ja schon einige Lösungen gepostet wurden hoffe ich mal ich nehme niemandem dem Spass am programmieren genommen habe.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') >>>
quemo.qu.ohost.de
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 ...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".
Dein Code ist trotz allem aber nicht uninteressant!