Zeilenumbruch

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.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Leonidas hat geschrieben: das wäre praktsch wieder ein Kandidat für unseren Einzeiler-Thread
Wir haben sowas? Wo?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ö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 :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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. ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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(" "))
Mr

bin ich der Einziege, der das nicht hinkriegt? Ich bin echt kein Programmiergenie!
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
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:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Code: Alles auswählen

def baum(breite):
    for i in range(1, breite, 2):
        print ("*" * i).center(breite)
    
baum(20)
         *          
        ***         
       *****        
      *******       
     *********      
    ***********     
   *************    
  ***************   
 *****************  
******************* 
>>>
TUFKAB – the user formerly known as blackbird
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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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:
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 )

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten