class Screen attr_reader :width, :height, :pixels def initialize(width, height) @width, @height = width, height @pixels = Array.new(height) { Array.new(width, false) } end def to_s pixels.map {|row| row.map {|pixel| pixel ? ?# : ?. }.join }.join("\n") end def <<(instruction) case instruction when /rect (\d+)x(\d+)/ $1.to_i.times do |x| $2.to_i.times do |y| pixels[y][x] = true end end when /rotate column x=(\d+) by (\d+)/ col = pixels.map {|row| row[$1.to_i] }.rotate(-$2.to_i) pixels.each do |row| row[$1.to_i] = col.shift end when /rotate row y=(\d+) by (\d+)/ row = pixels[$1.to_i].rotate(-$2.to_i) pixels[$1.to_i] = row end end end if __FILE__ == $0 screen = Screen.new(50, 6) DATA.lines.each do |line| screen << line end puts screen puts screen.pixels.map {|row| row.count {|pixel| pixel }}.inject(:+) end require 'minitest' # require 'minitest/autorun' class TestScreen < Minitest::Test def test_screen screen = Screen.new(7, 3) assert_equal <<-PIXELS.chomp, screen.to_s ....... ....... ....... PIXELS screen << 'rect 3x2' assert_equal <<-PIXELS.chomp, screen.to_s ###.... ###.... ....... PIXELS screen << 'rotate column x=1 by 1' assert_equal <<-PIXELS.chomp, screen.to_s #.#.... ###.... .#..... PIXELS screen << 'rotate row y=0 by 4' assert_equal <<-PIXELS.chomp, screen.to_s ....#.# ###.... .#..... PIXELS screen << 'rotate column x=1 by 1' assert_equal <<-PIXELS.chomp, screen.to_s .#..#.# #.#.... .#..... PIXELS end end __END__ rect 1x1 rotate row y=0 by 20 rect 1x1 rotate row y=0 by 2 rect 1x1 rotate row y=0 by 3 rect 2x1 rotate row y=0 by 2 rect 1x1 rotate row y=0 by 3 rect 2x1 rotate row y=0 by 2 rect 1x1 rotate row y=0 by 4 rect 2x1 rotate row y=0 by 2 rect 1x1 rotate row y=0 by 2 rect 1x1 rotate row y=0 by 2 rect 1x1 rotate row y=0 by 3 rect 2x1 rotate row y=0 by 2 rect 1x1 rotate row y=0 by 5 rect 1x1 rotate row y=0 by 2 rect 1x1 rotate row y=0 by 6 rect 5x1 rotate row y=0 by 2 rect 1x3 rotate row y=2 by 8 rotate row y=0 by 8 rotate column x=0 by 1 rect 7x1 rotate row y=2 by 24 rotate row y=0 by 20 rotate column x=5 by 1 rotate column x=4 by 2 rotate column x=2 by 2 rotate column x=0 by 1 rect 7x1 rotate column x=34 by 2 rotate column x=22 by 1 rotate column x=15 by 1 rotate row y=2 by 18 rotate row y=0 by 12 rotate column x=8 by 2 rotate column x=7 by 1 rotate column x=5 by 2 rotate column x=2 by 1 rotate column x=0 by 1 rect 9x1 rotate row y=3 by 28 rotate row y=1 by 28 rotate row y=0 by 20 rotate column x=18 by 1 rotate column x=15 by 1 rotate column x=14 by 1 rotate column x=13 by 1 rotate column x=12 by 2 rotate column x=10 by 3 rotate column x=8 by 1 rotate column x=7 by 2 rotate column x=6 by 1 rotate column x=5 by 1 rotate column x=3 by 1 rotate column x=2 by 2 rotate column x=0 by 1 rect 19x1 rotate column x=34 by 2 rotate column x=24 by 1 rotate column x=23 by 1 rotate column x=14 by 1 rotate column x=9 by 2 rotate column x=4 by 2 rotate row y=3 by 5 rotate row y=2 by 3 rotate row y=1 by 7 rotate row y=0 by 5 rotate column x=0 by 2 rect 3x2 rotate column x=16 by 2 rotate row y=3 by 27 rotate row y=2 by 5 rotate row y=0 by 20 rotate column x=8 by 2 rotate column x=7 by 1 rotate column x=5 by 1 rotate column x=3 by 3 rotate column x=2 by 1 rotate column x=1 by 2 rotate column x=0 by 1 rect 9x1 rotate row y=4 by 42 rotate row y=3 by 40 rotate row y=1 by 30 rotate row y=0 by 40 rotate column x=37 by 2 rotate column x=36 by 3 rotate column x=35 by 1 rotate column x=33 by 1 rotate column x=32 by 1 rotate column x=31 by 3 rotate column x=30 by 1 rotate column x=28 by 1 rotate column x=27 by 1 rotate column x=25 by 1 rotate column x=23 by 3 rotate column x=22 by 1 rotate column x=21 by 1 rotate column x=20 by 1 rotate column x=18 by 1 rotate column x=17 by 1 rotate column x=16 by 3 rotate column x=15 by 1 rotate column x=13 by 1 rotate column x=12 by 1 rotate column x=11 by 2 rotate column x=10 by 1 rotate column x=8 by 1 rotate column x=7 by 2 rotate column x=5 by 1 rotate column x=3 by 3 rotate column x=2 by 1 rotate column x=1 by 1 rotate column x=0 by 1 rect 39x1 rotate column x=44 by 2 rotate column x=42 by 2 rotate column x=35 by 5 rotate column x=34 by 2 rotate column x=32 by 2 rotate column x=29 by 2 rotate column x=25 by 5 rotate column x=24 by 2 rotate column x=19 by 2 rotate column x=15 by 4 rotate column x=14 by 2 rotate column x=12 by 3 rotate column x=9 by 2 rotate column x=5 by 5 rotate column x=4 by 2 rotate row y=5 by 5 rotate row y=4 by 38 rotate row y=3 by 10 rotate row y=2 by 46 rotate row y=1 by 10 rotate column x=48 by 4 rotate column x=47 by 3 rotate column x=46 by 3 rotate column x=45 by 1 rotate column x=43 by 1 rotate column x=37 by 5 rotate column x=36 by 5 rotate column x=35 by 4 rotate column x=33 by 1 rotate column x=32 by 5 rotate column x=31 by 5 rotate column x=28 by 5 rotate column x=27 by 5 rotate column x=26 by 3 rotate column x=25 by 4 rotate column x=23 by 1 rotate column x=17 by 5 rotate column x=16 by 5 rotate column x=13 by 1 rotate column x=12 by 5 rotate column x=11 by 5 rotate column x=3 by 1 rotate column x=0 by 1