X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=002%2Fsrc%2Flife.ml;h=f7bf55e227d56ee9014a05bde923707953ffc482;hb=b161e882115ea83abb3146beb14e15e97ca9a023;hp=5e9d6f5d1c79f8822e78c1800447cee87083aafc;hpb=3ccae1a817e2ccc7b4d49d29d7462f4e8070f765;p=cellular-automata.git diff --git a/002/src/life.ml b/002/src/life.ml index 5e9d6f5..f7bf55e 100644 --- a/002/src/life.ml +++ b/002/src/life.ml @@ -6,6 +6,19 @@ let directions = [N; NE; E; SE; S; SW; W; NW] +let (|>) x f = f x + + +let char_dead = ' ' +let char_alive = 'o' + + +let char_of_state = function + | 0 -> char_dead + | 1 -> char_alive + | _ -> assert false + + let offset = function (* direction -> x, y *) | N -> 0, -1 @@ -28,7 +41,15 @@ let init_board x y = let print_board board = - Array.iter (fun row -> Array.iter (print_int) row; print_newline ()) board + Array.iter + ( + fun row -> + Array.iter + (fun state -> print_char (char_of_state state)) + row; + print_newline () + ) + board let new_state = function @@ -45,27 +66,29 @@ let filter_offsides width height neighbors = neighbors +let neighbors x y = + List.map + ( + fun d -> + let off_x, off_y = offset d in + (x + off_x), (y + off_y) + ) + directions + + let new_generation board = - let height = Array.length board - and width = Array.length board.(0) in + let h = Array.length board + and w = Array.length board.(0) in Array.mapi ( - fun i_y row -> + fun y row -> Array.mapi - (fun i_x state-> - let neighbors = - List.map - (fun d -> - let off_x, off_y = offset d in - (i_x + off_x), (i_y + off_y) - ) - directions - in - let neighbors = filter_offsides width height neighbors in - let states = List.map (fun (x, y) -> board.(y).(x)) neighbors in - let live_neighbors = List.fold_left (+) 0 states in - let state = new_state (state, live_neighbors) in - state + ( + fun x state-> + let neighbors = neighbors x y |> filter_offsides w h in + let states = List.map (fun (x, y) -> board.(y).(x)) neighbors in + let live_neighbors = List.fold_left (+) 0 states in + new_state (state, live_neighbors) ) row )