Решение на Трета задача от Кристиян Азманов
Към профила на Кристиян Азманов
Резултати
- 5 точки от тестове
- 1 отнета точка
- 4 точки общо
- 59 успешни тест(а)
- 10 неуспешни тест(а)
Код
Лог от изпълнението
.........FF.........F..F<!DOCTYPE html> <html> <head> <title>Rendered Canvas</title> <style type="text/css"> .canvas { font-size: 1px; line-height: 1px; } .canvas * { display: inline-block; width: 10px; height: 10px; border-radius: 5px; } .canvas i { background-color: #eee; } .canvas b { background-color: #333; } </style> </head> <body> <div class="canvas"> <i></i><i></i><i></i><i></i><br> <i></i><i></i><i></i><i></i><br> <i></i><i></i><i></i><i></i> </div> </body> </html> F<!DOCTYPE html> <html> <head> <title>Rendered Canvas</title> <style type="text/css"> .canvas { font-size: 1px; line-height: 1px; } .canvas * { display: inline-block; width: 10px; height: 10px; border-radius: 5px; } .canvas i { background-color: #eee; } .canvas b { background-color: #333; } </style> </head> <body> <div class="canvas"> <i></i><i></i><i></i><i></i><br> <i></i><i></i><i></i><i></i><br> <i></i><i></i><i></i><i></i> </div> </body> </html> F<!DOCTYPE html> <html> <head> <title>Rendered Canvas</title> <style type="text/css"> .canvas { font-size: 1px; line-height: 1px; } .canvas * { display: inline-block; width: 10px; height: 10px; border-radius: 5px; } .canvas i { background-color: #eee; } .canvas b { background-color: #333; } </style> </head> <body> <div class="canvas"> <i></i><i></i><i></i><i></i><br> <i></i><b></b><b></b><i></i><br> <i></i><i></i><i></i><i></i> </div> </body> </html> F<!DOCTYPE html> <html> <head> <title>Rendered Canvas</title> <style type="text/css"> .canvas { font-size: 1px; line-height: 1px; } .canvas * { display: inline-block; width: 10px; height: 10px; border-radius: 5px; } .canvas i { background-color: #eee; } .canvas b { background-color: #333; } </style> </head> <body> <div class="canvas"> <i></i><i></i><i></i><i></i><br> <i></i><b></b><b></b><i></i><br> <i></i><i></i><i></i><i></i> </div> </body> </html> F................................F..F..... Failures: 1) Graphics Canvas drawing of shapes and rasterization of points works for a single one Failure/Error: canvas.pixel_at?(2, 4).should be_true expected: true value got: false # /tmp/d20131223-4637-1cyax33/spec.rb:48: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) Graphics Canvas drawing of shapes and rasterization of points works for multiple ones Failure/Error: canvas.set_pixel 4, 4 NoMethodError: undefined method `[]=' for nil:NilClass # /tmp/d20131223-4637-1cyax33/solution.rb:246:in `set_pixel' # /tmp/d20131223-4637-1cyax33/spec.rb:57: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)>' 3) Graphics Canvas drawing of shapes and rasterization of rectangles works with rects with a zero width and height as a single point Failure/Error: Graphics::Rectangle.new(*args) NameError: undefined local variable or method `point_onew' for #<Graphics::Rectangle:0xba389478> # /tmp/d20131223-4637-1cyax33/solution.rb:53:in `initialize' # /tmp/d20131223-4637-1cyax33/spec.rb:615:in `new' # /tmp/d20131223-4637-1cyax33/spec.rb:615:in `make_rectangle' # /tmp/d20131223-4637-1cyax33/spec.rb:193: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)>' 4) Graphics Renderers Ascii renders simple canvases Failure/Error: canvas.set_pixel 3, 2 NoMethodError: undefined method `[]=' for nil:NilClass # /tmp/d20131223-4637-1cyax33/solution.rb:246:in `set_pixel' # /tmp/d20131223-4637-1cyax33/spec.rb:254:in `block (4 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) Graphics Renderers Html returns html Failure/Error: html.gsub(/\s+/, '').downcase NoMethodError: undefined method `gsub' for nil:NilClass # /tmp/d20131223-4637-1cyax33/spec.rb:314:in `normalize_html' # /tmp/d20131223-4637-1cyax33/spec.rb:272:in `block (4 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)>' 6) Graphics Renderers Html renders a grid of the size of the canvas Failure/Error: html.gsub(/\s+/, '').downcase NoMethodError: undefined method `gsub' for nil:NilClass # /tmp/d20131223-4637-1cyax33/spec.rb:314:in `normalize_html' # /tmp/d20131223-4637-1cyax33/spec.rb:309:in `html_rendering_of' # /tmp/d20131223-4637-1cyax33/spec.rb:281:in `block (4 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)>' 7) Graphics Renderers Html renders simple canvases Failure/Error: html.gsub(/\s+/, '').downcase NoMethodError: undefined method `gsub' for nil:NilClass # /tmp/d20131223-4637-1cyax33/spec.rb:314:in `normalize_html' # /tmp/d20131223-4637-1cyax33/spec.rb:309:in `html_rendering_of' # /tmp/d20131223-4637-1cyax33/spec.rb:291:in `block (4 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)>' 8) Graphics Renderers Html returns the same rendering when called twice Failure/Error: html.gsub(/\s+/, '').downcase NoMethodError: undefined method `gsub' for nil:NilClass # /tmp/d20131223-4637-1cyax33/spec.rb:314:in `normalize_html' # /tmp/d20131223-4637-1cyax33/spec.rb:302:in `block (4 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)>' 9) Graphics shapes Rectangle comparison for equality is true for rectangles defined with different diagonal corners Failure/Error: (a == b).should be_true expected: true value got: false # /tmp/d20131223-4637-1cyax33/spec.rb:540: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)>' 10) Graphics shapes Rectangle comparison for equality returns the same hash for rectangles defined with different diagonal corners Failure/Error: a.hash.should eq b.hash expected: -767886716 got: -390236355 (compared using ==) # /tmp/d20131223-4637-1cyax33/spec.rb:563: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)>' Finished in 0.08323 seconds 69 examples, 10 failures Failed examples: rspec /tmp/d20131223-4637-1cyax33/spec.rb:45 # Graphics Canvas drawing of shapes and rasterization of points works for a single one rspec /tmp/d20131223-4637-1cyax33/spec.rb:51 # Graphics Canvas drawing of shapes and rasterization of points works for multiple ones rspec /tmp/d20131223-4637-1cyax33/spec.rb:191 # Graphics Canvas drawing of shapes and rasterization of rectangles works with rects with a zero width and height as a single point rspec /tmp/d20131223-4637-1cyax33/spec.rb:252 # Graphics Renderers Ascii renders simple canvases rspec /tmp/d20131223-4637-1cyax33/spec.rb:271 # Graphics Renderers Html returns html rspec /tmp/d20131223-4637-1cyax33/spec.rb:280 # Graphics Renderers Html renders a grid of the size of the canvas rspec /tmp/d20131223-4637-1cyax33/spec.rb:287 # Graphics Renderers Html renders simple canvases rspec /tmp/d20131223-4637-1cyax33/spec.rb:298 # Graphics Renderers Html returns the same rendering when called twice rspec /tmp/d20131223-4637-1cyax33/spec.rb:536 # Graphics shapes Rectangle comparison for equality is true for rectangles defined with different diagonal corners rspec /tmp/d20131223-4637-1cyax33/spec.rb:559 # Graphics shapes Rectangle comparison for equality returns the same hash for rectangles defined with different diagonal corners
История (17 версии и 9 коментара)
Кристиян обнови решението на 15.12.2013 21:33 (преди почти 11 години)
Кристиян обнови решението на 15.12.2013 21:49 (преди почти 11 години)
Кристиян обнови решението на 15.12.2013 22:37 (преди почти 11 години)
Кристиян обнови решението на 15.12.2013 23:48 (преди почти 11 години)
Кристиян обнови решението на 16.12.2013 00:05 (преди почти 11 години)
Кристиян обнови решението на 16.12.2013 00:05 (преди почти 11 години)
Имаш сериозни проблеми с идентацията и спазването на конвенциите. Постарай се да ги оправиш във финалното си решение, в противен случай ще бъда принуден да ти взема наказателно точки.
Ако имаш нужда от помощ с редактора, питай във форума.
Кристиян обнови решението на 18.12.2013 21:22 (преди почти 11 години)
Не знам повече, какво да правя с идентацията. Щом решението ми е прието на сайта, това не означава ли, че е окей?
Просто когато правя влагане давам 2 спейса, между дефинираните методи добавям нов ред, между бинарните операции оставям място, спазвам начина на именуване на променливи и константи. Вече наистина почва да ме ядосва това нещо с идентацията, защото всеки път си мисля, че съм го разбрал и все нещо не е наред. Взимайте ми точки ако искате.
Кристиян обнови решението на 18.12.2013 21:30 (преди почти 11 години)
Няма нужда да се ядосваш и да хабиш нерви :) Просто редакторът ти явно не е добре настроен. Виж тази тема от минали години за повече подробности. Също, може да споделиш какъв редактор ползваш и да видим как да го настроим. Ако можеш, направо ме хвани някое междучасие и ще решим проблема.
И трябва да кажа, че последното решение, което си пратил, е с идеална идентация. Значи може :)
Ето ти още малко бележки по решението:
- Навсякъде, където ползваш
return
в това решение, няма нужда от експлицитенreturn
; пропуска се - Няма нужда да ползваш низовете "filled" и "empty", за да отбележиш двата типа пиксели; тук е подходящо или това да са символи, а не низове, или да ползваш нещо, което се оценява на истина за запълнени пиксели и нещо, което да се оценява на лъжа, за празни такива; този последен вариант би бил най-оптимален
-
Ред 55 – не се пише
then
вif
-ове, освен ако не са едноредови (а дори и едноредовите се ползват много рядко):if condition then something elsif another_condition then something_else else the_default_action
Методът
hash
трябва да връща число; ти си тръгнал по прав път, за да подсигуриш, че хешът ще е различна стойност за различни обекти, но не си стигнал докрай; от така конструирания обект, в твоя случай низ (на ред 15), трябва да получиш число; може да се възползваш от факта, чеString#hash
работи и да делегираш към него :)- Виждам, че ползваш двумерен масив, за да пазиш данните на паното; това ще работи, но ми се струва, че в Ruby може да измислиш и друго, по-оптимално представяне; засега може да го оставиш така и да си доимплементираш задачата, а ако ти остане време, виж дали ще можеш да измислиш нещо друго като вътрешно представяне на пано
Махнах return-ите, смених "filled" и "empty" с true, false.
Но, за hash() Нещо не го схващам това със стринга. Когато съм създал обект от клас Point, самият клас имплицитно не наследява ли от Object? Object#hash има дефиниран hash() метод, който ми се струва, че мога да ползвам чрез super.hash() в моя клас и някакси да добавя координатите на точката към това Fixnum число.
Относно hash
– да, Object#hash
работи и е наследено в Point
. По подразбиране, обаче, е дефинирано така, че за всяка инстанция ще имаш различен хеш. А ние искаме при различни инстанции, но с равни координати, да имаме еднакъв хеш.
Ако успееш да го направиш по твоя начин, окей. Нямам възражения :) Просто на мен не ми идва на ум как. Ако не успееш по твоя начин, може да помислиш как да се опреш на hash
методите от други класове в Ruby.
Кристиян обнови решението на 21.12.2013 02:29 (преди почти 11 години)
Кристиян обнови решението на 22.12.2013 12:00 (преди почти 11 години)
Кристиян обнови решението на 22.12.2013 14:56 (преди почти 11 години)
Кристиян обнови решението на 22.12.2013 17:53 (преди почти 11 години)
Кристиян обнови решението на 22.12.2013 21:21 (преди почти 11 години)
Кристиян обнови решението на 22.12.2013 21:59 (преди почти 11 години)
Кристиян обнови решението на 22.12.2013 22:23 (преди почти 11 години)
Кристиян обнови решението на 22.12.2013 22:36 (преди почти 11 години)
Принуден съм да ти отнема точка заради неспазване на стилови конвенции и идентация, въпреки, че те бях предупредил за тези неща:
- Проблем с идентацията на блок на ред 25-26, ред 55-56.
- Все още оставяш
then
като пишешif
. Не се слага, изпуска се. Виж предните ми коментари, - Не изпускаш скоби там, където трябва - дефинициите на методи, както и извикаване на методи без аргументи почти винаги се пишат без скоби; пример на ред 14, 36, 82, 83 и други.
- Слагай по един празен ред след
attr_*
дефиниции за четимост. -
array
е лошо име за променлива (ред 103). -
HTML_BEGIN
/HTML_END
трябва да се намират вRenderers::Html
, а не директно вRenderers
. Освен това е по-добре да се казватHTML_HEADER
/HTML_FOOTER
и щеше да ти е по-удобно да ползваш други кавички, например единични. - Не ми харесва че правиш gsub на true/false в render-методите. По-добре е да обходиш пискелите и да ги
map
-неш на стринговото им представяне и след това да join-неш резултата. - Виж как съм реализирал аз
hash
методите, макар че и твоят вариант ще работи. - Променливата
a
не е нито добре кръстена, нито има смисъл от нея (ред 98). - На ред 99 може да замениш
Graphics::Renderers::Ascii
съсself
, защото това е контекстът, в който се намираш. А знаеш, че в този случайself.
може да се изпусне. -
ascii_render_helper
е лошо име. Например, нещо катоrender_line_to_string
щеше да е по-подходящо. - Вероятно си видял, но имаш
puts
в кода, а това е грешно (в HTML renderer-а). Не трябва да вадиш неща на екрана, трябва да връщаш низове. - В Ruby няма практика да има думата
get_
в името на методите; тази дума просто генерира шум и не носи информация (визирамget_from_point
, което на свой ред също не ми се струва достатъчно ясно име, обясняващо какво прави този метод). - Модулът
Drawing
не ми харесва. Изглежда ми просто като купчина методи, нахвърляни там, за да се заобиколи ограничението за брой методи в клас. - Като викаш класов метод, не ползвай
::
. Ползва се само.
, т.е.Drawing.draw_line
(ред 255-256). -
Като дефинираш модул само с класови методи, по-удобно е да ползваш трик като
extend self
в началото на модула. Например така:module Drawing extend self def foo end def bar end end Drawing.foo Drawing.bar
Другият вариант е да ползваш
class << self
. И в двата случая няма да има нужда да пишешdef self.foo
за всеки метод в модула.Но, пак, модул, събиращ купчина методи в него рядко е добър дизайн.
if
-овете вCanvas#draw
трябва да ти подсказват това. А и дефиниции на методи катоdef self.fourth_type(x, y, length, a, b, canvas)
и тяло, което е сложно за разбиране също не помагат. Пак те реферирам към моето решение, за да видиш как съм адресирал аз този проблем с растеризацията и "чертането" върху пано. - На ред 254-256 скобите в
if
-овете не се слагат така. Ако трябва да сложиш скоби, сложи ги около извикването на метода, т.е.if figure.instance_of?(Line)
. - Трябва да има интервал след
{
и преди}
na red 242. - Можеше да ползваш хеш, а не списък от списъци за вътрешното представяне на пано. Пак, виж как съм го направил аз. Така нямаше да има нужда да инициализираш паното, защото
nil
се интерпретира като "лъжа" в Ruby. - Проверката на ред 250 е тафтология. Може да е само
@canvas[x][y]
.
Започнах да си оправям решението като оправям всички неща, които са описани в последният коментар, но ми остана само това, че когато правя
Вероятно си видял, но имаш puts в кода, а това е грешно (в HTML renderer-а). Не трябва да вадиш неща на екрана, трябва да връщаш низове.
Преправих си canvas-a да не съдържа true/false стойности, а го преправих на 'true'/'false'(стринговите им еквиваленти). Но когато почна да премахвам puts-овете, просто нищо не се изобразява на екрана(а уж е изпълним код). А и от тестовете, които са били пускани върху решението не мога да преценя дали това е било проблем. Другите неща г/д разбрах как да ги оправя и какъв е бил проблемът. Просто исках да попитам дали ще е проблем ако го оставя така?
Първо, стрингове "true"
/"false"
вместо самите true
/false
е по-лоша идея. Под "няма нужда да ползваш true
/false
" имах предвид, че може да ползваш true
/nil
. Виж нашето решение, например.
Второ, проблем ще е, ако оставиш puts
в кода си. Ако искаш нещо да се изведе на екрана, ще трябва да го направиш така:
canvas = Graphics::Canvas.new ...
puts canvas.render_as(Graphics::Renderers::Ascii)
Като имай предвид, че този код не трябва да го има в решението ти, това не е част от него. Това е примерен код, който "клиентът" на твоя код би използвал. Пак те реферирам към нашето решение, както и тези на колегите. Много е важно да ги прочетеш внимателно и да ги разбереш изцяло. Това е смисълът на тази задача. Ако там не разбираш нещо, питаш (или правиш списък с неясни неща и питаш). Днес може да ме разпиташ на лекцията, както и сряда.
Също, този коментар тук го видях по случайност. По-добре пиши в темата във форума, или ни пиши директно на нас.