Last active
December 5, 2017 20:39
-
-
Save pcorey/c46c715c46570a86a5e60cc488917cdf to your computer and use it in GitHub Desktop.
Rule 30 using Elixir streams
This file contains 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
# https://en.wikipedia.org/wiki/Rule_30 | |
defmodule Rule30 do | |
def stream(values) do | |
Stream.resource(fn -> {values, 0} end, &next_fun/1, fn _ -> :ok end) | |
end | |
defp next_fun({values, layer}) do | |
next = ([0, 0] ++ values ++ [0, 0]) | |
|> Enum.chunk_every(3, 1, :discard) | |
|> Enum.map(&rule/1) | |
{values |> Enum.map(&{layer, &1}), {next, layer + 1}} | |
end | |
defp rule([1, 1, 1]), do: 0 | |
defp rule([1, 1, 0]), do: 0 | |
defp rule([1, 0, 1]), do: 0 | |
defp rule([1, 0, 0]), do: 1 | |
defp rule([0, 1, 1]), do: 1 | |
defp rule([0, 1, 0]), do: 1 | |
defp rule([0, 0, 1]), do: 1 | |
defp rule([0, 0, 0]), do: 0 | |
end | |
Rule30.stream([1]) | |
|> Enum.take(9) | |
|> IO.inspect |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment