Created
September 29, 2015 11:42
-
-
Save joncfoo/353ae9b69871d705c518 to your computer and use it in GitHub Desktop.
Elementary Cellular Automaton (http://mathworld.wolfram.com/ElementaryCellularAutomaton.html)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let print_row row = | |
Array.map print_char row |> ignore; | |
print_newline () | |
let rule n = function | |
| ('_', '_', '_') -> if n land 0b00000001 = 0 then '_' else '*' | |
| ('_', '_', '*') -> if n land 0b00000010 = 0 then '_' else '*' | |
| ('_', '*', '_') -> if n land 0b00000100 = 0 then '_' else '*' | |
| ('_', '*', '*') -> if n land 0b00001000 = 0 then '_' else '*' | |
| ('*', '_', '_') -> if n land 0b00010000 = 0 then '_' else '*' | |
| ('*', '_', '*') -> if n land 0b00100000 = 0 then '_' else '*' | |
| ('*', '*', '_') -> if n land 0b01000000 = 0 then '_' else '*' | |
| ('*', '*', '*') -> if n land 0b10000000 = 0 then '_' else '*' | |
| _ -> 'E' | |
let ngen len r g g' = | |
for i = 0 to len - 3 do | |
let a = rule r (Array.get g i, | |
Array.get g (i+1), | |
Array.get g (i+2)) | |
in Array.set g' (i+1) a | |
done | |
let run r gens = | |
let len = 43 in | |
let g = Array.make len '_' in | |
let g' = Array.make len '_' in | |
Array.set g (len / 2) '*'; | |
print_row g; | |
for i = 0 to gens do | |
if i mod 2 = 0 | |
then | |
(ngen len r g g'; | |
print_row g') | |
else | |
(ngen len r g' g; | |
print_row g) | |
done | |
let _ = | |
if Array.length Sys.argv != 3 | |
then ( | |
Printf.printf "Usage: %s <rule #> <# of generations>\n" (Array.get Sys.argv 0); | |
exit 1 | |
) | |
else ( | |
let rule_num = int_of_string (Array.get Sys.argv 1) in | |
let num_gens = int_of_string (Array.get Sys.argv 2) in | |
run rule_num num_gens | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment