2 N | NE | E | SE | S | SW | W | NW
6 [N; NE; E; SE; S; SW; W; NW]
16 let char_of_state = function
23 (* direction -> x, y *)
34 (* Hack to sleep less than 1 sec *)
35 let minisleep subsec =
36 ignore (Unix.select [] [] [] subsec)
40 Array.map (Array.map (fun _ -> Random.int 2)) (Array.make_matrix y x 0)
43 let print_board board =
48 (fun state -> print_char (char_of_state state))
55 let new_state = function
56 | 1, live_neighbors when live_neighbors < 2 -> 0
57 | 1, live_neighbors when live_neighbors < 4 -> 1
58 | 1, live_neighbors when live_neighbors > 3 -> 0
59 | 0, live_neighbors when live_neighbors = 3 -> 1
63 let filter_offsides width height neighbors =
65 (fun (x, y) -> x >= 0 && y >= 0 && x < width && y < height)
73 let off_x, off_y = offset d in
74 (x + off_x), (y + off_y)
79 let new_generation board =
80 let h = Array.length board
81 and w = Array.length board.(0) in
88 let neighbors = neighbors x y |> filter_offsides w h in
89 let states = List.map (fun (x, y) -> board.(y).(x)) neighbors in
90 let live_neighbors = List.fold_left (+) 0 states in
91 new_state (state, live_neighbors)
98 let rec life_loop board =
102 life_loop (new_generation board)
106 let x = int_of_string argv.(1)
107 and y = int_of_string argv.(2)
110 Random.init (int_of_float (Unix.time ()));
112 life_loop (init_board x y)
115 let () = main Sys.argv