|
Autor |
Tannenbaum in Python |
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Themenstart: 2022-01-14
|
Hallo,
ich will in Python einen Tannenbaum kreieren.
Muss man dazu mit ein for-Schleife die Leerzeichen machen und eine weitere for die *-Zeichen?
In der erste Zeile haben wir 1 *, in der zweite haben wir 3 *, in der dritte 5 *, usw.
Also benutzen wir die Formel 2i-1 als die Anzahl der Zeichen * der Zeile i ?
Aber welche ist die Anzahl der Leerzeichen?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.1, eingetragen 2022-01-14
|
\sourceon
>>> n = 10; print('\n'.join(' '*(n-i)+'*'*(1+2*i) for i in range(n)))
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
\sourceoff
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.2, vom Themenstarter, eingetragen 2022-01-14
|
\quoteon(2022-01-14 22:19 - zippy in Beitrag No. 1)
\sourceon
>>> n = 10; print('\n'.join(' '*(n-i)+'*'*(1+2*i) for i in range(n)))
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
\sourceoff
\quoteoff
Achso, die Anzahl der Zeichen ist $2i+1$ weil die Nummerierung von $0$ anfängt und nicht von $1$.
Warum ist die Anzahl der Leerzeichen $n-i$ ? Wie bekommt man diese Formel?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.3, eingetragen 2022-01-14
|
\quoteon(2022-01-14 22:23 - mathletic in Beitrag No. 2)
Warum ist die Anzahl der Leerzeichen $n-i$ ?
\quoteoff
Man hat in der untersten Zeile $1+2(n-1)$ Sterne, und die zerfallen in einen mittleren und jeweils $n-1$ links und rechts davon. In der Zeile $i$ hat man den mittleren Stern und jeweils $i$ Sterne links und rechts davon. Also muss man links mit $n-i-1$ Leerzeichen auffüllen, wenn man den Tannenbaum linksbündig zeichnen will. Ich habe ein zusätzliches Zeichen Abstand zum Rand gelassen und komme daher auf $n-i$.
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.4, vom Themenstarter, eingetragen 2022-01-14
|
\quoteon(2022-01-14 22:31 - zippy in Beitrag No. 3)
\quoteon(2022-01-14 22:23 - mathletic in Beitrag No. 2)
Warum ist die Anzahl der Leerzeichen $n-i$ ?
\quoteoff
Man hat in der untersten Zeile $1+2(n-1)$ Sterne, und die zerfallen in einen mittleren und jeweils $n-1$ links und rechts davon. In der Zeile $i$ hat man den mittleren Stern und jeweils $i$ Sterne links und rechts davon. Also muss man links mit $n-i-1$ Leerzeichen auffüllen, wenn man den Tannenbaum linksbündig zeichnen will. Ich habe ein zusätzliches Zeichen Abstand zum Rand gelassen und komme daher auf $n-i$.
\quoteoff
Achso!!
Und wenn man im Tannenbaum farbige Kugeln hinzufügen möchte, macht man es folgenderweise ?
\sourceon Python
\numberson
n = 10
for i in range(n) :
if (i == n/2) :
print('\n'.join(' '*(n-i)+ esc('31;1;4')'*'*(1+2*i)))
else :
print('\n'.join(' '*(n-i)+'*'*(1+2*i)))
\sourceoff
Ich bekomme aber eine Fehlmeldung wegen esc('31;1;4').
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.5, eingetragen 2022-01-14
|
\quoteon(2022-01-14 22:51 - mathletic in Beitrag No. 4)
Ich bekomme aber eine Fehlmeldung wegen esc('31;1;4').
\quoteoff
Dahinter fehlt ein +.
Außerdem:
- Die Einrahmung in '\n'.join(...) ist überflüssig, wenn du zeilenweise vorgehst.
- Momentan färbst du auch alles nach $i=n/2$ rot, weil du die Färbung nicht zurücksetzt.
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.6, vom Themenstarter, eingetragen 2022-01-14
|
\quoteon(2022-01-14 23:08 - zippy in Beitrag No. 5)
\quoteon(2022-01-14 22:51 - mathletic in Beitrag No. 4)
Ich bekomme aber eine Fehlmeldung wegen esc('31;1;4').
\quoteoff
Dahinter fehlt ein +.
Außerdem:
- Die Einrahmung in '\n'.join(...) ist überflüssig, wenn du zeilenweise vorgehst.
- Momentan färbst du auch alles nach $i=n/2$ rot, weil du die Färbung nicht zurücksetzt.
\quoteoff
Also macht man es folgenderweise ?
\sourceon Python
\numberson
n = 10
for i in range(n) :
if (i == n/2) :
print(join(' '*(n-i)+esc('31;1;4')+'*'*(1+2*i)))
else :
print(join(' '*(n-i)+'*'*(1+2*i)))
\sourceoff
Ich bekomme aber ein Fehler bei der letzte Zeile. Was ist da falsch?
Könnte man es auch so machen dass die Kugeln von verschiedene Farben? Wie setzt man die Färbung zurück?
Ich habe ja jetzt nur eine Kugel rot gemacht, könnte man auch mehrere färben? Welche Bedingung müsste ich dann in der if schreiben?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.7, eingetragen 2022-01-14
|
\quoteon(2022-01-14 23:14 - mathletic in Beitrag No. 6)
Was ist da falsch?
\quoteoff
\quoteon(2022-01-14 23:08 - zippy in Beitrag No. 5)
- Die Einrahmung in '\n'.join(...) ist überflüssig
\quoteoff
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.8, vom Themenstarter, eingetragen 2022-01-14
|
\quoteon(2022-01-14 23:17 - zippy in Beitrag No. 7)
\quoteon(2022-01-14 23:14 - mathletic in Beitrag No. 6)
Was ist da falsch?
\quoteoff
\quoteon(2022-01-14 23:08 - zippy in Beitrag No. 5)
- Die Einrahmung in '\n'.join(...) ist überflüssig
\quoteoff
\quoteoff
A ja stimmt!
Also :
\sourceon Python
\numberson
n = 10
for i in range(n) :
if (i == n/2) :
print(' '*(n-i)+esc('38;5;2')+'*'*(1+2*i))
else :
print(' '*(n-i)+'*'*(1+2*i))
\sourceoff
Ich bekomme dann :
https://matheplanet.com/matheplanet/nuke/html/uploads/b/38039_TB.JPG
Wie kann man aber nur einzelne Kugeln farbig machen und nicht alle in eine Zeile? Mit eine weitere for oder eine weitere if?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.9, eingetragen 2022-01-15
|
\sourceon python
def esc(c):
return f'\033[{c}m'
def col_char(c):
return esc(101) + c + esc(0)
def col_str(s, f, m):
return ''.join(col_char(c) if f and not i % m else c for i, c in enumerate(s))
def print_tree(n):
print('\n'.join(' ' * (n-i) + col_str('*' * (1+2*i), not i % 2, 4) for i in range(n)))
print_tree(10)
\sourceoff

|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.10, vom Themenstarter, eingetragen 2022-01-15
|
\quoteon(2022-01-15 00:04 - zippy in Beitrag No. 9)
\sourceon python
def esc(c):
return f'\033[{c}m'
def col_char(c):
return esc(101) + c + esc(0)
def col_str(s, f, m):
return ''.join(col_char(c) if f and not i % m else c for i, c in enumerate(s))
def print_tree(n):
print('\n'.join(' ' * (n-i) + col_str('*' * (1+2*i), not i % 2, 4) for i in range(n)))
print_tree(10)
\sourceoff
\quoteoff
Wenn man die Farbe ändern will oder auch mehrere Farben benutzen will, dann ändert man die Funktion col_char(c), oder?
Macht man das z.B. mit eine if, also falls das c ein Vielfaches von einer bestimmten Zahl ist dann soll es rot sein, falls es ein Vielfaches einer anderen Zahl ist gelb, usw ?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.11, eingetragen 2022-01-15
|
\quoteon(2022-01-15 13:10 - mathletic in Beitrag No. 10)
Wenn man die Farbe ändern will oder auch mehrere Farben benutzen will, dann ändert man die Funktion col_char(c), oder?
\quoteoff
Ja: Du würdest ein weiteres Argument ergänzen, das die Farbe festlegt, und den Code dieser Farbe dann statt der Konstanten 101 verwenden.
\quoteon(2022-01-15 13:10 - mathletic in Beitrag No. 10)
Macht man das z.B. mit eine if, also falls das c ein Vielfaches von einer bestimmten Zahl ist dann soll es rot sein, falls es ein Vielfaches einer anderen Zahl ist gelb, usw ?
\quoteoff
c ist das zu färbende Zeichen, hier also immer der *. Du kannst aber die Farbe z.B. in Abhäbgigkeit von den beiden Zählern (das i in col_str, das die Zeichen zählt, und das i in print_tree, das die Zeilen zählt) wählen.
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.12, vom Themenstarter, eingetragen 2022-01-15
|
\quoteon(2022-01-15 19:47 - zippy in Beitrag No. 11)
Ja: Du würdest ein weiteres Argument ergänzen, das die Farbe festlegt, und den Code dieser Farbe dann statt der Konstanten 101 verwenden.
\quoteoff
Meinst du es folgenderweise ?
\sourceon Python
\numberson
def esc(c):
return f'\033[{c}m'
def col_char(c, f):
return esc(f) + c + esc(0)
def col_str(s, f, m):
for i, c in enumerate(s) :
if f and not i % m :
return ''.join(col_char(c, 104))
else :
return c
def print_tree(n):
print('\n'.join(' ' * (n-i) + col_str('*' * (1+2*i), not i % 2, 4) for i in range(n)))
print_tree(10)
\sourceoff
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.13, eingetragen 2022-01-15
|
Du hast in deinem letzten Beitrag die Funktion col_str jetzt so geändert, dass nur noch der * ganz links ausgegeben wird. Gefärbt wird aber immer noch mit nur einer Farbe. Ich dachte an so etwas:
\sourceon python
def esc(c):
return f'\033[{c}m'
def col_char(c, k):
codes = [101, 42]
return esc(codes[k]) + c + esc(0)
def col_str(s, j):
return ''.join(col_char(c, j % 4 // 2) if not i % 4 and not j % 2 else c for i, c in enumerate(s))
def print_tree(n):
print('\n'.join(' ' * (n-i) + col_str('*' * (1+2*i), i) for i in range(n)))
print_tree(10)
\sourceoff
Du könntest auch an col_str eine Funktion übergeben, die sagt, ob und mit welcher Farbe gefärbt werden soll:
\sourceon python
def col_str(s, f):
return ''.join(col_char(c, f(i)) if f(i) != None else c for i, c in enumerate(s))
def print_tree(n):
print('\n'.join(' ' * (n-i) +
col_str('*' * (1+2*i),
lambda j: i % 4 // 2 if not i % 2 and not j % 4 else None)
for i in range(n)))
\sourceoff
Und wenn du willst, kannst du auch geschachtelte Schleifen verwenden:
\sourceon python
def esc(c):
return f'\033[{c}m'
def col_char(c, k):
codes = [101, 42]
return esc(codes[k]) + c + esc(0)
def print_tree(n):
for i in range(n):
print(' ' * (n-i), end = '')
for j in range(1+2*i):
if not i % 2 and not j % 4:
print(col_char('*', i % 4 // 2), end = '')
else:
print('*', end = '')
print()
print_tree(10)
\sourceoff
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.14, vom Themenstarter, eingetragen 2022-01-16
|
\quoteon(2022-01-15 23:56 - zippy in Beitrag No. 13)
Du hast in deinem letzten Beitrag die Funktion col_str jetzt so geändert, dass nur noch der * ganz links ausgegeben wird. Gefärbt wird aber immer noch mit nur einer Farbe. Ich dachte an so etwas:
\sourceon python
def esc(c):
return f'\033[{c}m'
def col_char(c, k):
codes = [101, 42]
return esc(codes[k]) + c + esc(0)
def col_str(s, j):
return ''.join(col_char(c, j % 4 // 2) if not i % 4 and not j % 2 else c for i, c in enumerate(s))
def print_tree(n):
print('\n'.join(' ' * (n-i) + col_str('*' * (1+2*i), i) for i in range(n)))
print_tree(10)
\sourceoff
Du könntest auch an col_str eine Funktion übergeben, die sagt, ob und mit welcher Farbe gefärbt werden soll:
\sourceon python
def col_str(s, f):
return ''.join(col_char(c, f(i)) if f(i) != None else c for i, c in enumerate(s))
def print_tree(n):
print('\n'.join(' ' * (n-i) +
col_str('*' * (1+2*i),
lambda j: i % 4 // 2 if not i % 2 and not j % 4 else None)
for i in range(n)))
\sourceoff
Und wenn du willst, kannst du auch geschachtelte Schleifen verwenden:
\sourceon python
def esc(c):
return f'\033[{c}m'
def col_char(c, k):
codes = [101, 42]
return esc(codes[k]) + c + esc(0)
def print_tree(n):
for i in range(n):
print(' ' * (n-i), end = '')
for j in range(1+2*i):
if not i % 2 and not j % 4:
print(col_char('*', i % 4 // 2), end = '')
else:
print('*', end = '')
print()
print_tree(10)
\sourceoff
\quoteoff
Was genau prüft man bei der "if not i % 2 and not j % 4" ?
Wenn man mehr als 2 Farben hat ändert man die 2 bei "//2", oder?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.15, eingetragen 2022-01-16
|
\quoteon(2022-01-16 21:04 - mathletic in Beitrag No. 14)
Was genau prüft man bei der "if not i % 2 and not j % 4" ?
\quoteoff
Diese Aussage ist wahr, falls i gerade und j durch 4 teilbar ist.
\quoteon(2022-01-16 21:04 - mathletic in Beitrag No. 14)
Wenn man mehr als 2 Farben hat ändert man die 2 bei "//2", oder?
\quoteoff
Nein, die Division // 2 bleibt unverändert, da sie sich auf die 2 in if not i % 2 ... bezieht. Bei 3 Farben würdest du beispielsweise i % 6 // 2 schreiben. Vielleicht wird das klarer, wenn du es als i // 2 % 3 schreibst.
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.16, vom Themenstarter, eingetragen 2022-01-16
|
\quoteon(2022-01-16 21:29 - zippy in Beitrag No. 15)
\quoteon(2022-01-16 21:04 - mathletic in Beitrag No. 14)
Was genau prüft man bei der "if not i % 2 and not j % 4" ?
\quoteoff
Diese Aussage ist wahr, falls i gerade und j durch 4 teilbar ist.
\quoteon(2022-01-16 21:04 - mathletic in Beitrag No. 14)
Wenn man mehr als 2 Farben hat ändert man die 2 bei "//2", oder?
\quoteoff
Nein, die Division // 2 bleibt unverändert, da sie sich auf die 2 in if not i % 2 ... bezieht. Bei 3 Farben würdest du beispielsweise i % 6 // 2 schreiben. Vielleicht wird das klarer, wenn du es als i // 2 % 3 schreibst.
\quoteoff
Ich habe den Code mit n = 15 ausgeführt und die letzte Zeile enthält farbige Kugeln obwohl das j dann nicht teilbar ist von 4, oder? Warum is t das so?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.17, eingetragen 2022-01-16
|
\quoteon(2022-01-16 22:05 - mathletic in Beitrag No. 16)
Warum is t das so?
\quoteoff
\quoteon(2022-01-14 22:23 - mathletic in Beitrag No. 2)
Achso [...] weil die Nummerierung von $0$ anfängt und nicht von $1$.
\quoteoff
(Und weil der Zähler für die Zeilen nicht das j, sondern das i ist.)
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.18, vom Themenstarter, eingetragen 2022-01-17
|
Ok!
Wenn man statt Sterne beliebige ganze Zahlen im Baum haben wollen, ändert man die print_tree dann folgenderweise ?
\sourceon Python
\numberson
def print_tree(n):
value = random()
print('\n'.join(' ' * (n-i) + col_str(value * (1+2*i), i) for i in range(n)))
\sourceoff
Ich bekomme eine Fehlmeldung dass das float nicht iterierbar ist. Wie macht man es dann?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.19, eingetragen 2022-01-17
|
Meinst du wirklich "beliebige ganze Zahlen" oder eher "zufällige Ziffern"?
Ersteres kann nicht funktionieren, weil solche Zahlen nicht alle gleich breit sind.
Für letzteres musst du dir eine zufällige Ziffer erzeugen und diese dann in einen String umwandeln: str(random.randint(0, 9)).
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.20, vom Themenstarter, eingetragen 2022-01-17
|
\quoteon(2022-01-17 18:35 - zippy in Beitrag No. 19)
Für letzteres musst du dir eine zufällige Ziffer erzeugen und diese dann in einen String umwandeln: str(random.randint(0, 9)).
\quoteoff
Achso, dann kommt in jede Zeile immer die gleiche Zahl, richtig? Man kann es nicht machen dass überall eine zufällige Ziffer kommt, oder?
|
Profil
|
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.21, eingetragen 2022-01-17
|
\quoteon(2022-01-17 18:41 - mathletic in Beitrag No. 20)
Man kann es nicht machen dass überall eine zufällige Ziffer kommt, oder?
\quoteoff
Doch. Du ersetzt...
\sourceon python
'*' * (1+2*i)
\sourceoff
... durch:
\sourceon python
''.join(str(z) for z in random.choices(range(10), k = 1+2*i))
\sourceoff
|
Profil
|
mathletic
Aktiv  Dabei seit: 11.11.2013 Mitteilungen: 1594
 | Beitrag No.22, vom Themenstarter, eingetragen 2022-01-17
|
\quoteon(2022-01-17 18:52 - zippy in Beitrag No. 21)
\quoteon(2022-01-17 18:41 - mathletic in Beitrag No. 20)
Man kann es nicht machen dass überall eine zufällige Ziffer kommt, oder?
\quoteoff
Doch. Du ersetzt...
\sourceon python
'*' * (1+2*i)
\sourceoff
... durch:
\sourceon python
''.join(str(z) for z in random.choices(range(10), k = 1+2*i))
\sourceoff
\quoteoff
Und wenn man den Code mit der geschachtelte Schleifen verwenden, macht man es folgenderweise?
\sourceon Python
\numberson
import random
def esc(c):
return f'\033[{c}m'
def col_char(c, k):
codes = [101, 42]
return esc(codes[k]) + c + esc(0)
def print_tree(n):
for i in range(n):
print(' ' * (n-i), end = '')
for j in range(1+2*i):
for z in random.choices(range(10), k = 1+2*i):
if not i % 2 and not j%4:
print(col_char(str(z), i % 4 // 2), end = '')
else:
print(str(z), end = '')
print()
print_tree(10)
\sourceoff
|
Profil
| Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen. |
zippy
Senior  Dabei seit: 24.10.2018 Mitteilungen: 3609
 | Beitrag No.23, eingetragen 2022-01-17
|
\quoteon(2022-01-17 22:31 - mathletic in Beitrag No. 22)
Und wenn man den Code mit der geschachtelte Schleifen verwenden, macht man es folgenderweise?
\quoteoff
Nein. random.choices(range(10), k = 1+2*i) liefert bereits eine Liste aus $1+2i$ zufälligen Ziffern. In der Schleife benötigst du aber lediglich eine einzelne Ziffer. Wie man ein Zeichen erzeugt, das genau einer Ziffer entspricht, hatte ich doch bereits in Beitrag Nr. 19 geschrieben: str(random.randint(0, 9))
\sourceon python
import random
def esc(c):
return f'\033[{c}m'
def col_char(c, k):
codes = [101, 42]
return esc(codes[k]) + c + esc(0)
def print_tree(n):
for i in range(n):
print(' ' * (n-i), end = '')
for j in range(1+2*i):
c = str(random.randint(0, 9))
if not i % 2 and not j % 4:
print(col_char(c, i % 4 // 2), end = '')
else:
print(c, end = '')
print()
print_tree(10)
\sourceoff
|
Profil
|
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2022 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|