print "\e[?25l" rows, cols = `stty size`.split.map(&:to_i) drops = Array.new(cols) { rand(rows) } chars = ("0".."9").to_a + ("A".."Z").to_a + ("a".."z").to_a loop do cols.times do |i| 5.times do |line| y = (drops[i] + line) % rows print "\e[#{y};#{i+1}H" print "\e[32m#{chars.sample}\e[0m" end drops[i] = (drops[i] + 1) % rows end sleep 0.05 end at_exit { print "\e[?25h" }