Seite 2 von 2

Verfasst: Montag 9. November 2009, 22:40
von BlackJack
@Nocta: Ist auch nicht elegant, aber auch rekursiv:

Code: Alles auswählen

def group(xs, zs=''):
    if not xs:
        return ([zs] if zs else [])
    elif zs.startswith(xs[0]):
        return group(xs[1:], zs + xs[0])
    else:
        return ([zs] if zs else []) + group(xs[1:], xs[0])
:-)

Verfasst: Montag 9. November 2009, 22:49
von ms4py
Nocta hat geschrieben:Fehlt nicht noch was rekursives?
Da war doch schon die Prolog-Lösung ;)

Verfasst: Dienstag 10. November 2009, 00:27
von pillmuncher
Vielleicht so? Also ohne Akkumulator?

Code: Alles auswählen

def group(cs, i=0, j=1):
    if j >= len(cs):
        return [cs[i:j]] if cs else []
    elif cs[i] == cs[j]:
        return group(cs, i, j+1)
    else:
        return [cs[i:j]] + group(cs, j, j+1)
Ich habe auch versucht das lazy zu machen, aber das Ergebnis ist zu schrecklich um es zu zeigen. Dann lieber nochmal iterativ:

Code: Alles auswählen

def group(cs):
    if cs:
        i = 0
        for j in xrange(1, len(cs)):
            if cs[i] != cs[j]:
                yield cs[i:j]
                i = j
        yield cs[i:]
Ich glaube, jetzt genügt's dann.

Gruß,
Mick.

Verfasst: Mittwoch 11. November 2009, 02:03
von pillmuncher
Oder doch nicht... Hier noch zwei Versionen mit anonymer rekursiver Funktion:

Code: Alles auswählen

def Y(r): return (lambda f: f(f))(lambda f: r(lambda *xs, **ys: f(f)(*xs, **ys)))

group1 = Y(
    lambda g:
        lambda cs, i=0, j=1:
                ([cs[i:j]] if cs else [])
            if j >= len(cs) else
                (g(cs, i, j+1) if cs[i] == cs[j] else [cs[i:j]] + g(cs, j, j+1))
)

def group2(cs):
    if not cs:
        return []
    return Y(
        lambda g:
            lambda s, c, *cs:
                    (g(s + c, *cs) if c in s else [s][:bool(s)] + g(c, *cs))
                if cs else 
                    ([s + c] if c in s else [s][:bool(s)] + [c])
    )('', *cs)
Ja, ich weiß, wenn man das gesehen hat möchte man sich am liebsten die Augen mit Seife auswaschen.

Danke im Übrigen an sma, der den Y-Kombinator in Python gebaut hat. Ich habe ihn ein wenig angepasst, damit man ihn mit den üblichen *args, **kwargs verwenden kann.

Gruß,
Mick.

Verfasst: Mittwoch 11. November 2009, 18:58
von gerold
Hallo Mik!

Dir ist es vielleicht nicht bewusst, dass ich Python gerne mag weil man sich bei Python "einfach und durchschaubar" auf die Fahne geschrieben hat. Das was du da mit Python anstellst, ist irgendwie die falsche Richtung. Ein "gutes" Python-Programm ist lesbar. Je lesbarer, desto besser. -- Es kann ruhig etwas länger sein und mit Kommentaren versehen werden. Hauptsache verständlich und leicht nachvollziehbar.

mfg
Gerold
:-)

Verfasst: Mittwoch 11. November 2009, 20:05
von pillmuncher
gerold hat geschrieben:Das was du da mit Python anstellst, ist irgendwie die falsche Richtung.
Stimmt. Deswegen würde ich so etwas niemals im Ernst programmieren.

Gruß,
Mick.

Verfasst: Mittwoch 11. November 2009, 23:44
von BlackJack