Padovan sequence: Difference between revisions
Content added Content deleted
No edit summary |
(Add Elixir implementation) |
||
Line 1,088: | Line 1,088: | ||
Length of first 32 strings produced from the L-system = Padovan sequence |
Length of first 32 strings produced from the L-system = Padovan sequence |
||
</pre> |
|||
=={{header|Elixir}}== |
|||
{{trans|Ruby}} |
|||
<syntaxhighlight lang="Elixir"># Padovan sequence as a Stream |
|||
defmodule Padovan do |
|||
def stream do |
|||
Stream.resource( |
|||
fn -> {1, 1, 1} end, |
|||
fn {a, b, c} -> |
|||
next_value = a + b |
|||
{[a], {b, c, next_value}} |
|||
end, |
|||
fn _ -> :ok end |
|||
) |
|||
end |
|||
end |
|||
# Padovan floor function |
|||
defmodule PadovanFloorFunction do |
|||
@p 1.324717957244746025960908854 |
|||
@s 1.0453567932525329623 |
|||
def padovan_f(n), do: trunc((:math.pow(@p, n - 1) / @s) + 0.5) |
|||
end |
|||
# Calculate and print the first 20 elements of the Padovan sequence and the floor function |
|||
padovan_sequence = Padovan.stream() |> Enum.take(20) |
|||
padovan_floor_function = Enum.map(0..19, &PadovanFloorFunction.padovan_f(&1)) |
|||
IO.puts("Recurrence Padovan: #{inspect(padovan_sequence)}") |
|||
IO.puts("Floor function: #{inspect(padovan_floor_function)}") |
|||
# Check if the sequences are equal up to n |
|||
n = 63 |
|||
bool = Enum.map(0..(n-1), &PadovanFloorFunction.padovan_f(&1)) == Padovan.stream() |> Enum.take(n) |
|||
IO.puts("Recurrence and floor function are equal up to #{n}: #{bool}.") |
|||
# L-system generator as a Stream |
|||
defmodule LSystem do |
|||
def stream(axiom \\ "A", rules \\ %{"A" => "B", "B" => "C", "C" => "AB"}) do |
|||
Stream.iterate(axiom, fn string -> |
|||
string |
|||
|> String.graphemes() |
|||
|> Enum.map(&Map.get(rules, &1, "")) |
|||
|> Enum.join() |
|||
end) |
|||
end |
|||
end |
|||
# Calculate and print the first 10 elements of the L-system |
|||
l_system_sequence = LSystem.stream() |> Enum.take(10) |
|||
IO.puts("First 10 elements of L-system: #{l_system_sequence |> Enum.join(", ")}") |
|||
# Check if the sizes of the L-system strings match the Padovan sequence |
|||
n = 32 |
|||
l_system_sizes = LSystem.stream() |> Enum.take(n) |> Enum.map(&String.length/1) |
|||
bool = l_system_sizes == Padovan.stream() |> Enum.take(n) |
|||
IO.puts("Sizes of first #{n} L_system strings equal to recurrence Padovan? #{bool}.")</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
Recurrence Padovan: [1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151] |
|||
Floor function: [1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151] |
|||
Recurrence and floor function are equal up to 63: true. |
|||
First 10 elements of L-system: A, B, C, AB, BC, CAB, ABBC, BCCAB, CABABBC, ABBCBCCAB |
|||
Sizes of first 32 L_system strings equal to recurrence Padovan? true. |
|||
</pre> |
</pre> |
||