Решение на Трета задача от <анонимен> <анонимен>
Към профила на <анонимен> <анонимен>
Резултати
- 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 (преди почти 12 години)
<анонимен> обнови решението на 15.12.2013 21:49 (преди почти 12 години)
<анонимен> обнови решението на 15.12.2013 22:37 (преди почти 12 години)
<анонимен> обнови решението на 15.12.2013 23:48 (преди почти 12 години)
<анонимен> обнови решението на 16.12.2013 00:05 (преди почти 12 години)
<анонимен> обнови решението на 16.12.2013 00:05 (преди почти 12 години)
Имаш сериозни проблеми с идентацията и спазването на конвенциите. Постарай се да ги оправиш във финалното си решение, в противен случай ще бъда принуден да ти взема наказателно точки.
Ако имаш нужда от помощ с редактора, питай във форума.
<анонимен> обнови решението на 18.12.2013 21:22 (преди почти 12 години)
Не знам повече, какво да правя с идентацията. Щом решението ми е прието на сайта, това не означава ли, че е окей?
Просто когато правя влагане давам 2 спейса, между дефинираните методи добавям нов ред, между бинарните операции оставям място, спазвам начина на именуване на променливи и константи. Вече наистина почва да ме ядосва това нещо с идентацията, защото всеки път си мисля, че съм го разбрал и все нещо не е наред. Взимайте ми точки ако искате.
<анонимен> обнови решението на 18.12.2013 21:30 (преди почти 12 години)
Няма нужда да се ядосваш и да хабиш нерви :) Просто редакторът ти явно не е добре настроен. Виж тази тема от минали години за повече подробности. Също, може да споделиш какъв редактор ползваш и да видим как да го настроим. Ако можеш, направо ме хвани някое междучасие и ще решим проблема.
И трябва да кажа, че последното решение, което си пратил, е с идеална идентация. Значи може :)
Ето ти още малко бележки по решението:
- Навсякъде, където ползваш
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 (преди почти 12 години)
<анонимен> обнови решението на 22.12.2013 12:00 (преди почти 12 години)
<анонимен> обнови решението на 22.12.2013 14:56 (преди почти 12 години)
<анонимен> обнови решението на 22.12.2013 17:53 (преди почти 12 години)
<анонимен> обнови решението на 22.12.2013 21:21 (преди почти 12 години)
<анонимен> обнови решението на 22.12.2013 21:59 (преди почти 12 години)
<анонимен> обнови решението на 22.12.2013 22:23 (преди почти 12 години)
<анонимен> обнови решението на 22.12.2013 22:36 (преди почти 12 години)
Принуден съм да ти отнема точка заради неспазване на стилови конвенции и идентация, въпреки, че те бях предупредил за тези неща:
- Проблем с идентацията на блок на ред 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)
Като имай предвид, че този код не трябва да го има в решението ти, това не е част от него. Това е примерен код, който "клиентът" на твоя код би използвал. Пак те реферирам към нашето решение, както и тези на колегите. Много е важно да ги прочетеш внимателно и да ги разбереш изцяло. Това е смисълът на тази задача. Ако там не разбираш нещо, питаш (или правиш списък с неясни неща и питаш). Днес може да ме разпиташ на лекцията, както и сряда.
Също, този коментар тук го видях по случайност. По-добре пиши в темата във форума, или ни пиши директно на нас.
