RosettaCodeData/Task/Hailstone-sequence/Elixir/hailstone-sequence.elixir

24 lines
738 B
Text
Raw Permalink Normal View History

2013-10-27 22:24:23 +00:00
defmodule Hailstone do
2015-11-18 06:14:39 +00:00
require Integer
def step(1) , do: 0
def step(n) when Integer.is_even(n), do: div(n,2)
def step(n) , do: n*3 + 1
2013-10-27 22:24:23 +00:00
def sequence(n) do
2015-11-18 06:14:39 +00:00
Stream.iterate(n, &step/1) |> Stream.take_while(&(&1 > 0)) |> Enum.to_list
2013-10-27 22:24:23 +00:00
end
def run do
2015-11-18 06:14:39 +00:00
seq27 = sequence(27)
2013-10-27 22:24:23 +00:00
len27 = length(seq27)
2015-11-18 06:14:39 +00:00
repr = String.replace(inspect(seq27, limit: 4) <> inspect(Enum.drop(seq27,len27-4)), "][", ", ")
IO.puts "Hailstone(27) has #{len27} elements: #{repr}"
2013-10-27 22:24:23 +00:00
2015-11-18 06:14:39 +00:00
{len, start} = Enum.map(1..100_000, fn(n) -> {length(sequence(n)), n} end) |> Enum.max
IO.puts "Longest sequence starting under 100000 begins with #{start} and has #{len} elements."
2013-10-27 22:24:23 +00:00
end
end
Hailstone.run