Марк обнови решението на 02.12.2015 11:17 (преди около 9 години)
+class TurtleGraphics
+ class Turtle
+
+ def initialize(rows, columns)
+ row_array = Array.new(columns, 0)
+ @canvas = (0...rows).map { |elem| row_array.clone }
+ @current_position = []
+ @direction = 0
+ end
+
+ def draw (ascii_canvas = nil, &block)
+ self.instance_eval &block if block_given?
+ check_movement
+ if (ascii_canvas == nil)
+ @canvas
+ elsif (ascii_canvas.instance_of? TurtleGraphics::Canvas::ASCII)
+ TurtleGraphics::Canvas.new(@canvas, ascii_canvas).to_s
+ else
+ TurtleGraphics::Canvas.new(@canvas, ascii_canvas).to_html
+ end
+ end
+
+ def move
+ check_movement
+ @current_position[0] += directions[@direction][0]
+ @current_position[1] += directions[@direction][1]
+ check
+ @canvas[@current_position[0]][@current_position[1]] += 1
+ end
+
+ def check_movement
+ if (@current_position == [])
+ @current_position = [0, 0]
+ @canvas[0][0] += 1
+ end
+ end
+ def check
+ @current_position[0] = 0 if @current_position[0] >= @canvas.size
+ @current_position[0] = @canvas.size - 1 if @current_position[0] < 0
+ @current_position[1] = 0 if @current_position[1] >= @canvas[0].size
+ @current_position[1] = @canvas[0].size - 1 if @current_position[1] < 0
+ end
+
+ def directions
+ [[0, 1], [1, 0], [0, -1], [-1, 0]]
+ end
+
+ def turn_right
+ @direction = (@direction + 1) % 4
+ end
+
+ def turn_left
+ @direction = (@direction - 1) % 4
+ end
+
+ def spawn_at(row, column)
+ @current_position[0] = row
+ @current_position[1] = column
+ @canvas[@current_position[0]][@current_position[1]] += 1
+ end
+
+ def look(orientation)
+ case orientation
+ when :right
+ @direction = 0
+ when :down
+ @direction = 1
+ when :left
+ @direction = 2
+ when :up
+ @direction = 3
+ end
+ end
+
+ end
+ class Canvas
+
+ def initialize(canvas, ascii_canvas)
+ @canvas = canvas.clone
+ @ascii = ascii_canvas.ascii
+ end
+
+ def max()
+ max = 1
+ @canvas.each do |row|
+ max_of_row = row.sort.last
+ max = max_of_row if max <= max_of_row
+ end
+ max
+ end
+
+ class ASCII
+ attr_accessor :ascii
+
+ def initialize(ascii_canvas)
+ @ascii = ascii_canvas
+ end
+ end
+
+ class HTML
+ attr_accessor :ascii
+
+ def initialize(width)
+ @ascii = width
+ end
+ end
+
+ def message(message)
+ message << "<!DOCTYPE html><html><head><title>Turtle graphics</title>"
+ message << "<style>table {border-spacing: 0;}"
+ message << "tr {padding: 0;}td {width: #{@ascii}px;height: #{@ascii}px"
+ message << ";background-color: black;padding: 0;}"
+ message << "</style></head><body><table>"
+ end
+ def to_html
+ max = max()
+ message = ""
+ message(message)
+ @canvas.each do |row|
+ message << "<tr>"
+ row.each do |value|
+ message << "<td style=#{'"'}opacity: "
+ message << "#{format('%.2f', value * 1.00 / max)}#{'"'}></td>\n"
+ end
+ message << "</tr>"
+ end
+ message << "</table></body></html>"
+ end
+ def set_symbol(symbol, max)
+ code = @ascii[0]
+ @ascii.each_with_index do |value, index|
+ code = @ascii[index + 1] if symbol * 1.0 / max > index * 1.0 / (@ascii.size - 1)
+ end
+ code
+ end
+
+ def to_s
+ canvas = @canvas.clone
+ max = max()
+ canvas.map! { |row| row.map! { |value| set_symbol(value, max) } }
+ canvas.map! { |row| row.join }
+ canvas.join("\n")
+ end
+ end
+end