Oh Tannenbaum, oh Tannenbaum...
Verfasst: Mittwoch 21. Dezember 2011, 21:38
Hallo zusammen,
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:
Die erste und die letzte Zeile sind bei mir der Einfachheit halber identisch. Es wird also in jeder Zeile ein Teil des Textes ausgegeben, links und rechts beginnend mit dem letzten Zeichen. In jeder Zeile kommt ein Buchstabe mehr vom Text dazu, bis das Text in der vorletzten Zeile komplett vorhanden ist. Der Stamm wird durch das Zeichen "|" symbolisiert. Die Funktion soll einen zusätzlichen Parameter bekommen, der den Füll-Character¹ enthält.
Hier mal meine erste Variante mit Python Standardfunktionen:
Dann hab ich mal in den `itertools` gewühlt und bin auf folgendes gekommen:
Beide Funktionen ergeben folgendes Ergebnis:
Wer hat noch etwas zu bieten? Egal ob pythonisch(er), kompakter oder spaßig? Oder evtl. in einer anderen Sprache?
Bin gespannt auf andere Lösungen
¹ Wieso kann man in Code-Tags keine führenden Leerzeichen angeben? Diese werden in einigen Zeilen ignoriert
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
