Hilfe bei Umsetzung

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.
Sid
User
Beiträge: 2
Registriert: Freitag 13. Januar 2006, 15:01

Freitag 13. Januar 2006, 15:14

Hallo Leute!

Also ich bräuchte eure Hilfe bei einem Programm, das eigentlich relativ simpel ist, ich selber finde aber nicht die Zeit, es umzusetzen.

Die Aufgabenstellung ist:

Die Zahl Pi soll mit 10 Millionen Nachkommastellen angegeben werden.

Dazu soll man hier die Leerstellen mithilfe von Python entfernen. (Muss nicht das pdf sein, konnte nur kein anderes Dokument mit 10 Millionen Nachkommstellen finden).

Weiters soll man mithilfe des Programmes herausfinden können, an welcher Nachkommastelle das eigene Geburtsdatum das erste Mal vorkommt. (also zum Beispiel der 1. Dezember 1964 in der Form 011264).

Und als letztes soll man noch rausfinden, welches Geburtsdatum sich nicht finden lässt (es gibt nur ein einziges).

Wäre echt nett von euch, wenn ihr mir da helfen könntet, ist ziemlich dringend.

Ich zähl auf euch Pythonspezialisten 8), für euch ist das sicher kein großes Problem.

Danke schonmal im Voraus,
Sid

Edit (Leonidas): Verschoben nach "Allgemeine Fragen"
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

Freitag 13. Januar 2006, 15:22

Hausaufgaben ist etwas was man selber erledigen sollte :wink:

Entwickle doch einfach einen eigenen Lösungsansatz vielleicht gibts dann ja ein par Tips.

Oder bezahl mich :twisted:
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Freitag 13. Januar 2006, 15:59

Sid hat geschrieben:(Muss nicht das pdf sein, konnte nur kein anderes Dokument mit 10 Millionen Nachkommstellen finden).
Schade, für 1 Million Stellen gibt es die "gut" merkbare

http://3.141592653589793238462643383279 ... 44592.com/

Für 10 Millionen schaust du hier: http://www.solidz.com/pi/

(Python kann bz2-Komprimierte Dateien auch direkt lesen)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 13. Januar 2006, 16:06

Sid hat geschrieben:Also ich bräuchte eure Hilfe bei einem Programm, das eigentlich relativ simpel ist, ich selber finde aber nicht die Zeit, es umzusetzen.
Warum sollten wir dann? Weil wir den ganzen lieben langen Tag und dann noch die Nacht gerne Hausaufgabern zu lösen?
Sid hat geschrieben:Dazu soll man hier die Leerstellen mithilfe von Python entfernen. (Muss nicht das pdf sein, konnte nur kein anderes Dokument mit 10 Millionen Nachkommstellen finden).
Habe gerade keine Lust das PDF runterzuladen, weil es großer als 100kb ist ;) Was steht da drin? 10 Millionen Nachkommastellen von Pi?
Sid hat geschrieben:Weiters soll man mithilfe des Programmes herausfinden können, an welcher Nachkommastelle das eigene Geburtsdatum das erste Mal vorkommt. (also zum Beispiel der 1. Dezember 1964 in der Form 011264).
Dazu konvertiert man die Zahl in einen String und sucht danach. Wo ist das Problem?
Sid hat geschrieben:Und als letztes soll man noch rausfinden, welches Geburtsdatum sich nicht finden lässt (es gibt nur ein einziges).
Etwas schwieriger, aber dennoch nicht unlösbar. Schlimmstenfalls kann man es per Brute-Force herausfinden. Hier könnte ich mir vorstellen dass man einen Generator für Geburtsdaten schreibt und diese dann prüft. Nicht schön, aber einfach.
Sid hat geschrieben:Wäre echt nett von euch, wenn ihr mir da helfen könntet, ist ziemlich dringend.
Warum? Weil du zu spät angefangen hast?
Sid hat geschrieben:Ich zähl auf euch Pythonspezialisten 8), für euch ist das sicher kein großes Problem.
Nein, warscheinlich nicht. Für dich aber auch nicht, da das ja insgesammt kein großes Problem ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Sid
User
Beiträge: 2
Registriert: Freitag 13. Januar 2006, 15:01

Freitag 13. Januar 2006, 16:08

Okay danke...

Also Lösungsansätze...

begonnen hat das glaub ich mit "import os"...weiß jetzt aber nicht inwieweit das mir weiterhilft...

und um die leerstellen zu entfernen gibts auch einen befehl glaub ich...

Aber wie genau das weitergeht weiß ich eben nicht, deswegen hab ich mich hier angemeldet
:wink:
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Freitag 13. Januar 2006, 16:12

Dann poste doch, was du bis jetzt geschrieben hast, und was genau nicht funktioniert.

Denn eine Hausaufgabe, die man nur vorgekaut bekommt, ist vollkommene Zeitverschwendung; sie bringt dir nichts, da du (fast) nichts bei lernst, und uns auch nichts.
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

Freitag 13. Januar 2006, 16:14

Sid hat geschrieben:Okay danke...

Also Lösungsansätze...

begonnen hat das glaub ich mit "import os"...weiß jetzt aber nicht inwieweit das mir weiterhilft...

und um die leerstellen zu entfernen gibts auch einen befehl glaub ich...

Aber wie genau das weitergeht weiß ich eben nicht, deswegen hab ich mich hier angemeldet
:wink:
So als einstieg:

Code: Alles auswählen

einstring = "ich habe leerstellen"
print einstring.replace( " ","")
:wink:
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Freitag 13. Januar 2006, 16:40

Code: Alles auswählen

string = "1234567"
try:
  print "34 ist an Position",string.index("34")
except ValueError:
  print "34 nicht gefunden"

tag,monat,jahr = 1,2,1921
gebstring = "%02i%02i%04i" % (tag,monat,jahr)
Das sollte nun aber reichen ;)
BlackJack

Freitag 13. Januar 2006, 23:09

Leonidas hat geschrieben:
Sid hat geschrieben:Und als letztes soll man noch rausfinden, welches Geburtsdatum sich nicht finden lässt (es gibt nur ein einziges).
Etwas schwieriger, aber dennoch nicht unlösbar. Schlimmstenfalls kann man es per Brute-Force herausfinden. Hier könnte ich mir vorstellen dass man einen Generator für Geburtsdaten schreibt und diese dann prüft. Nicht schön, aber einfach.
Ein Lösungsansatz wäre es die Menge aller Geburtstagsdaten (max. 37200) zu erzeugen und dann einmal die Nachkommastellen durchzugehen und die Geburtstage nach und nach aus der Menge zu entfernen. Dann bleibt am Ende ein Geburtstag übrig. Dürfte schneller sein, als die Geburtstage alle in den ganzen Nachkommastellen zu suchen weil man dann mit jedem Geburtstag wieder von vorne anfängt.

So als Lösungsansatz für Sid.
BlackJack

Sonntag 15. Januar 2006, 23:43

Habe gerade nachvollzogen, dass tatsächlich ein Datum nicht enthalten ist. :-)

Das Programm braucht auf einem 1 Ghz Athlon ca. 2 Minuten. Mit `psyco` ist's eine halbe Minute schneller und wenn ich den Schritt mit dem entfernen aller Teilzeichenketten der Länge 6 der Nachkommastellen von `pi` aus der Menge der möglichen Geburtstage in ein Pyrex-Modul auslagere, dann ist das nur unwesentlich langsamer als die `psyco` Beschleunigung.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 16. Januar 2006, 07:49

BlackJack hat geschrieben:Mit `psyco` ist's eine halbe Minute schneller
Hi BlackJack!

Dann bringt "psyco" also doch etwas. Bei all meinen Tests, die ich, bzw. ein Mitarbeiter von mir, durchgeführt haben, hat psyco nichts gebracht. Das waren wohl nicht die richtigen Algorithmen die wir beschleunigen wollten.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Montag 16. Januar 2006, 10:16

Also, mit folgender Pi-Datei:

http://www.solidz.com/pi/pi-10m.txt.bz2

und meinem kleinen Script (was ich hier noch nicht poste, außer jemand will Herangehensweise vergleichen und postet zuerst, wir sind ja nicht der Hausaufgabenkanal ;-)) hab ich folgendes Timing auf 'nem Turion-64 MT-32 unter 1800 Mhz

modelnine@phoenix ~/pi $ time python test.py
Remaining: set(['120154'])

real 1m11.272s
user 1m2.449s
sys 0m1.123s
modelnine@phoenix ~/pi $

Das ganze ist nicht Psyco beschleunigt weil der Turion im 64-bit Modus ist (und dementsprechend Psyco nicht zu haben). Wäre mal interessant zu sehen wie andere das machen und was sie rauskriegen. ;-)

--- Heiko.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Montag 16. Januar 2006, 10:23

Lustig. Es macht einen massiven Unterschied ob man einfach wahllos Datums zurückgibt oder aber vorher guckt ob das Datum syntaktisch korrekt ist (wie im folgenden):

modelnine@phoenix ~/pi $ time python test.py
Remaining: set(['120154'])

real 0m30.722s
user 0m28.720s
sys 0m0.773s
modelnine@phoenix ~/pi $

--- Heiko.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Montag 16. Januar 2006, 10:25

Vorher zu prüfen ob ein Datum im set noch drin ist bevor man es rausnimmt (um eine exception zu vermeiden) bringt dann nicht mehr viel:

modelnine@phoenix ~/pi $ time python test.py
Remaining: set(['120154'])

real 0m29.515s
user 0m27.275s
sys 0m0.695s
modelnine@phoenix ~/pi $

--- Heiko.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Montag 16. Januar 2006, 10:32

Das ganze noch mal mit komplettem Einlesen der Strings aus dem BZ2-File, nicht zeilenweise (braucht natürlich massiv Speicher):

modelnine@phoenix ~/pi $ time python test.py
Remaining: set(['120154'])

real 0m27.403s
user 0m25.113s
sys 0m0.294s
modelnine@phoenix ~/pi $

python -O bringt ganz davon abgesehen so gut wie gar nix, was ja auch nicht anders zu erwarten war.

--- Heiko.
Antworten