2 n@(Integer traits) fannkuch
3 [| perm0 count maxFlipsCount m r flipsCount k k2 temp i j |
4 perm ::= Array newSize: n.
5 perm1 ::= Array newSize: n.
6 count ::= Array newSize: n.
7 maxPerm ::= Array newSize: n.
11 0 below: n do: [| :i | perm1 at: i put: i].
15 [count at: r - 1 put: r.
17 (perm1 at: 0) == 0 \/ [(perm1 at: m) == m] ifFalse:
19 [| :i | perm at: i put: (perm1 at: i)].
23 [k2 := k + 1 bitShift: -1.
27 perm at: i put: (perm at: k - i).
28 perm at: k - i put: temp].
31 flipsCount > maxFlipsCount ifTrue:
32 [maxFlipsCount := flipsCount.
34 [| :i | maxPerm at: i put: (perm1 at: i)]]].
35 [r = n ifTrue: [^ maxFlipsCount].
40 perm1 at: i put: (perm1 at: j).
42 perm1 at: r put: perm0.
43 count at: r put: (count at: r) - 1.
45 until: [(count at: r - 1) > 0].