Seite 2 von 3

Verfasst: Dienstag 6. September 2005, 15:47
von mawe
Hi!

Das wurde Dir schon gezeigt (von jens), aber ich zeigs nochmal, sonst wird das ein Endlosbeitrag, ohne dass was weitergeht ;)

Code: Alles auswählen

for i in range(1,20,2):
    print "*" * i
Jetzt nich die Leerzeichen dazumachen, und fertig :)

PS: Meine Lösung ist auch ein Einzeiler (46 Zeichen), auch ohne Stamm.

Gruß, mawe

Verfasst: Dienstag 6. September 2005, 15:51
von mawe
Leonidas hat geschrieben: das wäre praktsch wieder ein Kandidat für unseren Einzeiler-Thread
Wir haben sowas? Wo?

Verfasst: Dienstag 6. September 2005, 16:02
von Leonidas
Öhm, Shame on me, ich kannte .center() noch nicht!

Aber mit .center() komme ich auf 2 Zeilen, mit Stamm auf 3, und aus dem Zweizeiler kann man auch noch einen lesbaren Einzeiler machen :)

Öhm, ich dachte wir hätten so einen Thread.. meine einen gesehen zu haben. Aber ich kann gerne einen "Obfuscated Python" Thread anlegen :)

Verfasst: Dienstag 6. September 2005, 22:45
von BlackJack
mawe hat geschrieben:PS: Meine Lösung ist auch ein Einzeiler (46 Zeichen), auch ohne Stamm.
Habe auch einen Einzeiler ohne Stamm, allerdings mit 79 Zeichen. Es sind aber auch immer Leerzeichen zwischen Operatoren -- das ganze soll ja lesbar bleiben. :wink:

Verfasst: Dienstag 6. September 2005, 23:08
von Leonidas
BlackJack hat geschrieben:
mawe hat geschrieben:PS: Meine Lösung ist auch ein Einzeiler (46 Zeichen), auch ohne Stamm.
Habe auch einen Einzeiler ohne Stamm, allerdings mit 79 Zeichen. Es sind aber auch immer Leerzeichen zwischen Operatoren -- das ganze soll ja lesbar bleiben. :wink:
Ich liege dazwischen mit 66 Zeichen, auch mit Leerzeichen und so Sachen wie 15 + 1 damit es einfacher zu lesen und verstehen ist :)

Edit: Hier noch schnell ein Programm, dass alle Leerzeichen frisst und ausgibt wieviele Zeichen übrig geblieben sind:

Code: Alles auswählen

code = raw_input('Generatorcode eingeben: ')
justcode = code.replace(' ', '')
print r"Dein Code ist %d \S-Zeichen lang." % len(justcode)
Ich komme damit nach etwas Optimierung auf 44 (Nicht-Leer-)Zeichen. ;)

Verfasst: Mittwoch 7. September 2005, 05:28
von mawe
Leonidas hat geschrieben: Edit: Hier noch schnell ein Programm, dass alle Leerzeichen frisst und ausgibt wieviele Zeichen übrig geblieben sind
TIMTOWTDI :)

Code: Alles auswählen

code = raw_input('Code eingeben: ')
print "Der Code ist %d Zeichen lang." % (len(code) - code.count(" "))

Verfasst: Mittwoch 7. September 2005, 15:19
von Mr
bin ich der Einziege, der das nicht hinkriegt? Ich bin echt kein Programmiergenie!

Verfasst: Mittwoch 7. September 2005, 15:43
von mawe
Mr hat geschrieben: bin ich der Einziege, der das nicht hinkriegt?
Ja :) Kleiner Scherz ;)

Von Andreas hast Du den Tipp mit center() bekommen, das macht eigentlich schon die ganze Arbeit. Hier mal ein Beispiel:

Code: Alles auswählen

>>> from string import center
>>> print center("a", 3)
 a
>>> print "a"
a
print center("a", 3) gibt also einen String mit Länge 3 aus, wobei das a in der Mitte steht (zentriert ;)), der Rest sind Leerzeichen.
Ok. Von jens wissen wir, dass man mit "*" * x das Zeichen "*" x-mal ausgeben lassen kann. Verbinden wir gleich mal unsere neu erworbenen Kenntnisse:

Code: Alles auswählen

>>> def baum():
...     print center("*" * 1, 5)
...     print center("*" * 3, 5)
...     print center("*" * 5, 5)
...
>>> baum()
  *
 ***
*****
Hui! Das sieht ja schon fast aus wie ein Baum :) Statt hunderttausendmal print, nimmst Du einfach die for-Schleife die wir Dir schon einige Male gezeigt haben, fertig.

Gruß, mawe

Verfasst: Mittwoch 7. September 2005, 22:00
von BlackJack
Leonidas hat geschrieben:Edit: Hier noch schnell ein Programm, dass alle Leerzeichen frisst und ausgibt wieviele Zeichen übrig geblieben sind:

Code: Alles auswählen

code = raw_input('Generatorcode eingeben: ')
justcode = code.replace(' ', '')
print r"Dein Code ist %d \S-Zeichen lang." % len(justcode)
Ich komme damit nach etwas Optimierung auf 44 (Nicht-Leer-)Zeichen. ;)
Wenn Du es dir mal nicht ein wenig zu einfach machst: Du hast doch sicher auch eine Zeichenkette mit einem einzelnen Leerzeichen drin, das mitgezählt werden sollte. Oder hast Du eine Lösung mit `center()`? :wink:

Verfasst: Mittwoch 7. September 2005, 22:07
von Leonidas
BlackJack hat geschrieben:Wenn Du es dir mal nicht ein wenig zu einfach machst:
Ich liebe es, es mir so einfach wie möglich zu machen *g*
BlackJack hat geschrieben:Du hast doch sicher auch eine Zeichenkette mit einem einzelnen Leerzeichen drin, das mitgezählt werden sollte. Oder hast Du eine Lösung mit `center()`? :wink:
Ich hatte zuerst eine Lösung mit ' ' aber als ich von .center() erfahren habe, habe ich entschlossen center zu nehmen, ist ja wirklich besser, da habt ihr recht.

Das einzige was ich meinem 44 Zeichen Programm vorwerfen könnte ist, dass es ganz ohne Leerzeichen nicht auskommt, denn Python versteht foriinrange(...) nicht wirklich gut ;) Ein lesbares, verstädliches Programm mit Leerzeichen zwischen den Operatoren ist bei mir 58 Zeichen lang. Ich bin ja mal gespannt auf die Auflösung, der Thread macht viel Spaß! Wir sollten so lustige Sachen öfter machen :)

Verfasst: Freitag 9. September 2005, 17:42
von Mr
ich hab das dann grad mal programmiert mit diesem Programmcode:

Code: Alles auswählen


for s in xrange (1,30,2):
    print "*" * s
mit diesem bild hier:
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
*********************
***********************
*************************
***************************
*****************************
entweder bin ich da nicht durchgestiegen oder das ist ganz einfach nicht das, was ich wollte, denn ich hatte mir da sonen beidseitiegen fertigen, ganzen Baum vorgestellt. Das mag zwar ne schriettlänge von 2 haben und mag auch die gewünschte zahl an sternen ausgeben und so aber ihc hatte mir das anders vorgestellt, oder unterliegt mir da schon wieder ein Fehler?

Verfasst: Freitag 9. September 2005, 17:46
von Leonidas
Mr, du musst ja erstmal Leerzeichen vor den Sternen machen müssen. Sieh dir doch mal die Funktion .center() an, das ist genau das was dir noch fehlt (dann sieht deine Lösung fast genau aus wie meine).

Verfasst: Freitag 9. September 2005, 18:36
von mawe
Mr hat geschrieben: entweder bin ich da nicht durchgestiegen oder das ist ganz einfach nicht das, was ich wollte, denn ich hatte mir da sonen beidseitiegen fertigen, ganzen Baum vorgestellt.
Du hast Dir meinen Post nicht wirklich angesehen, oder?

Verfasst: Freitag 9. September 2005, 21:23
von jens
Also ich hab nun eine Lösung, die Bäume in variable größe liefert.
baum( 7 ):

Code: Alles auswählen

   *   
  ***  
 ***** 
   *   
baum( 12 ):

Code: Alles auswählen

     *      
    ***     
   *****    
  *******   
 *********  
*********** 
    ***     
    ***     
baum( 30 ):

Code: Alles auswählen

              *               
             ***              
            *****             
           *******            
          *********           
         ***********          
        *************         
       ***************        
      *****************       
     *******************      
    *********************     
   ***********************    
  *************************   
 ***************************  
***************************** 
           *******            
           *******            
           *******            
           *******            
           *******            
           *******            

Verfasst: Freitag 9. September 2005, 22:32
von mitsuhiko

Code: Alles auswählen

def baum(breite):
    for i in range(1, breite, 2):
        print ("*" * i).center(breite)
    
baum(20)
         *          
        ***         
       *****        
      *******       
     *********      
    ***********     
   *************    
  ***************   
 *****************  
******************* 
>>>

Verfasst: Freitag 9. September 2005, 23:36
von BlackJack
Leonidas hat geschrieben:Ein lesbares, verstädliches Programm mit Leerzeichen zwischen den Operatoren ist bei mir 58 Zeichen lang.
Meine Lösung mit `center` ist 52 Zeichen mit und 47 Zeichen ohne unnötige Leerzeichen lang. Zumindest mit Syntax Highlighting finde ich beide Varianten lesbar.

Verfasst: Samstag 10. September 2005, 00:04
von mitsuhiko

Code: Alles auswählen

>>> baum = lambda b: "\n".join([("*" * i).center(b) for i in range(1, b, 2)])
>>> print baum(30)
...
Selbe Lösung mit lambda.

Verfasst: Samstag 10. September 2005, 00:07
von mitsuhiko
jens hat geschrieben:
Mr hat geschrieben:wieso eigentlich xrange. Warum nicht einfach nur range, wo liegt n da der Unterschied?
s. http://www.python-forum.de/viewtopic.php?p=12053#12053
xrange wird wieder durch range erstetzt.
Stand in irgend so einem PEP drin. Weil Range seit Python2.4 auch einen Generator mit in sein Objekt packt. :wink:

Verfasst: Samstag 10. September 2005, 06:44
von jens
Also hier mein Code:

Code: Alles auswählen

def baum( size ):
    for s in xrange (1,size,2):
        print ( "*" * s ).center( size )
    for i in xrange(size/5):
        print ( "*" * (size/4) ).center( size )

baum( 7 )
baum( 12 )
baum( 30 )

Verfasst: Samstag 10. September 2005, 12:39
von Leonidas
blackbird hat geschrieben:Stand in irgend so einem PEP drin. Weil Range seit Python2.4 auch einen Generator mit in sein Objekt packt. :wink:

Code: Alles auswählen

In [2]: range(10)
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [3]: type(range(10))
Out[3]: <type 'list'>
Sieht für mich nicht so aus.

Allerdings ist type(range(10000)) etwas arg schnell, was auf einen Generator schließen lässt.

blackbird, hast du den PEP irgendwo da, ich würde ihn gerne lesen.

Okay, meine umfassende Lösung:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
# A simple christmas tree generator

# define the characters serving for drawing the tree
#+they have to be 1-character long

# character for the green part of the tree - leaves
greenchar = '*'
# character for the air around the tree
whitechar = ' '
# character for the tree trunk
trunkchar = '|'

# the maximal width of the tree
maxsize = 15

# how many green charts do we have in the line?
#+forst 1, then 3, so it increments by 2
for green in xrange(1, maxsize + 1, 2):
    print (green * greenchar).center(maxsize)

# draw the trunk
print trunkchar.center(maxsize)
Kurzversion ohne Stamm:

Code: Alles auswählen

for i in xrange(1, 15 + 1, 2): print (i * 'x').center(15)