about summary refs log tree commit diff stats
path: root/js/baba-yaga/scratch/baba/conway-simple.baba
diff options
context:
space:
mode:
Diffstat (limited to 'js/baba-yaga/scratch/baba/conway-simple.baba')
-rw-r--r--js/baba-yaga/scratch/baba/conway-simple.baba116
1 files changed, 116 insertions, 0 deletions
diff --git a/js/baba-yaga/scratch/baba/conway-simple.baba b/js/baba-yaga/scratch/baba/conway-simple.baba
new file mode 100644
index 0000000..1054106
--- /dev/null
+++ b/js/baba-yaga/scratch/baba/conway-simple.baba
@@ -0,0 +1,116 @@
+// Conway's Game of Life - Simple Working Version
+
+// Get element at index from list (safe)
+at : xs i ->
+  when (i >= 0 and i < length xs) is
+    true then slice xs i (i + 1).0
+    _ then 0;
+
+// Get 2D element from grid (safe)
+get2d : grid row col ->
+  when (row >= 0 and row < length grid and col >= 0) is
+    true then 
+      with (rowData : at grid row) ->
+        when (col < length rowData) is
+          true then at rowData col
+          _ then 0
+    _ then 0;
+
+// Count living neighbors around position (row, col)
+countNeighbors : grid row col ->
+  with (
+    n1 : get2d grid (row - 1) (col - 1);
+    n2 : get2d grid (row - 1) col;
+    n3 : get2d grid (row - 1) (col + 1);
+    n4 : get2d grid row (col - 1);
+    n5 : get2d grid row (col + 1);
+    n6 : get2d grid (row + 1) (col - 1);
+    n7 : get2d grid (row + 1) col;
+    n8 : get2d grid (row + 1) (col + 1);
+  ) -> n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8;
+
+// Apply Game of Life rules to a single cell
+nextCellState : grid row col ->
+  with (
+    current : get2d grid row col;
+    neighbors : countNeighbors grid row col;
+  ) ->
+    when current is
+      1 then 
+        when (neighbors = 2 or neighbors = 3) is
+          true then 1
+          _ then 0
+      _ then
+        when (neighbors = 3) is
+          true then 1
+          _ then 0;
+
+// Generate next generation of the entire grid
+nextGeneration : grid ->
+  with (
+    height : length grid;
+    width : length (at grid 0);
+    // Create new grid row by row
+    newRow : rowIdx -> 
+      with (
+        newCol : colIdx -> nextCellState grid rowIdx colIdx;
+        cols : [0, 1, 2, 3, 4]; // Assuming 5x5 for now
+      ) -> map newCol cols;
+    rows : [0, 1, 2, 3, 4]; // Assuming 5x5 for now
+  ) -> map newRow rows;
+
+// Print a single row
+printRow : row ->
+  with (
+    cellToChar : cell -> when cell is 1 then "#" _ then ".";
+    chars : map cellToChar row;
+  ) -> io.out chars;
+
+// Print entire grid with title
+printGrid : grid title ->
+  with (
+    _ : io.out "";
+    _ : io.out title;
+    _ : io.out "-----";
+    _ : map printRow grid;
+  ) -> 0; // Return dummy value
+
+// Test patterns
+
+// Glider pattern (moves diagonally)
+glider : [
+  [0, 1, 0, 0, 0],
+  [0, 0, 1, 0, 0], 
+  [1, 1, 1, 0, 0],
+  [0, 0, 0, 0, 0],
+  [0, 0, 0, 0, 0]
+];
+
+// Blinker pattern (oscillates)
+blinker : [
+  [0, 0, 0, 0, 0],
+  [0, 1, 1, 1, 0],
+  [0, 0, 0, 0, 0],
+  [0, 0, 0, 0, 0],
+  [0, 0, 0, 0, 0]
+];
+
+// Run simulations
+io.out "Conway's Game of Life";
+io.out "====================";
+
+// Show initial glider
+dummy1 : printGrid glider "Glider - Generation 0";
+g1 : nextGeneration glider;
+dummy2 : printGrid g1 "Glider - Generation 1";
+g2 : nextGeneration g1;
+dummy3 : printGrid g2 "Glider - Generation 2";
+
+// Show blinker oscillation
+dummy4 : printGrid blinker "Blinker - Generation 0";
+b1 : nextGeneration blinker;
+dummy5 : printGrid b1 "Blinker - Generation 1";
+b2 : nextGeneration b1;
+dummy6 : printGrid b2 "Blinker - Generation 2";
+
+io.out "Done!";