You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
259 lines
5.1 KiB
259 lines
5.1 KiB
8 years ago
|
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
|