inspiriert durch diesen Artikel habe ich mir zwei Möglichkeiten erarbeitet, wie man so einen Baum in Python erstellen kann. Ich beziehe mich auf die dritte Variante.
Ich will eine Funktion `xmastree` haben, der man einen beliebigen Text übergeben kann, und dieser dann in folgender Form ausgegeben wird:
Code: Alles auswählen
....|....
...t|t...
..st|ts..
.est|tse.
test|tset
....|....
Hier mal meine erste Variante mit Python Standardfunktionen:
Code: Alles auswählen
def itree_traditional(text, fill):
space = fill * len(text)
first = lambda : u"{}|{}".format(space, space)
yield first()
for index, _ in enumerate(text, 1):
line = []
for count, char in enumerate(text):
if count < len(text)-index:
line.append(fill)
else:
line.append(char)
yield u"{}|{}".format("".join(line), "".join(reversed(line)))
yield first()
def xmastree(text, fill="."):
print u"\n".join(itree_traditional(text, fill))
Code: Alles auswählen
from itertools import islice, chain
def itree_islice(text, fill):
space = fill * len(text)
first = lambda : u"{}|{}".format(space, space)
yield first()
for index, _ in enumerate(text, 1):
offset = len(text) - index
left = "".join(chain(islice(space, offset),
islice(text, offset, len(text))))
yield "{}|{}".format(left, "".join(reversed(left)))
yield first()
def xmastree(text, fill="."):
print u"\n".join(itree_islice(text, fill))
Code: Alles auswählen
In [220]: xmastree("HappyChristmas", ".")
..............|..............
.............s|s.............
............as|sa............
...........mas|sam...........
..........tmas|samt..........
.........stmas|samts.........
........istmas|samtsi........
.......ristmas|samtsir.......
......hristmas|samtsirh......
.....Christmas|samtsirhC.....
....yChristmas|samtsirhCy....
...pyChristmas|samtsirhCyp...
..ppyChristmas|samtsirhCypp..
.appyChristmas|samtsirhCyppa.
HappyChristmas|samtsirhCyppaH
..............|..............
Bin gespannt auf andere Lösungen
¹ Wieso kann man in Code-Tags keine führenden Leerzeichen angeben? Diese werden in einigen Zeilen ignoriert