]> git.ameliathe1st.gay Git - cells.git/commitdiff
Simplification/généralisation des voisinages
authorAmélia Coutard-Sander <git@ameliathe1st.gay>
Thu, 19 Dec 2024 08:43:32 +0000 (09:43 +0100)
committerAmélia Coutard-Sander <git@ameliathe1st.gay>
Thu, 19 Dec 2024 08:43:54 +0000 (09:43 +0100)
automata/automata.ml
automata/automata.mli
automata/automata/brain.ml
automata/automata/cont.ml
automata/automata/life.ml
automata/automata/maze.ml
automata/automata/wireworld.ml

index 8ad1fc431281ee71f429d3943a5163c17c06dec4..8aac1c6921aa7e33cedb73723fa6387322fb0aba 100644 (file)
@@ -24,7 +24,11 @@ module type Automaton = sig
 
   val map : ('a -> 'b) -> 'a neighbours -> 'b neighbours
 
-  val transition : t neighbours -> t -> t
+  val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b neighbours -> 'a
+
+  val iter : ('a -> unit) -> 'a neighbours -> unit
+
+  val transition : t neighbours -> t
 
   val default : t
 
@@ -52,12 +56,12 @@ let set x y c ((d, cells) as board) =
           res.(x).(y) <- c;
           (d, res)
 
-let update (type t) (m : (module Automaton with type t = t)) ((d, cells) as board) =
+let update (type t) (m : (module Automaton with type t = t)) board =
         let module M = (val m) in
-        ( M.transition (M.map (Fun.const d) M.neighbours) d,
+        ( M.transition (M.map (Fun.const (fst board)) M.neighbours),
           Array.init 64 (fun x ->
-              Array.init 64 (fun y ->
-                  M.transition (M.map (fun (dx, dy) -> get (x + dx) (y + dy) board) M.neighbours) cells.(x).(y))) )
+              Array.init 64 (fun y -> M.transition (M.map (fun (dx, dy) -> get (x + dx) (y + dy) board) M.neighbours)))
+        )
 
 let automata =
         [
index 073e67c4475f72740e32dfa2799dd3286c7a726f..69aeab8060fe328dbf241fa0a2c075b8ba41c9f0 100644 (file)
@@ -24,7 +24,11 @@ module type Automaton = sig
 
   val map : ('a -> 'b) -> 'a neighbours -> 'b neighbours
 
-  val transition : t neighbours -> t -> t
+  val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b neighbours -> 'a
+
+  val iter : ('a -> unit) -> 'a neighbours -> unit
+
+  val transition : t neighbours -> t
 
   val default : t
 
index 1e46cb1f159911372748e94ee347ff4595bf1f17..15c6e20a6a022e80a0e2d4f3b84368ee1139a0cc 100644 (file)
@@ -17,15 +17,22 @@ let name = "Le Cerveau de Brian"
 
 type t = Off | On | Dying
 
-type 'a neighbours = 'a list
+type 'a neighbours = 'a * 'a list
 
-let neighbours = [(-1, -1); (-1, 0); (-1, 1); (0, -1); (0, 1); (1, -1); (1, 0); (1, 1)]
+let neighbours = ((0, 0), [(-1, -1); (-1, 0); (-1, 1); (0, -1); (0, 1); (1, -1); (1, 0); (1, 1)])
 
-let map = List.map
+let map f (c, cs) = (f c, List.map f cs)
 
-let transition l = function
+let fold_left f a (c, cs) = List.fold_left f (f a c) cs
+
+let iter f (c, cs) =
+        f c;
+        List.iter f cs
+
+let transition (c, cs) =
+        match c with
         | Off ->
-                let n = List.length (List.filter (( = ) On) l) in
+                let n = List.length (List.filter (( = ) On) cs) in
                 if n = 2 then On else Off
         | On -> Dying
         | Dying -> Off
index 58ec814692dc4df5e1d9162545ddc91e76572475..12ec040e4347eacbf36753d3f6b469fb43c959cc 100644 (file)
@@ -19,11 +19,15 @@ type t = float
 
 type 'a neighbours = 'a list
 
-let neighbours = [(-1, 0); (0, -1); (0, 1); (1, 0)]
+let neighbours = [(0, 0); (-1, 0); (0, -1); (0, 1); (1, 0)]
 
 let map = List.map
 
-let transition l c = List.fold_left ( +. ) c l /. 5.
+let fold_left = List.fold_left
+
+let iter = List.iter
+
+let transition l = List.fold_left ( +. ) 0. l /. 5.
 
 let default = 0.
 
index ba0b3c15beea43eda8577b22c7ffbd44f9037ab7..6876caea8ead3f2d0cc4c014fb71f32b8eb0cb89 100644 (file)
@@ -17,14 +17,20 @@ let name = "Conway's Game of Life"
 
 type t = Dead | Alive
 
-type 'a neighbours = 'a list
+type 'a neighbours = 'a * 'a list
 
-let neighbours = [(-1, -1); (-1, 0); (-1, 1); (0, -1); (0, 1); (1, -1); (1, 0); (1, 1)]
+let neighbours = ((0, 0), [(-1, -1); (-1, 0); (-1, 1); (0, -1); (0, 1); (1, -1); (1, 0); (1, 1)])
 
-let map = List.map
+let map f (c, cs) = (f c, List.map f cs)
 
-let transition l c =
-        let n = List.length (List.filter (( = ) Alive) l) in
+let fold_left f a (c, cs) = List.fold_left f (f a c) cs
+
+let iter f (c, cs) =
+        f c;
+        List.iter f cs
+
+let transition (c, cs) =
+        let n = List.length (List.filter (( = ) Alive) cs) in
         if n < 2 || n > 3 then Dead else if n == 3 then Alive else c
 
 let default = Dead
index f7bd10130970c3219b064550aa7a24d58f14787b..4e9addadbaddb1bfa0dda07285b5ff51f942906c 100644 (file)
@@ -17,14 +17,20 @@ let name = "Labyrinthe B3S12345"
 
 type t = Sol | Mur
 
-type 'a neighbours = 'a list
+type 'a neighbours = 'a * 'a list
 
-let neighbours = [(-1, -1); (-1, 0); (-1, 1); (0, -1); (0, 1); (1, -1); (1, 0); (1, 1)]
+let neighbours = ((0, 0), [(-1, -1); (-1, 0); (-1, 1); (0, -1); (0, 1); (1, -1); (1, 0); (1, 1)])
 
-let map = List.map
+let map f (c, cs) = (f c, List.map f cs)
 
-let transition l c =
-        let n = List.length (List.filter (( = ) Mur) l) in
+let fold_left f a (c, cs) = List.fold_left f (f a c) cs
+
+let iter f (c, cs) =
+        f c;
+        List.iter f cs
+
+let transition (c, cs) =
+        let n = List.length (List.filter (( = ) Mur) cs) in
         if n < 1 || n > 5 then Sol else if n == 3 then Mur else c
 
 let default = Sol
index f8e5e015e6a37e439ee8ea4b7e198010445e25a7..895944d556a52153645151903ca63642aa91e377 100644 (file)
@@ -17,16 +17,23 @@ let name = "Wireworld"
 
 type t = Empty | Conductor | Head | Tail
 
-type 'a neighbours = 'a list
+type 'a neighbours = 'a * 'a list
 
-let neighbours = [(-1, -1); (-1, 0); (-1, 1); (0, -1); (0, 1); (1, -1); (1, 0); (1, 1)]
+let neighbours = ((0, 0), [(-1, -1); (-1, 0); (-1, 1); (0, -1); (0, 1); (1, -1); (1, 0); (1, 1)])
 
-let map = List.map
+let map f (c, cs) = (f c, List.map f cs)
 
-let transition l = function
+let fold_left f a (c, cs) = List.fold_left f (f a c) cs
+
+let iter f (c, cs) =
+        f c;
+        List.iter f cs
+
+let transition (c, cs) =
+        match c with
         | Empty -> Empty
         | Conductor ->
-                let n = List.length (List.filter (( = ) Head) l) in
+                let n = List.length (List.filter (( = ) Head) cs) in
                 if n = 1 || n = 2 then Head else Conductor
         | Head -> Tail
         | Tail -> Conductor