grafische Darstellung der Zahlen des Collatz-Problems

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

Ich beschäftige mich seit einer guten Woche mit Python und habe ein kleines Script geschrieben, das die ersten 10000 Zahlen des Collatz-Problems (->wiki) in 3 Dateien im PostScript-Format ausgibt:

Code: Alles auswählen

file = open ("test.ps", "w")
file.write("%!\n%% Collatz\n")
file.close()

file = open ("test_odd.ps", "w")
file.write("%!\n%% Collatz\n")
file.close()

file = open ("test_even.ps", "w")
file.write("%!\n%% Collatz\n")
file.close()

for n in range (1, 10000, 1):
    i = n
    c_odd = 0
    c_even = 0

    while i > 1:
            y = i % 2
            if y == 1:
                    i = 3 * i + 1
                    c_odd = c_odd + 1
            elif y == 0:
                    i = i/2
                    i = int (i)
                    c_even = c_even + 1

    c = c_odd + c_even

    n_ps = n * 0.05
    c_ps = c * 3    
    c_odd_ps = c_odd * 3
    c_even_ps = c_even *3

    file = open ("test.ps", "a")
    file.write ("newpath\n")
    file.write (str (n_ps) + " ")
    file.write (str (c_ps) + " ")
    file.write ("1.5 0 360 arc\nclosepath\nfill\n")
    file.close()

    file = open ("test_odd.ps", "a")
    file.write ("newpath\n")
    file.write (str (n_ps) + " ")
    file.write (str (c_odd_ps) + " ")
    file.write ("1.5 0 360 arc\nclosepath\nfill\n")
    file.close()

    file = open ("test_even.ps", "a")
    file.write ("newpath\n")
    file.write (str (n_ps) + " ")
    file.write (str (c_even_ps) + " ")
    file.write ("1.5 0 360 arc\nclosepath\nfill\n")
    file.close()
   
file = open ("test.ps", "a")
file.write ("showpage")
file.close()

file = open ("test_odd.ps", "a")
file.write ("showpage")
file.close()

file = open ("test_even.ps", "a")
file.write ("showpage")
file.close()
Und so schaut das dann aus, wenn man das Bild etwas mit Photoshop einfärbt und zurechtschneidet (leider in schlechter Qualität):

Bild

schwarz ist die gesamte Schrittlänge, die sich aus der Anzahl der "geraden" (=grün) und "ungeraden" (rot) Schritte zusammensetzt.
BlackJack

@AntagonisT: Das ständige öffnen und schliessen von den Dateien ist ein ziemlicher Zeitfresser. Ausserdem bietet es sich an eine Schleife zu verwenden, wenn man dreimal fast den gleichen Block Quelltext hat.
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

ok, mal schauen, ob ich das kürzer hinkriege.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

Leonidas hat geschrieben:Uii, hübsche PostScript-Bilder :)

Ein wenig kürzer, viel schneller, besser strukturiert.
danke, hast du das jetzt so schnell umgeschrieben?

Bei mir geht es nur nicht:

Warning (from warnings module):
File "H:/Anwendungen/Python 3.1/xxx.py", line 17
open('test_even.ps', 'w')) as (ps_both, ps_odd, ps_even):
DeprecationWarning: With-statements now directly support multiple context managers
Traceback (most recent call last):
File "H:/Anwendungen/Python 3.1/xxx.py", line 54, in <module>
main()
File "H:/Anwendungen/Python 3.1/xxx.py", line 24, in main
for n in xrange(1, 10000):
NameError: global name 'xrange' is not defined
und ich versteh ihn auch nicht so ganz... :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

AntagonisT hat geschrieben:danke, hast du das jetzt so schnell umgeschrieben?
Ja.
AntagonisT hat geschrieben:Bei mir geht es nur nicht:
Ach, du nutzt Python 3.1? Dort wurde xrange in range umbenannt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

stimmt, das hatte ich auch schon ausprobiert.

bleibt noch:
Warning (from warnings module):
File "H:/Anwendungen/Phython 3.1/xxx.py", line 17
open('test_even.ps', 'w')) as (ps_both, ps_odd, ps_even):
DeprecationWarning: With-statements now directly support multiple context managers
keine Ahnung, was ein Context-manager macht oder überhaupt ist - aber ich will jetzt auch nicht, daß Du hier alles erklären musst. Ich lern mich noch durch :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das ist nur eine DeprecationWarning. Nimm den import und Aufruf von ``nested`` weg, dann müsste es tun. Ich wusste nicht dass in 3.x das direkt funktioniert - umso besser.

Was Context Manager sind kannst du in der Dokumentation nachlesen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten