Георги обнови решението на 30.11.2015 19:39 (преди около 9 години)
+class TurtleGraphics
+ class TurtleGraphics::Turtle
+ @@movement = { :right => [1, 0],
+ :up => [0, -1],
+ :left => [-1, 0],
+ :down => [0, +1] }
+
+ attr_accessor :canvas, :position, :orientation, :max_opacity
+
+ def initialize(rows, columns)
+ @canvas = []
+ for i in 1..rows
+ @canvas << Array.new(columns, 0)
+ end
+ @position, @canvas[0][0], @orientation, @max_opacity = [0, 0], 1, :right, 1
+ end
+
+ def draw(palette = nil, &block)
+ instance_eval(&block) if block_given?
+ palette.class == NilClass ? canvas : palette.paint(canvas, max_opacity)
+ end
+
+ def move
+ @position[1] += @@movement[@orientation][0]
+ @position[1] %= canvas[0].size
+ @position[0] += @@movement[@orientation][1]
+ @position[0] %= canvas.size
+ canvas[@position[0]][@position[1]] += 1
+ @max_opacity += 1 if max_opacity < canvas[@position[0]][@position[1]]
+ end
+
+ def turn_left
+ @orientation = case @orientation
+ when :right then :up
+ when :up then :left
+ when :left then :down
+ when :down then :right
+ end
+ end
+
+ def turn_right
+ 3.times { turn_left }
+ end
+
+ def spawn_at(row, column)
+ @canvas[0][0] , @position[0], @position[1] = 0, row, column
+
+ @canvas[row][column] = 1
+ end
+
+ def look(orientation)
+ @orientation = orientation
+ end
+ end
+
+ class TurtleGraphics::Canvas
+
+ class TurtleGraphics::Canvas::ASCII
+ attr_accessor :spectrum
+
+ def initialize(spectrum)
+ @spectrum = spectrum
+ end
+
+ def brush(number, max_opacity)
+ color = 0
+ until(number.fdiv(max_opacity)) <= color * (1.0) / (spectrum.size - 1)
+ color += 1
+ end
+ spectrum[color]
+ end
+
+ def paint(array, max_opacity)
+ array.map { |row| row.map { |number| brush(number, max_opacity) } }
+ .map { |x| x.join("\t") }.join("\n")
+ end
+ end
+
+ class TurtleGraphics::Canvas::HTML
+ attr_accessor :pixel_size
+
+ @@td_start = "<td style=\"opacity: "
+ @@td_end = "\"></td>"
+ @@body_start = "\n<body>\n<table>\n<tr>\n"
+ @@body_end = "\n</tr>\n</table>\n</body>\n</html>"
+
+ def initialize(pixel_size)
+ @pixel_size = pixel_size
+
+ @head = "<!DOCTYPE html>\n<html>\n<head>\n<title>Turtle graphics</title>"\
+ "\n<style>\ntable{border-spacing: 0;}\ntr {padding: 0;}\ntd"\
+ "{width: #{@pixel_size}px; height: #{pixel_size}px;\nbackground"\
+ "-color: black;\npadding: 0;}\n</style>\n</head>"
+ end
+
+ def brush(number, max_opacity)
+ number.fdiv(max_opacity).round(2)
+ end
+
+ def paint_row(row, max_opacity)
+ row.map { |number| @@td_start + "#{brush(number,max_opacity)}" + @@td_end }
+ end
+
+ def combine_rows(array, max_opacity)
+ array.map { |row| paint_row(row, max_opacity)}
+ .map { |row| row.join("\n")}
+ .join("\n</tr>\n<tr>\n")
+ end
+
+ def paint(array, max_opacity)
+ message = combine_rows(array, max_opacity)
+
+ print @head + @@body_start + "#{message}" + @@body_end
+ end
+ end
+ end
+end