program faro_shuffle; loop for test in [8, 24, 52, 100, 1020, 1024, 10000] do print(lpad(str test, 5) + " cards: " + lpad(str cycle [1..test], 4)); end loop; op cycle(l); start := l; loop until l = start do l := shuffle l; n +:= 1; end loop; return n; end op; op shuffle(l); return [l(mapindex(i,#l)) : i in [1..#l]]; end op; proc mapindex(i, size); return if odd i then i div 2+1 else (i+size) div 2 end; end proc; end program;