RosettaCodeData/Task/First-class-environments/Ruby/first-class-environments-2.rb

37 lines
817 B
Ruby
Raw Permalink Normal View History

2013-04-10 21:29:02 -07:00
# Build environments
envs = (1..12).map do |n|
e = class Object
# This is a new lexical scope with no local variables.
# Create a new binding here.
binding
end
2014-01-17 05:32:22 +00:00
eval(<<-EOS, e).call(n)
2013-04-10 21:29:02 -07:00
n, cnt = nil, 0
proc {|arg| n = arg}
2014-01-17 05:32:22 +00:00
EOS
e
2013-04-10 21:29:02 -07:00
end
# Until all values are 1:
2014-01-17 05:32:22 +00:00
until envs.all? {|e| eval('n == 1', e)}
2013-04-10 21:29:02 -07:00
envs.each do |e|
2014-01-17 05:32:22 +00:00
eval(<<-EOS, e) # Use environment _e_
2013-04-10 21:29:02 -07:00
printf "%4s", n
2014-01-17 05:32:22 +00:00
if n > 1
cnt += 1 # Increment step count
n = if n.odd? # Calculate next hailstone value
2013-04-10 21:29:02 -07:00
n * 3 + 1
else
n / 2
end
end
2014-01-17 05:32:22 +00:00
EOS
2013-04-10 21:29:02 -07:00
end
puts
end
puts '=' * 48
envs.each do |e| # For each environment _e_
2014-01-17 05:32:22 +00:00
eval('printf "%4s", cnt', e) # print the step count
2013-04-10 21:29:02 -07:00
end
puts