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)