Skip to content

Instantly share code, notes, and snippets.

@pcorey
Last active December 5, 2017 20:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pcorey/c46c715c46570a86a5e60cc488917cdf to your computer and use it in GitHub Desktop.
Save pcorey/c46c715c46570a86a5e60cc488917cdf to your computer and use it in GitHub Desktop.
Rule 30 using Elixir streams
# 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