Решение на Втора задача от Милена Монова

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

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

Резултати

  • 5 точки от тестове
  • 1 отнета точка
  • 4 точки общо
  • 17 успешни тест(а)
  • 3 неуспешни тест(а)

Код

def next_step(snake, direction)
[snake.last.first + direction.first, snake.last.last + direction.last]
end
def move(snake, direction)
snake_clone = snake.clone
snake_clone.delete_at 0
snake_clone.push next_step snake_clone, direction
snake_clone
end
def grow(snake, direction)
snake_clone = snake.clone
snake_clone.push next_step(snake_clone, direction)
snake_clone
end
def on_field(location, dimensions)
on_field_by_width = location.first>0 && location.first<dimensions[:width]
on_field_by_height = location.last>0 && location.last<dimensions[:height]
if on_field_by_width and on_field_by_height
true
else
false
end
end
def obstacle_ahead?(snake, direction, dimensions)
snake_clone = snake.clone
next_step snake_clone, direction
location = snake_clone.last
if on_field location, dimensions and not snake_clone.include? location
false
else
true
end
end
def is_empty_field?(field, snake, food)
if snake.include? field or food.include? field
false
else
true
end
end
def new_food(food, snake, dimensions)
flag = false
while !flag
field = [rand(0..dimensions[:width]-1), rand(0..dimensions[:height]-1)]
flag = is_empty_field? field, snake, food
end
field
end
def danger?(snake, direction, dimensions)
first_step = obstacle_ahead? snake, direction, dimensions
snake_on_second_step = move snake, direction
second_step = obstacle_ahead? snake_on_second_step, direction, dimensions
if first_step or second_step
true
else
false
end
end

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

.F............F...F.

Failures:

  1) #move moves one-position-sized snake
     Failure/Error: expect(move([[2, 2]], [-1, 0])).to eq([[1, 2]])
     NoMethodError:
       undefined method `first' for nil:NilClass
     # /tmp/d20151026-15631-1n24y8r/solution.rb:2:in `next_step'
     # /tmp/d20151026-15631-1n24y8r/solution.rb:8:in `move'
     # /tmp/d20151026-15631-1n24y8r/spec.rb:12:in `block (2 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) #obstacle_ahead? returns false if no obstacle ahead
     Failure/Error: expect(obstacle_ahead?([[3, 4], [3, 5]], [0, 1], dimensions)).to eq false
       
       expected: false
            got: true
       
       (compared using ==)
     # /tmp/d20151026-15631-1n24y8r/spec.rb:93:in `block (2 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) #danger? returns false if obstacle in three turns
     Failure/Error: expect(danger?([[5, 6], [6, 6], [7, 6]], [1, 0], dimensions)).to eq false
       
       expected: false
            got: true
       
       (compared using ==)
     # /tmp/d20151026-15631-1n24y8r/spec.rb:117:in `block (2 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.01456 seconds
20 examples, 3 failures

Failed examples:

rspec /tmp/d20151026-15631-1n24y8r/spec.rb:11 # #move moves one-position-sized snake
rspec /tmp/d20151026-15631-1n24y8r/spec.rb:92 # #obstacle_ahead? returns false if no obstacle ahead
rspec /tmp/d20151026-15631-1n24y8r/spec.rb:116 # #danger? returns false if obstacle in three turns

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

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

+def next_step(snake, direction)
+ [snake.last.first + direction.first, snake.last.last + direction.last]
+end
+
+def move(snake, direction)
+ snake_clone = snake.clone
+ snake_clone.delete_at 0
+ snake_clone.push next_step snake_clone, direction
+ snake_clone
+end
+
+def grow(snake, direction)
+ snake_clone = snake.clone
+ snake_clone.push next_step(snake_clone, direction)
+ snake_clone
+end
+
+def on_field(location, dimensions)
+ on_field_by_width = location.first>0 && location.first<dimensions[:width]
+ on_field_by_height = location.last>0 && location.last<dimensions[:height]
+ if on_field_by_width and on_field_by_height
+ true
+ else
+ false
+ end
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ snake_clone = snake.clone
+ next_step snake_clone, direction
+ location = snake_clone.last
+ if on_field location, dimensions and not snake_clone.include? location
+ false
+ else
+ true
+ end
+end
+
+def is_empty_field?(field, snake, food)
+ unless snake.include? field or food.include? field
+ true
+ end
+ false
+end
+
+def new_food(food, snake, dimensions)
+ flag = true
+ while flag
+ field = [rand(0..dimensions[:width]-1), rand(0..dimensions[:height]-1)]
+ flag = is_empty_field? field, snake, food
+ end
+ field
+end

Милена обнови решението на 19.10.2015 14:43 (преди над 9 години)

def next_step(snake, direction)
[snake.last.first + direction.first, snake.last.last + direction.last]
end
def move(snake, direction)
snake_clone = snake.clone
snake_clone.delete_at 0
snake_clone.push next_step snake_clone, direction
snake_clone
end
def grow(snake, direction)
snake_clone = snake.clone
snake_clone.push next_step(snake_clone, direction)
snake_clone
end
def on_field(location, dimensions)
on_field_by_width = location.first>0 && location.first<dimensions[:width]
on_field_by_height = location.last>0 && location.last<dimensions[:height]
if on_field_by_width and on_field_by_height
true
else
false
end
end
def obstacle_ahead?(snake, direction, dimensions)
snake_clone = snake.clone
next_step snake_clone, direction
location = snake_clone.last
if on_field location, dimensions and not snake_clone.include? location
false
else
true
end
end
def is_empty_field?(field, snake, food)
- unless snake.include? field or food.include? field
+ if snake.include? field or food.include? field
+ false
+ else
true
end
- false
end
def new_food(food, snake, dimensions)
- flag = true
- while flag
+ flag = false
+ while !flag
field = [rand(0..dimensions[:width]-1), rand(0..dimensions[:height]-1)]
flag = is_empty_field? field, snake, food
end
field
end

Съжалявам, първото не работеше като хората. Имам и въпросче относно функцията danger? дава ми грешка: private method 'move' called for [[0,1] , [0,0]]: Array. Не разбирам защо ми дава, че е private и не ми дава да я ползвам, а с другите функции няма проблем.

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

def next_step(snake, direction)
- [snake.last.first + direction.first, snake.last.last + direction.last]
+[snake.last.first + direction.first, snake.last.last + direction.last]
end
def move(snake, direction)
- snake_clone = snake.clone
- snake_clone.delete_at 0
- snake_clone.push next_step snake_clone, direction
- snake_clone
+snake_clone = snake.clone
+snake_clone.delete_at 0
+snake_clone.push next_step snake_clone, direction
+snake_clone
end
def grow(snake, direction)
- snake_clone = snake.clone
- snake_clone.push next_step(snake_clone, direction)
- snake_clone
+snake_clone = snake.clone
+snake_clone.push next_step(snake_clone, direction)
+snake_clone
end
def on_field(location, dimensions)
- on_field_by_width = location.first>0 && location.first<dimensions[:width]
- on_field_by_height = location.last>0 && location.last<dimensions[:height]
- if on_field_by_width and on_field_by_height
- true
- else
- false
- end
+on_field_by_width = location.first>0 && location.first<dimensions[:width]
+on_field_by_height = location.last>0 && location.last<dimensions[:height]
+if on_field_by_width and on_field_by_height
+true
+else
+false
end
+end
def obstacle_ahead?(snake, direction, dimensions)
- snake_clone = snake.clone
- next_step snake_clone, direction
- location = snake_clone.last
- if on_field location, dimensions and not snake_clone.include? location
- false
- else
- true
- end
+snake_clone = snake.clone
+next_step snake_clone, direction
+location = snake_clone.last
+if on_field location, dimensions and not snake_clone.include? location
+false
+else
+true
end
+end
def is_empty_field?(field, snake, food)
- if snake.include? field or food.include? field
- false
- else
- true
- end
+if snake.include? field or food.include? field
+false
+else
+true
end
+end
def new_food(food, snake, dimensions)
- flag = false
- while !flag
- field = [rand(0..dimensions[:width]-1), rand(0..dimensions[:height]-1)]
- flag = is_empty_field? field, snake, food
+flag = false
+while !flag
+field = [rand(0..dimensions[:width]-1), rand(0..dimensions[:height]-1)]
+flag = is_empty_field? field, snake, food
+end
+field
+end
+
+def danger?(snake, direction, dimensions)
+ first_step = obstacle_ahead? snake, direction, dimensions
+ snake_on_second_step = move snake, direction
+ second_step = obstacle_ahead? snake_on_second_step, direction, dimensions
+ if first_step or second_step
+ true
+ else
+ false
end
- field
end

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

def next_step(snake, direction)
-[snake.last.first + direction.first, snake.last.last + direction.last]
+ [snake.last.first + direction.first, snake.last.last + direction.last]
end
def move(snake, direction)
-snake_clone = snake.clone
-snake_clone.delete_at 0
-snake_clone.push next_step snake_clone, direction
-snake_clone
+ snake_clone = snake.clone
+ snake_clone.delete_at 0
+ snake_clone.push next_step snake_clone, direction
+ snake_clone
end
def grow(snake, direction)
-snake_clone = snake.clone
-snake_clone.push next_step(snake_clone, direction)
-snake_clone
+ snake_clone = snake.clone
+ snake_clone.push next_step(snake_clone, direction)
+ snake_clone
end
def on_field(location, dimensions)
-on_field_by_width = location.first>0 && location.first<dimensions[:width]
-on_field_by_height = location.last>0 && location.last<dimensions[:height]
-if on_field_by_width and on_field_by_height
-true
-else
-false
+ on_field_by_width = location.first>0 && location.first<dimensions[:width]
+ on_field_by_height = location.last>0 && location.last<dimensions[:height]
+ if on_field_by_width and on_field_by_height
+ true
+ else
+ false
+ end
end
-end
def obstacle_ahead?(snake, direction, dimensions)
-snake_clone = snake.clone
-next_step snake_clone, direction
-location = snake_clone.last
-if on_field location, dimensions and not snake_clone.include? location
-false
-else
-true
+ snake_clone = snake.clone
+ next_step snake_clone, direction
+ location = snake_clone.last
+ if on_field location, dimensions and not snake_clone.include? location
+ false
+ else
+ true
+ end
end
-end
def is_empty_field?(field, snake, food)
-if snake.include? field or food.include? field
-false
-else
-true
+ if snake.include? field or food.include? field
+ false
+ else
+ true
+ end
end
-end
def new_food(food, snake, dimensions)
-flag = false
-while !flag
-field = [rand(0..dimensions[:width]-1), rand(0..dimensions[:height]-1)]
-flag = is_empty_field? field, snake, food
-end
-field
+ flag = false
+ while !flag
+ field = [rand(0..dimensions[:width]-1), rand(0..dimensions[:height]-1)]
+ flag = is_empty_field? field, snake, food
+ end
+ field
end
def danger?(snake, direction, dimensions)
first_step = obstacle_ahead? snake, direction, dimensions
snake_on_second_step = move snake, direction
second_step = obstacle_ahead? snake_on_second_step, direction, dimensions
if first_step or second_step
true
else
false
end
end
  • Много проблеми с whitespaces. Индентирай с два space-a. Слагай space-oве около оператори. Прочети style guide-a.
  • Зъл antipattern:

    if some_boolean_value
      true
    else
      false
    end
    
    # completely equivalent to
    some_boolean_value
    
  • flag е далече от домейна на решавания проблем. Можеше да използваш do while със същия успех. На полето по ширина?

  • Погледни Enumerable#drop.