Решение на Шеста задача от Марк Андонов

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

Към профила на Марк Андонов

Резултати

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

Код

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.code
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 :code
def initialize(ascii_canvas)
@code = ascii_canvas
end
end
class HTML
attr_accessor :code
def initialize(width)
@code = 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

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

..............

Finished in 0.01221 seconds
14 examples, 0 failures

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

Марк обнови решението на 02.12.2015 11:17 (преди над 8 години)

+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

Марк обнови решението на 02.12.2015 11:24 (преди над 8 години)

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
+ @ascii = ascii_canvas.code
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
+ attr_accessor :code
def initialize(ascii_canvas)
- @ascii = ascii_canvas
+ @code = ascii_canvas
end
end
class HTML
- attr_accessor :ascii
+ attr_accessor :code
def initialize(width)
- @ascii = width
+ @code = 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

Здравей,

Имаш сериозни стилови проблеми:

  • Индентацията ти е буквално на вълни. Предполагам, че част от нещата са от неправилно настроен текстов редактор. Виж тази тема във форума, ако използваш Sublime Text.
  • Използваш ненужно методи, променящи in-place, като map!
  • Имаш лошо именувани методи и променливи
  • Има прекалено много конкатенация на низове в HTML. Очевидно знаеш за join, щом си го използвал.

Прегледай нашето решение за идеи.