Josephus — Animated Display

This variant displays an animation of the whole sordid process:

let delay = ref 0.1

(* graphical version *)
let josephus'graphic n m =
  let width = int_of_float (ceil (log10 (float n))) in
  let print display = 
    Array.iter (fun s -> print_string s; print_char ' ') display;
    print_char '\r';
    flush stdout;
    ignore (Unix.select [] [] [] !delay)
  in
  let rec j circle display =
    if Dllist.length circle = 1
    then print_newline ()
    else
      let dead = Dllist.skip circle (m-1) in
      let i = Dllist.get dead in
	display.(i-1) <- String.make width 'x';
	print display;
	j (Dllist.drop dead) display
  in
  let display = Array.make n "" in
    for i = 0 to n-1 do
      display.(i) <- sprintf "%*d" width (i+1)
    done;
    print display;
    j (Dllist.of_list (1--n)) display
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 
 1  2 xx  4  5  6  7  8  9 10 11 12 13 14 15 16 17 
 1  2 xx  4  5 xx  7  8  9 10 11 12 13 14 15 16 17 
 1  2 xx  4  5 xx  7  8 xx 10 11 12 13 14 15 16 17 
 1  2 xx  4  5 xx  7  8 xx 10 11 xx 13 14 15 16 17 
 1  2 xx  4  5 xx  7  8 xx 10 11 xx 13 14 xx 16 17 
xx  2 xx  4  5 xx  7  8 xx 10 11 xx 13 14 xx 16 17 
xx  2 xx  4 xx xx  7  8 xx 10 11 xx 13 14 xx 16 17 
xx  2 xx  4 xx xx  7  8 xx xx 11 xx 13 14 xx 16 17 
xx  2 xx  4 xx xx  7  8 xx xx 11 xx 13 xx xx 16 17 
xx xx xx  4 xx xx  7  8 xx xx 11 xx 13 xx xx 16 17 
xx xx xx  4 xx xx  7 xx xx xx 11 xx 13 xx xx 16 17 
xx xx xx  4 xx xx  7 xx xx xx 11 xx 13 xx xx xx 17 
xx xx xx  4 xx xx xx xx xx xx 11 xx 13 xx xx xx 17 
xx xx xx  4 xx xx xx xx xx xx 11 xx 13 xx xx xx xx 
xx xx xx  4 xx xx xx xx xx xx 11 xx xx xx xx xx xx 
xx xx xx xx xx xx xx xx xx xx 11 xx xx xx xx xx xx