Code bij Prettig Permuteren

bepijl

def bepijl(rij):
    return [(w, -1) for w in rij]

ontpijl

def ontpijl(toestand):
    return [w for w, _ in toestand]

is_mobiel

def is_mobiel(toestand, i):
    n = len(toestand)
    a, p = toestand[i]
    b = 0 <= i+p < n # heeft buur
    return b and toestand[i+p][0] < a

mobiel

def mobiel(toestand):
    return [i
            for i, _ in enumerate(toestand)
            if is_mobiel(toestand, i)
           ]

verwissel

def verwissel(toestand, i):
    a, p = toestand[i] # letter, pijl
    b = toestand[i+p] # buur met pijl
    toestand[i] = b
    toestand[i+p] = a, p

draai

def draai(toestand, a):
    for i, (b, p) in enumerate(toestand):
        if b > a:
            toestand[i] = b, -p

permuteer

def permuteer(rij):
    t = bepijl(rij) # toestand
    while True:
        print(''.join(ontpijl(t)))
        m = mobiel(t)
        if not m: # geen mobiele letters
            return
    im = max(m, key=lambda i: t[i][0])
    # im = index hoogste mobiele letter
    a = t[im][0]
    verwissel(t, im)
    draai(t, a)