Решение на Десета задача от Малина Демирова

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

Към профила на Малина Демирова

Резултати

  • 0 точки от тестове
  • 1 бонус точка
  • 1 точка общо
  • 0 успешни тест(а)
  • 1 неуспешни тест(а)

Код

REPOSITORY = 'https://github.com/MalinaD/ruby-retrospective-2015-2'
# Поне двадесет неща, които научих.
#
# Неща, които научих по - късно.
# 1. В предните задачи използвах следното my_value ||= some_value. Но ако го използвам, то е равно на следното
# my_value = my_value || some_value . Не е правилно да се използва, ако my_value = false, защото ще го презапише и ще
# използва другата стойност на some_value. Мога да го заменя със следното my_value = some_value unless defined? my_value
#
# По задача шест
# 0. По - добре научих как се извикват методи и променливи от наследници, как се подрежда кода по - четимо и правилно.
# 1. Хитро е използването на flatten метода. Като имам направена матрица matrix с редове и колони и извикам flatten,
# метода ми връща нов масив, който е линеен, т.е подрежда всички елементи в един ред. След това по - лесно мога да
# намеря най- големия елемент.
# 2. Научих как да извикам и подредя html страницата, вместо да я подам статично. Мога да я използвам като стринг и в
# него да извикам метод , който да сметне и допълни редовете от таблицата. <table>#{table(matrix)}</table>
# 3. Вначалото не можах да измисля много добър начин за да използвам посоките, не използвах и добре времето си. Но ми
# се стори хитро да ги пусна в константа със символи които не се променят. Така е по - лесно да задам конструктора с
# начална стойност @direction = :right. След това посоките ги минавам през един case @direction , за да сменя посоката
# по колони и редове. Доста по - бързо е от използване на if-else конструкция с много подусловия.
# 4. Разбрах, че е много лесно да се направи двуизмерна матрица от масиви като просто използвам Array.new(rows) { Array.
# new(columns, 0) }. Така ако се подаде Array.new(2) { Array.new(2, 0) } резултатът ще е [[0,0],[0,0]] - двумерен
# масив, запълнен с нули.
# 5.
#
# По задача седем
# 1. Първоначално мислех да постъпя с подадената дата така - current_year = @date.to_s.split('-').first (и същото за
# месеца и годината, което са ненужни сметки). Може най- бързо да направя следното в конструктора:
# @year, @month, @day, @repetition = date_string.split(/[-, +]/, 4)
# @year, @month, @day = [@year, @month, @day].map{|time| time.to_i }
# По този начин ги разделям и след това конвертирам до тип integer. Така всчко си знае кое подред е , без да пища
# много код.
# 2. Научих и как да добавя най - лесно 0 пред число, примерно ако искам да изпише 01.03.2016 , за деня и месеца мога
# да използвам sprintf '%02d, а за годината %04d .
# 3. Също научих как да местя таймера ако искам бележка да с еповтаря всеки месец, седмица или ден. В метода scheduled
# използвам case occurence , който да провери зададената стойност дали отговаря на m, w , d и след това да увеличи
# крайната дата по този начин when 'm' then end_date = current_date.month + 1
# 4. Този оператор също ми се стори интересен =~ . Сравнява дали даден стринг съдържа зададен regular expression/
# регулярен израз. Ако няма съвпадения ще върне nil (koето се равнява на лъжа) или позицията на търсения стринг.
# 5. Също научих, че @@ е клас променлива, може да се извиква тя и нейните стойности в класа и не може да се променя.
#
# По задача пет
# 1. Научих как да боравя с времевите променливи по -добре. На тази променлива задаваме времето по този начин:
# formatted_time = @date.getgm.strftime("%a %b %d %H:%M %Y %z") . С getgm връщаме обект с ново време в UTC, а с strftime променяме формата му в зависимост от
# подадения в скобите стринг. Стринга се подава в този формат, започвайки със %.
# 2. Разбрах как по - лесно да подам съобщение, false/true и обект, като задам всичко това в клас и после извиквам променливите като :
# Response.new "Created branch #{branch_name}.", true
# Същото мога да го запиша и със скоби като Response.new("Created branch #{branch_name}.", true)
# В класа Response правя конструктор, в който задавам, че обекта не е задължителен параметър. def initialize(message, success, result = nil)
#
# 3. Хеша също по - лесно мога да го задам по този начин:
# formatted_time = @date.getgm.strftime(Commit::TIME_FORMAT)
# @hash = Digest::SHA1.hexdigest "#{formatted_time}#{message}"
# Така първо променям как изглежда времето, след това извиквам и променям хеша.
# 4. Разбрах, че много лесно мога да махна чакащите комити и обекти, само с извикването на clear.
# 5. Разбрах, че е по - лесно да направя проверка с конструкция if- elsif-else отколкото с вложен if
#
#
# По задача осем
# 1. Научих, че е много лесно да провериш дали поле е празно като се ползва @cells.empty? .
# 2. Добра замяна на if конструктора е unless , при него тялото се изпълнява когато подаденото условие е лъжа. Примерно
# unless cell.row < @rows and cell.column < @cells[cell.row].size
# raise Error, "Cell '#{cell}' does not exist"
# end
# Тук проверяваме зададеното местоположение на клетка дали го има, ако не пускаме грешка. А проверката става спрямо съществуващите координати на матрицата -
# ако клетката е се намира в матрицата няма да се изпълни тялото на конструктора.
# 3. Лесно мога да си направя нов вид грешки, като наследя съществуващите методи по този начин :
# class Spreadsheet
# class Error < Exception
# end
# end
# 4. Не го разбрах добре в началото, но е много полезно да се използва reduce(&:+). Този метод комбинира всички елементи и ги подлага на операцията зададена
# след двуеточието. В примера reduce(&:+) - ще събере всички елементи.
# 5. Много удобно е извеждането в класове и проверката за грешки, като този пример:
# def mod(arguments)
# strong_assert('MOD', 2, arguments)
# arguments[0] % arguments[1]
# end
#
# def strong_assert(formula, expected, parameters)
# if parameters.size != expected
# raise Spreadsheet::Error, "Wrong number of arguments for '#{formula}': "\
# "expected #{expected}, got #{parameters.size}"
# end
# end
#
#Тук проверяваме дали подадените параметри са точен брой, ако не са връщаме грешка с модифицирано от нас съобщение. Ако всичко е наред продължаваме към
# изпълнение на избраната операция, в случая тя е %.

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

From https://github.com/fmi/ruby-retrospective-2015-2
 * branch            master     -> FETCH_HEAD
HEAD is now at 512294b Modify a test in task 8 to not include empty cells
Cloning into 'submission'...
HEAD is now at 0a89580 Task5: modify the Branch class, reconstruct
From /tmp/ruby-retrospective-2015-2/checker
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> upstream/master

Changes URL:
https://github.com/MalinaD/ruby-retrospective-2015-2/compare/7d3afe646ee...0a895809b4a

‘solutions/08.rb’ -> ‘/tmp/ruby-retrospective-2015-2/checker/solutions/08.rb’
‘solutions/05.rb’ -> ‘/tmp/ruby-retrospective-2015-2/checker/solutions/05.rb’
‘solutions/07.rb’ -> ‘/tmp/ruby-retrospective-2015-2/checker/solutions/07.rb’
‘solutions/06.rb’ -> ‘/tmp/ruby-retrospective-2015-2/checker/solutions/06.rb’
OK
...F

Failures:

  1) ObjectStore can remove objects
     Failure/Error: expect(repo.remove("object1")).to be_success("Added object1 for removal.", "content1")
       expected #<Response:0x007f0cc19947b8 @message="Added object1 for removal.", @success=true, @result=#<Change:0x007f0cc19954b0 @action=:add, @name="object1", @object="content1">> to be success "Added object1 for removal." and "content1"
     # ./specs/05_spec.rb:43:in `block (2 levels) in <top (required)>'

Finished in 0.00378 seconds
4 examples, 1 failure

Failed examples:

rspec ./specs/05_spec.rb:38 # ObjectStore can remove objects
F

Failures:

  1) ruby-retrospective-2015-2 covers the minimum requirements
     Failure/Error: system(command) or raise "Command failed for #{@solutions_repo}: #{command}"
     RuntimeError:
       Command failed for https://github.com/MalinaD/ruby-retrospective-2015-2: bundle exec rake check
     # /tmp/d20160131-21007-jyk1w7/spec.rb:107:in `execute'
     # /tmp/d20160131-21007-jyk1w7/spec.rb:82:in `block (3 levels) in solutions_pass_all_checks'
     # /tmp/d20160131-21007-jyk1w7/spec.rb:81:in `chdir'
     # /tmp/d20160131-21007-jyk1w7/spec.rb:81:in `block (2 levels) in solutions_pass_all_checks'
     # /tmp/d20160131-21007-jyk1w7/spec.rb:47:in `chdir'
     # /tmp/d20160131-21007-jyk1w7/spec.rb:47:in `block in solutions_pass_all_checks'
     # /tmp/d20160131-21007-jyk1w7/spec.rb:46:in `solutions_pass_all_checks'
     # /tmp/d20160131-21007-jyk1w7/spec.rb:20:in `ok?'
     # /tmp/d20160131-21007-jyk1w7/spec.rb:126:in `<top (required)>'

Finished in 0.00085 seconds
1 example, 1 failure

Failed examples:

rspec /tmp/d20160131-21007-jyk1w7/spec.rb:132 # ruby-retrospective-2015-2 covers the minimum requirements

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

Малина обнови решението на 27.01.2016 15:38 (преди почти 9 години)

+REPOSITORY = 'https://github.com/MalinaD/ruby-retrospective-2015-2'
+
+# Поне двадесет неща, които научих.
+#
+# Неща, които научих по - късно.
+# 1. В предните задачи използвах следното my_value ||= some_value. Но ако го използвам, то е равно на следното
+# my_value = my_value || some_value . Не е правилно да се използва, ако my_value = false, защото ще го презапише и ще
+# използва другата стойност на some_value. Мога да го заменя със следното my_value = some_value unless defined? my_value
+#
+# По задача шест
+# 0. По - добре научих как се извикват методи и променливи от наследници, как се подрежда кода по - четимо и правилно.
+# 1. Хитро е използването на flatten метода. Като имам направена матрица matrix с редове и колони и извикам flatten,
+# метода ми връща нов масив, който е линеен, т.е подрежда всички елементи в един ред. След това по - лесно мога да
+# намеря най- големия елемент.
+# 2. Научих как да извикам и подредя html страницата, вместо да я подам статично. Мога да я използвам като стринг и в
+# него да извикам метод , който да сметне и допълни редовете от таблицата. <table>#{table(matrix)}</table>
+# 3. Вначалото не можах да измисля много добър начин за да използвам посоките, не използвах и добре времето си. Но ми
+# се стори хитро да ги пусна в константа със символи които не се променят. Така е по - лесно да задам конструктора с
+# начална стойност @direction = :right. След това посоките ги минавам през един case @direction , за да сменя посоката
+# по колони и редове. Доста по - бързо е от използване на if-else конструкция с много подусловия.
+# 4. Разбрах, че е много лесно да се направи двуизмерна матрица от масиви като просто използвам Array.new(rows) { Array.
+# new(columns, 0) }. Така ако се подаде Array.new(2) { Array.new(2, 0) } резултатът ще е [[0,0],[0,0]] - двумерен
+# масив, запълнен с нули.
+# 5.
+#
+# По задача седем
+# 1. Първоначално мислех да постъпя с подадената дата така - current_year = @date.to_s.split('-').first (и същото за
+# месеца и годината, което са ненужни сметки). Може най- бързо да направя следното в конструктора:
+# @year, @month, @day, @repetition = date_string.split(/[-, +]/, 4)
+# @year, @month, @day = [@year, @month, @day].map{|time| time.to_i }
+# По този начин ги разделям и след това конвертирам до тип integer. Така всчко си знае кое подред е , без да пища
+# много код.
+# 2. Научих и как да добавя най - лесно 0 пред число, примерно ако искам да изпише 01.03.2016 , за деня и месеца мога
+# да използвам sprintf '%02d, а за годината %04d .
+# 3. Също научих как да местя таймера ако искам бележка да с еповтаря всеки месец, седмица или ден. В метода scheduled
+# използвам case occurence , който да провери зададената стойност дали отговаря на m, w , d и след това да увеличи
+# крайната дата по този начин when 'm' then end_date = current_date.month + 1
+# 4. Този оператор също ми се стори интересен =~ . Сравнява дали даден стринг съдържа зададен regular expression/
+# регулярен израз. Ако няма съвпадения ще върне nil (koето се равнява на лъжа) или позицията на търсения стринг.
+# 5. Също научих, че @@ е клас променлива, може да се извиква тя и нейните стойности в класа и не може да се променя.
+#
+# По задача пет
+# 1. Научих как да боравя с времевите променливи по -добре. На тази променлива задаваме времето по този начин:
+# formatted_time = @date.getgm.strftime("%a %b %d %H:%M %Y %z") . С getgm връщаме обект с ново време в UTC, а с strftime променяме формата му в зависимост от
+# подадения в скобите стринг. Стринга се подава в този формат, започвайки със %.
+# 2. Разбрах как по - лесно да подам съобщение, false/true и обект, като задам всичко това в клас и после извиквам променливите като :
+# Response.new "Created branch #{branch_name}.", true
+# Същото мога да го запиша и със скоби като Response.new("Created branch #{branch_name}.", true)
+# В класа Response правя конструктор, в който задавам, че обекта не е задължителен параметър. def initialize(message, success, result = nil)
+#
+# 3. Хеша също по - лесно мога да го задам по този начин:
+# formatted_time = @date.getgm.strftime(Commit::TIME_FORMAT)
+# @hash = Digest::SHA1.hexdigest "#{formatted_time}#{message}"
+# Така първо променям как изглежда времето, след това извиквам и променям хеша.
+# 4. Разбрах, че много лесно мога да махна чакащите комити и обекти, само с извикването на clear.
+# 5. Разбрах, че е по - лесно да направя проверка с конструкция if- elsif-else отколкото с вложен if
+#
+#
+# По задача осем

Малина обнови решението на 27.01.2016 16:10 (преди почти 9 години)

REPOSITORY = 'https://github.com/MalinaD/ruby-retrospective-2015-2'
# Поне двадесет неща, които научих.
#
# Неща, които научих по - късно.
# 1. В предните задачи използвах следното my_value ||= some_value. Но ако го използвам, то е равно на следното
# my_value = my_value || some_value . Не е правилно да се използва, ако my_value = false, защото ще го презапише и ще
# използва другата стойност на some_value. Мога да го заменя със следното my_value = some_value unless defined? my_value
#
# По задача шест
# 0. По - добре научих как се извикват методи и променливи от наследници, как се подрежда кода по - четимо и правилно.
# 1. Хитро е използването на flatten метода. Като имам направена матрица matrix с редове и колони и извикам flatten,
# метода ми връща нов масив, който е линеен, т.е подрежда всички елементи в един ред. След това по - лесно мога да
# намеря най- големия елемент.
# 2. Научих как да извикам и подредя html страницата, вместо да я подам статично. Мога да я използвам като стринг и в
# него да извикам метод , който да сметне и допълни редовете от таблицата. <table>#{table(matrix)}</table>
# 3. Вначалото не можах да измисля много добър начин за да използвам посоките, не използвах и добре времето си. Но ми
# се стори хитро да ги пусна в константа със символи които не се променят. Така е по - лесно да задам конструктора с
# начална стойност @direction = :right. След това посоките ги минавам през един case @direction , за да сменя посоката
# по колони и редове. Доста по - бързо е от използване на if-else конструкция с много подусловия.
# 4. Разбрах, че е много лесно да се направи двуизмерна матрица от масиви като просто използвам Array.new(rows) { Array.
# new(columns, 0) }. Така ако се подаде Array.new(2) { Array.new(2, 0) } резултатът ще е [[0,0],[0,0]] - двумерен
# масив, запълнен с нули.
# 5.
#
# По задача седем
# 1. Първоначално мислех да постъпя с подадената дата така - current_year = @date.to_s.split('-').first (и същото за
# месеца и годината, което са ненужни сметки). Може най- бързо да направя следното в конструктора:
# @year, @month, @day, @repetition = date_string.split(/[-, +]/, 4)
# @year, @month, @day = [@year, @month, @day].map{|time| time.to_i }
# По този начин ги разделям и след това конвертирам до тип integer. Така всчко си знае кое подред е , без да пища
# много код.
# 2. Научих и как да добавя най - лесно 0 пред число, примерно ако искам да изпише 01.03.2016 , за деня и месеца мога
# да използвам sprintf '%02d, а за годината %04d .
# 3. Също научих как да местя таймера ако искам бележка да с еповтаря всеки месец, седмица или ден. В метода scheduled
# използвам case occurence , който да провери зададената стойност дали отговаря на m, w , d и след това да увеличи
# крайната дата по този начин when 'm' then end_date = current_date.month + 1
# 4. Този оператор също ми се стори интересен =~ . Сравнява дали даден стринг съдържа зададен regular expression/
# регулярен израз. Ако няма съвпадения ще върне nil (koето се равнява на лъжа) или позицията на търсения стринг.
# 5. Също научих, че @@ е клас променлива, може да се извиква тя и нейните стойности в класа и не може да се променя.
#
# По задача пет
# 1. Научих как да боравя с времевите променливи по -добре. На тази променлива задаваме времето по този начин:
# formatted_time = @date.getgm.strftime("%a %b %d %H:%M %Y %z") . С getgm връщаме обект с ново време в UTC, а с strftime променяме формата му в зависимост от
# подадения в скобите стринг. Стринга се подава в този формат, започвайки със %.
# 2. Разбрах как по - лесно да подам съобщение, false/true и обект, като задам всичко това в клас и после извиквам променливите като :
# Response.new "Created branch #{branch_name}.", true
# Същото мога да го запиша и със скоби като Response.new("Created branch #{branch_name}.", true)
# В класа Response правя конструктор, в който задавам, че обекта не е задължителен параметър. def initialize(message, success, result = nil)
#
# 3. Хеша също по - лесно мога да го задам по този начин:
# formatted_time = @date.getgm.strftime(Commit::TIME_FORMAT)
# @hash = Digest::SHA1.hexdigest "#{formatted_time}#{message}"
# Така първо променям как изглежда времето, след това извиквам и променям хеша.
# 4. Разбрах, че много лесно мога да махна чакащите комити и обекти, само с извикването на clear.
# 5. Разбрах, че е по - лесно да направя проверка с конструкция if- elsif-else отколкото с вложен if
#
#
-# По задача осем
+# По задача осем
+# 1. Научих, че е много лесно да провериш дали поле е празно като се ползва @cells.empty? .
+# 2. Добра замяна на if конструктора е unless , при него тялото се изпълнява когато подаденото условие е лъжа. Примерно
+# unless cell.row < @rows and cell.column < @cells[cell.row].size
+# raise Error, "Cell '#{cell}' does not exist"
+# end
+# Тук проверяваме зададеното местоположение на клетка дали го има, ако не пускаме грешка. А проверката става спрямо съществуващите координати на матрицата -
+# ако клетката е се намира в матрицата няма да се изпълни тялото на конструктора.
+# 3. Лесно мога да си направя нов вид грешки, като наследя съществуващите методи по този начин :
+# class Spreadsheet
+# class Error < Exception
+# end
+# end
+# 4. Не го разбрах добре в началото, но е много полезно да се използва reduce(&:+). Този метод комбинира всички елементи и ги подлага на операцията зададена
+# след двуеточието. В примера reduce(&:+) - ще събере всички елементи.
+# 5. Много удобно е извеждането в класове и проверката за грешки, като този пример:
+# def mod(arguments)
+# strong_assert('MOD', 2, arguments)
+# arguments[0] % arguments[1]
+# end
+#
+# def strong_assert(formula, expected, parameters)
+# if parameters.size != expected
+# raise Spreadsheet::Error, "Wrong number of arguments for '#{formula}': "\
+# "expected #{expected}, got #{parameters.size}"
+# end
+# end
+#
+#Тук проверяваме дали подадените параметри са точен брой, ако не са връщаме грешка с модифицирано от нас съобщение. Ако всичко е наред продължаваме към
+# изпълнение на избраната операция, в случая тя е %.