Here’s my simple solution. Note that, rather than parsing options, it
merely expects rule, steps, state in that order.
require ‘enumerator’
def step(state,rule)
cur_arr = ([0,0] + state.split(//) + [0,0]).map{|s| s.to_i}
next_arr = []
cur_arr.each_cons(3) do |neighborhood|
##Checks the (neighborhood+1)th bit of rule
##E.g.: If neighborhood is [0,1,0], then inserts a 1 if the third
bit of rule is on
if (2**(neighborhood.join.to_i(2)))&rule != 0
next_arr << 1
else
next_arr << 0
end
end
next_arr.join
end
rule = ARGV[0].chomp.to_i
steps = ARGV[1].chomp.to_i
state = ARGV[2].chomp
result = [state]
steps.times do
state = step(state, rule)
result << state
end
length = result.last.size
output = result.map {|row|
([0]*((length-row.size)/2)+row.split(//)).map{|b|
b==“1” ? “X” : " "}.join
}
puts output