Skip to content

Instantly share code, notes, and snippets.

@joncfoo
Created September 29, 2015 11:42
Show Gist options
  • Save joncfoo/353ae9b69871d705c518 to your computer and use it in GitHub Desktop.
Save joncfoo/353ae9b69871d705c518 to your computer and use it in GitHub Desktop.
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