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