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.
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!
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ich habe es seinerzeit mal so weit gebracht.
Quemo
User
Beiträge: 26
Registriert: Mittwoch 26. März 2008, 22:14

so hier jetzt meine lösung:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import time

def get_combinations(string):
    
    if len(string) <1:
        yield string
     
    else:
        for permu in get_combinations(string[1:]):
            for i in range(len(permu)+1):
                yield permu[:i] + string[0:1] + permu[i:]

# Zeitberechnung
beg = time.time()

iterator = get_combinations("EPMDHLIRIEKETUISIS")
file = open ('output', 'w')
for element in iterator:
    file = open('output', 'a')
    file.write(element+'\n')
    file.close()

end = time.time()
print end - beg
bitte bewerten...
das time dings is nur zum gucken wie lange er hat
quemo.qu.ohost.de
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Nach deiner eigenen Aussage bist du Python-Anfänger und darum sieht das auch nicht aus, wie selbst entwickelter Code, sondern eine Mischung aus Versatzstücken gefundener Snippets. :wink:

Was den Teil angeht, der überwiegend von dir stammen könnte - nämlich der Teil außerhalb der Funktion -, so hast du das mit den Dateioperationen noch nicht richtig verstanden. Dazu solltest du nochmal das Tutorial lesen. Und dann auch das Dateiobjekt nicht "file" nennen, weil der Name schon belegt ist.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Numerix meint denke ich, dass du anstatt für jedes Element die Datei aufzumachen und den String reinzuschreiben auch einfach alle *auf einmal* reinschreiben könntest.
Quemo
User
Beiträge: 26
Registriert: Mittwoch 26. März 2008, 22:14

ja aber so kann ich die datei schon bevor das script beendet is angucken
bei 18 zeichen is das meiner meinung nach nützlich
ah ja .. der code stammmt komplett von mir... fred.reichbier hat mir nur gesagt das ich das mit yield machen kann :D ich sass aber auch den ganzen nachmittag an diesem code... am anfang war er viel länger

edit: sieht man auch auf der anderen seite....

btw... seit 2h würgt er sich jetzt schon mit der kombination von 18 chars rum... die datei ist schon knapp 1 GB gross
quemo.qu.ohost.de
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

@Quemo: Ist dir klar, dass die Datei output in jeder Iteration geöffnet und geschlossen wird? Warum öffnest du die Datei in Zeile 20 mit Modus "w" aber benutzt während des Schreibens den Modus "a"? So erscheint mir Zeile 20 überflüssig. Das with-statement ist übrigens ne schöne Sache.
Quemo
User
Beiträge: 26
Registriert: Mittwoch 26. März 2008, 22:14

thx ... da hast du natürlich recht -.-
quemo.qu.ohost.de
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Quemo hat geschrieben:btw... seit 2h würgt er sich jetzt schon mit der kombination von 18 chars rum... die datei ist schon knapp 1 GB gross
Wenn es in der Geschwindigkeit weitergeht, dann ist dein Rechner in rund 1361 Jahren schon fertig ... :D

Aber dann musst du zwischendrin gelegentlich on-the-fly eine neue Festplatte einbauen, es sei denn du hast Platz für knapp 6 PB ...
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Also das wären dann bei 10 Zeichen fünf Sekunden, es gilt

Mögliche Kombinationen = Charset ^ len(Charset)
bei 10^10 also 10000000000, dafür braucht er 5 Sekunden bei mir => 2000000000 Kombinationen/Sekunde.

Bei 18^18 Kombinationen wären das dann 39346408075296537575424/2000000000 Sekunden = 623833 Jahre.

Der Speicherplatz, den du dafür brauchst, ist 18 * 18^18 Bytes = 644136294208 Terabytes.

Edit: numerix hat das ja schon vorgerechnet, ist ist sein Rechner wohl schneller :D Hm, irgendwie sind unsere Ergebnisse sehr unterschiedlich. Hab wohl irgendwo nen Denkfehler drin ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dauerbaustelle hat geschrieben:numerix hat das ja schon vorgerechnet, ist ist sein Rechner wohl schneller :D Hm, irgendwie sind unsere Ergebnisse sehr unterschiedlich. Hab wohl irgendwo nen Denkfehler drin ;)
In jedem Fall wird weder Quemo noch seine Festplatte das je erleben ... :)
Quemo
User
Beiträge: 26
Registriert: Mittwoch 26. März 2008, 22:14

ich hab das mal abgebrochen *totlach*
edit: was bringt mir der ganze script jetzt eigentlich???
quemo.qu.ohost.de
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ich weiß nicht, was es dir bringt, aber ich habe meinen Code damals geschrieben, um ein Zeitungsrätsel mit Buchstabensalat zu komplettieren ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:ich habe meinen Code damals geschrieben, um ein Zeitungsrätsel mit Buchstabensalat zu komplettieren ;)
Und ich dachte schon dass das was ich in meiner Freizeit mache blödsinnig ist ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Nun, mein Ego wollte das olle Rätsel komplett lösen und mein Verstand zog Automation, Weiterbildung und Gehirnjogging dem stumpfen Ausprobieren vor :)

Dabei bin ich übrigens die erzeugten Zeichenketten von Hand (bzw. Auge) durchgegangen in der Hoffnung, beim Überfliegen a) reale Wörter und b) unter diesen das gesuchte zu finden - was geklappt hat.

Nach einigen Updates verwendet der Code immerhin `yield`, doch bisher ist es noch rekursiv, wobei ich gerne auch eine iterative Lösung geschaffen hätte. Das ist mir bisher aber noch nicht gelungen - wer also einen Nagel für den Programmierhammer sucht: Bitte coden Sie jetzt!
Antworten