RosettaCodeData/Task/Hailstone-sequence/Ruby/hailstone-sequence-2.rb

39 lines
968 B
Ruby
Raw Permalink Normal View History

2013-04-10 21:29:02 -07:00
module Hailstone
2015-02-20 00:35:01 -05:00
ListNode = Struct.new(:value, :size, :succ) do
2013-04-10 21:29:02 -07:00
def each
node = self
while node
2015-02-20 00:35:01 -05:00
yield node.value
node = node.succ
2013-04-10 21:29:02 -07:00
end
end
end
2015-02-20 00:35:01 -05:00
@@sequence = {1 => ListNode[1,1]}
2013-04-10 21:29:02 -07:00
module_function
def sequence(n)
unless @@sequence[n]
2015-02-20 00:35:01 -05:00
m, ary = n, []
2013-04-10 21:29:02 -07:00
until succ = @@sequence[m]
ary << m
2015-02-20 00:35:01 -05:00
m = m.even? ? (m / 2) : (3 * m + 1)
2013-04-10 21:29:02 -07:00
end
ary.reverse_each do |m|
2015-02-20 00:35:01 -05:00
@@sequence[m] = succ = ListNode[m, succ.size + 1, succ]
2013-04-10 21:29:02 -07:00
end
end
@@sequence[n]
end
end
2015-02-20 00:35:01 -05:00
puts "for n = 27, show sequence length and first and last 4 elements"
hs27 = Hailstone.sequence(27).entries
p [hs27.size, hs27[0..3], hs27[-4..-1]]
2013-04-10 21:29:02 -07:00
# find the longest sequence among n less than 100,000
2015-02-20 00:35:01 -05:00
n = (1 ... 100_000).max_by{|n| Hailstone.sequence(n).size}
puts "#{n} has a hailstone sequence length of #{Hailstone.sequence(n).size}"
puts "the largest number in that sequence is #{Hailstone.sequence(n).max}"