One-dimensional cellular automata: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: use alternating quoted literal delimiters, used better idiomatic representation of cells.) |
(Added Elixir) |
||
Line 1,329: | Line 1,329: | ||
0000000000 |
0000000000 |
||
0000000000 |
0000000000 |
||
</pre> |
|||
=={{header|Elixir}}== |
|||
{{trans|Ruby}} |
|||
<lang elixir>defmodule RC do |
|||
def run(list, gen \\ 0) do |
|||
print(list, gen) |
|||
next = evolve(list) |
|||
if next == list, do: print(next, gen+1), else: run(next, gen+1) |
|||
end |
|||
defp evolve(list), do: evolve(Enum.concat([[0], list, [0]]), []) |
|||
defp evolve([a,b,c], next), do: Enum.reverse([life(a,b,c) | next]) |
|||
defp evolve([a,b,c|rest], next), do: evolve([b,c|rest], [life(a,b,c) | next]) |
|||
defp life(a,b,c), do: (if a+b+c == 2, do: 1, else: 0) |
|||
defp print(list, gen) do |
|||
str = "Generation #{gen}: " |
|||
IO.puts Enum.reduce(list, str, fn x,s -> s <> if x==0, do: ".", else: "#" end) |
|||
end |
|||
end |
|||
RC.run([0,1,1,1,0,1,1,0,1,0,1,0,1,0,1,0,0,1,0,0])</lang> |
|||
{{out}} |
|||
<pre> |
|||
Generation 0: .###.##.#.#.#.#..#.. |
|||
Generation 1: .#.#####.#.#.#...... |
|||
Generation 2: ..##...##.#.#....... |
|||
Generation 3: ..##...###.#........ |
|||
Generation 4: ..##...#.##......... |
|||
Generation 5: ..##....###......... |
|||
Generation 6: ..##....#.#......... |
|||
Generation 7: ..##.....#.......... |
|||
Generation 8: ..##................ |
|||
Generation 9: ..##................ |
|||
</pre> |
</pre> |
||