Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Tannenbaum in Python
Autor
Universität/Hochschule Tannenbaum in Python
mathletic
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Themenstart: 2022-01-14 22:01

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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.1, eingetragen 2022-01-14 22:19

\sourceon >>> n = 10; print('\n'.join(' '*(n-i)+'*'*(1+2*i) for i in range(n))) * *** ***** ******* ********* *********** ************* *************** ***************** ******************* \sourceoff


   Profil
mathletic
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.2, vom Themenstarter, eingetragen 2022-01-14 22:23

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.3, eingetragen 2022-01-14 22:31

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.4, vom Themenstarter, eingetragen 2022-01-14 22:51

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.5, eingetragen 2022-01-14 23:08

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.6, vom Themenstarter, eingetragen 2022-01-14 23: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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.7, eingetragen 2022-01-14 23:17

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.8, vom Themenstarter, eingetragen 2022-01-14 23:24

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.9, eingetragen 2022-01-15 00:04

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.10, vom Themenstarter, eingetragen 2022-01-15 13:10

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.11, eingetragen 2022-01-15 19:47

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.12, vom Themenstarter, eingetragen 2022-01-15 23:32

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.13, eingetragen 2022-01-15 23:56

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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.14, vom Themenstarter, eingetragen 2022-01-16 21:04

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.15, eingetragen 2022-01-16 21:29

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.16, vom Themenstarter, eingetragen 2022-01-16 22:05

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.17, eingetragen 2022-01-16 22:06

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.18, vom Themenstarter, eingetragen 2022-01-17 18:03

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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.19, eingetragen 2022-01-17 18:35

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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.20, vom Themenstarter, eingetragen 2022-01-17 18:41

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.21, eingetragen 2022-01-17 18:52

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 11.11.2013
Mitteilungen: 1522
  Beitrag No.22, vom Themenstarter, eingetragen 2022-01-17 22:31

\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 Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 3138
  Beitrag No.23, eingetragen 2022-01-17 23:39

\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

Wechsel in ein anderes Forum:
 Suchen    
 
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]