Решение на Шеста задача от Слави Боянов

Обратно към всички решения

Към профила на Слави Боянов

Резултати

  • 4 точки от тестове
  • 0 бонус точки
  • 4 точки общо
  • 9 успешни тест(а)
  • 5 неуспешни тест(а)

Код

module TurtleGraphics
module Canvas
class ASKII
def initialize(list)
@ratio = list.map.
with_index { |item, index| [index.to_f / (list.size - 1), item] }
end
def generate_by(grid)
max = grid.flatten.max.to_f
grid.map { |row| row.map { |cell| pixel(cell / max) }.join}.join("\n")
end
def pixel(frequency)
@ratio.drop_while { |item| item[0] < frequency }[0][1]
end
end
class HTML
def initialize(pixel_size)
@size = pixel_size
end
def generate_by(grid)
result = "<!DOCTYPE html><html><head><title>Turtle graphics</title><style>"
result << "table{border-spacing: 0;}tr{padding: 0;}td{width: #{@size}px;"
result << "height: #{@size}px;background-color: black;padding: 0;}</style>"
result << "</head><body><table>#{table(grid)}</table></body></html>"
end
def table(grid)
grid.map { |row| make_row(row, grid) }.join
end
def make_row(row, grid)
max = grid.flatten.max.to_f
"<tr>" + row.map { |cell| pixel(cell / max) }.join + "</tr>"
end
def pixel(opasity)
"<td style=\"opacity: #{opasity.round(2)}\"></td>"
end
end
end
class Turtle
attr_accessor :grid
@@cours = {right: [0, 1], down: [1, 0], left: [0, -1], up: [-1, 0]}
def initialize (rows, columns)
@grid = []
rows.times { @grid.push(Array.new(columns, 0)) }
@position = {column: 0, row: 0}
@direction = @@cours.keys
end
def spawn_at(row, column)
@position[:column] = column
@position[:row] = row
end
def look(orientation)
@direction.rotate(1) unless @direction[0] == orientation
end
def turn_left
@direction = @direction.rotate(-1)
end
def turn_right
@direction = @direction.rotate(1)
end
def move
if current == 0
@grid[@position[:row]][@position[:column]] += 1
end
@position[:row] += @@cours[@direction[0]][0]
@position[:column] += @@cours[@direction[0]][1]
@position[:row] = @position[:row].modulo(@grid.size)
@position[:column] = @position[:column].modulo(@grid[0].size)
@grid[@position[:row]][@position[:column]] += 1
end
def draw(canvas = nil, &block)
instance_eval(&block)
if canvas
canvas.generate_by(@grid)
else
@grid
end
end
def current
@grid[@position[:row]][@position[:column]]
end
end
end

Лог от изпълнението

.......F.FFF.F

Failures:

  1) TurtleGraphics Turtle #draw #spawn_at moves the turtle to an exact location in the start
     Failure/Error: expect(canvas).to eq [[0, 0], [1, 0]]
       
       expected: [[0, 0], [1, 0]]
            got: [[0, 0], [0, 0]]
       
       (compared using ==)
     # /tmp/d20151203-5272-12otjv/spec.rb:93:in `block (5 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) TurtleGraphics Canvas::ASCII renders the proper symbols depending on the intensity
     Failure/Error: ascii_canvas = TurtleGraphics::Canvas::ASCII.new(['0', '1', '2', '3'])
     NameError:
       uninitialized constant TurtleGraphics::Canvas::ASCII
     # /tmp/d20151203-5272-12otjv/spec.rb:113:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) TurtleGraphics Canvas::ASCII can render with a different number of symbols
     Failure/Error: ascii_canvas = TurtleGraphics::Canvas::ASCII.new(['z', 'o', 't'])
     NameError:
       uninitialized constant TurtleGraphics::Canvas::ASCII
     # /tmp/d20151203-5272-12otjv/spec.rb:136:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) TurtleGraphics Canvas::HTML renders the proper template
     Failure/Error: expect(canvas.gsub(/\s+/, '')).to eq <<-HTML.gsub(/\s+/, '')
       
       expected: "<!DOCTYPEhtml><html><head><title>Turtlegraphics</title><style>table{border-spacing:0;}tr{padding:0;}td{width:5px;height:5px;background-color:black;padding:0;}</style></head><body><table><tr><tdstyle=\"opacity:1.00\"></td><tdstyle=\"opacity:1.00\"></td><tdstyle=\"opacity:1.00\"></td></tr><tr><tdstyle=\"opacity:0.00\"></td><tdstyle=\"opacity:0.00\"></td><tdstyle=\"opacity:0.00\"></td></tr><tr><tdstyle=\"opacity:0.00\"></td><tdstyle=\"opacity:0.00\"></td><tdstyle=\"opacity:0.00\"></td></tr></table></body></html>"
            got: "<!DOCTYPEhtml><html><head><title>Turtlegraphics</title><style>table{border-spacing:0;}tr{padding:0;}td{width:5px;height:5px;background-color:black;padding:0;}</style></head><body><table><tr><tdstyle=\"opacity:1.0\"></td><tdstyle=\"opacity:1.0\"></td><tdstyle=\"opacity:1.0\"></td></tr><tr><tdstyle=\"opacity:0.0\"></td><tdstyle=\"opacity:0.0\"></td><tdstyle=\"opacity:0.0\"></td></tr><tr><tdstyle=\"opacity:0.0\"></td><tdstyle=\"opacity:0.0\"></td><tdstyle=\"opacity:0.0\"></td></tr></table></body></html>"
       
       (compared using ==)
     # /tmp/d20151203-5272-12otjv/spec.rb:171:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) TurtleGraphics Canvas::HTML changes the opacity of a cell based on the times we have passed
     Failure/Error: expect(canvas.gsub(/\s+/, '')).to include <<-HTML.gsub(/\s+/, '')
       expected "<!DOCTYPEhtml><html><head><title>Turtlegraphics</title><style>table{border-spacing:0;}tr{padding:0;}td{width:5px;height:5px;background-color:black;padding:0;}</style></head><body><table><tr><tdstyle=\"opacity:1.0\"></td><tdstyle=\"opacity:0.67\"></td><tdstyle=\"opacity:0.0\"></td></tr><tr><tdstyle=\"opacity:0.33\"></td><tdstyle=\"opacity:0.33\"></td><tdstyle=\"opacity:0.0\"></td></tr><tr><tdstyle=\"opacity:0.0\"></td><tdstyle=\"opacity:0.0\"></td><tdstyle=\"opacity:0.0\"></td></tr></table></body></html>" to include "<table><tr><tdstyle=\"opacity:1.00\"></td><tdstyle=\"opacity:0.67\"></td><tdstyle=\"opacity:0.00\"></td></tr><tr><tdstyle=\"opacity:0.33\"></td><tdstyle=\"opacity:0.33\"></td><tdstyle=\"opacity:0.00\"></td></tr><tr><tdstyle=\"opacity:0.00\"></td><tdstyle=\"opacity:0.00\"></td><tdstyle=\"opacity:0.00\"></td></tr></table>"
     # /tmp/d20151203-5272-12otjv/spec.rb:242:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.01219 seconds
14 examples, 5 failures

Failed examples:

rspec /tmp/d20151203-5272-12otjv/spec.rb:91 # TurtleGraphics Turtle #draw #spawn_at moves the turtle to an exact location in the start
rspec /tmp/d20151203-5272-12otjv/spec.rb:112 # TurtleGraphics Canvas::ASCII renders the proper symbols depending on the intensity
rspec /tmp/d20151203-5272-12otjv/spec.rb:135 # TurtleGraphics Canvas::ASCII can render with a different number of symbols
rspec /tmp/d20151203-5272-12otjv/spec.rb:165 # TurtleGraphics Canvas::HTML renders the proper template
rspec /tmp/d20151203-5272-12otjv/spec.rb:227 # TurtleGraphics Canvas::HTML changes the opacity of a cell based on the times we have passed

История (1 версия и 0 коментара)

Слави обнови решението на 02.12.2015 12:38 (преди над 8 години)

+module TurtleGraphics
+ module Canvas
+ class ASKII
+ def initialize(list)
+ @ratio = list.map.
+ with_index { |item, index| [index.to_f / (list.size - 1), item] }
+ end
+
+ def generate_by(grid)
+ max = grid.flatten.max.to_f
+ grid.map { |row| row.map { |cell| pixel(cell / max) }.join}.join("\n")
+ end
+
+ def pixel(frequency)
+ @ratio.drop_while { |item| item[0] < frequency }[0][1]
+ end
+ end
+
+ class HTML
+ def initialize(pixel_size)
+ @size = pixel_size
+ end
+
+ def generate_by(grid)
+ result = "<!DOCTYPE html><html><head><title>Turtle graphics</title><style>"
+ result << "table{border-spacing: 0;}tr{padding: 0;}td{width: #{@size}px;"
+ result << "height: #{@size}px;background-color: black;padding: 0;}</style>"
+ result << "</head><body><table>#{table(grid)}</table></body></html>"
+ end
+
+ def table(grid)
+ grid.map { |row| make_row(row, grid) }.join
+ end
+
+ def make_row(row, grid)
+ max = grid.flatten.max.to_f
+ "<tr>" + row.map { |cell| pixel(cell / max) }.join + "</tr>"
+ end
+
+ def pixel(opasity)
+ "<td style=\"opacity: #{opasity.round(2)}\"></td>"
+ end
+ end
+ end
+
+ class Turtle
+ attr_accessor :grid
+
+ @@cours = {right: [0, 1], down: [1, 0], left: [0, -1], up: [-1, 0]}
+
+ def initialize (rows, columns)
+ @grid = []
+ rows.times { @grid.push(Array.new(columns, 0)) }
+ @position = {column: 0, row: 0}
+ @direction = @@cours.keys
+ end
+
+ def spawn_at(row, column)
+ @position[:column] = column
+ @position[:row] = row
+ end
+
+ def look(orientation)
+ @direction.rotate(1) unless @direction[0] == orientation
+ end
+
+ def turn_left
+ @direction = @direction.rotate(-1)
+ end
+
+ def turn_right
+ @direction = @direction.rotate(1)
+ end
+
+ def move
+ if current == 0
+ @grid[@position[:row]][@position[:column]] += 1
+ end
+ @position[:row] += @@cours[@direction[0]][0]
+ @position[:column] += @@cours[@direction[0]][1]
+ @position[:row] = @position[:row].modulo(@grid.size)
+ @position[:column] = @position[:column].modulo(@grid[0].size)
+ @grid[@position[:row]][@position[:column]] += 1
+ end
+
+ def draw(canvas = nil, &block)
+ instance_eval(&block)
+ if canvas
+ canvas.generate_by(@grid)
+ else
+ @grid
+ end
+ end
+
+ def current
+ @grid[@position[:row]][@position[:column]]
+ end
+ end
+end