38 lines
874 B
Ruby
38 lines
874 B
Ruby
$cache = {}
|
|
def selfReferentialSequence_cached(n, seen = [])
|
|
return $cache[n] if $cache.include? n
|
|
return [] if seen.include? n
|
|
|
|
digit_count = Array.new(10, 0)
|
|
n.to_s.chars.collect {|char| digit_count[char.to_i] += 1}
|
|
term = ''
|
|
9.downto(0).each do |d|
|
|
if digit_count[d] > 0
|
|
term += digit_count[d].to_s + d.to_s
|
|
end
|
|
end
|
|
term = term.to_i
|
|
$cache[n] = [n] + selfReferentialSequence_cached(term, [n] + seen)
|
|
end
|
|
|
|
limit = 1_000_000
|
|
max_len = 0
|
|
max_vals = []
|
|
|
|
1.upto(limit - 1) do |n|
|
|
seq = selfReferentialSequence_cached(n)
|
|
if seq.length > max_len
|
|
max_len = seq.length
|
|
max_vals = [n]
|
|
elsif seq.length == max_len
|
|
max_vals << n
|
|
end
|
|
end
|
|
|
|
puts "values: #{max_vals.inspect}"
|
|
puts "iterations: #{max_len}"
|
|
puts "sequence:"
|
|
selfReferentialSequence_cached(max_vals[0]).each_with_index do |val, idx|
|
|
puts "%2d %d" % [idx + 1, val]
|
|
end
|