Решение на Втора задача от Евгени Калчев

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

Към профила на Евгени Калчев

Резултати

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

Код

def move(snake, direction)
head=snake.dup
old_head=head[-1]
new_head=[]
old_head.each_index{ |i| new_head[i] = old_head[i] + direction[i] }
head.push(new_head).shift
head
end
def grow(snake, direction)
snake_body=snake.dup
old_body = snake_body[-1]
new_snake_body=[]
old_body.each_index{ |i| new_snake_body[i] = old_body[i] + direction[i] }
snake_body.push(new_snake_body)
end
def new_food(food, snake, dimensions)
//# TODO:
end
def obstacle_ahead?(snake, direction, dimensions)
head=snake.dup
head_direction=head[-1]
if ((head_direction.first + direction[0]) >= dimensions[:width])
true
end
if ((head_direction.last + direction[1]) >= dimensions[:height])
true
end
end
def danger?(snake, direction, dimensions)
head=snake.dup
head_position=head[-1]
if ((head_position.first + direction.first+1) >= dimensions[:width])
true
end
if ((head_position.last + direction.last+1) >= dimensions[:height])
true
end
end

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

......FFF...F.F.FFF.

Failures:

  1) #new_food generates food on empty position
     Failure/Error: expect(empty_positions).to include(next_food)
       expected [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]] to include //
     # /tmp/d20151026-15631-1l4zl2h/spec.rb:53: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) #new_food does not generate food outside of borders (width)
     Failure/Error: expect(next_food[0]).to be_between(0, dimensions[:width].pred)
     NoMethodError:
       undefined method `[]' for //:Regexp
     # /tmp/d20151026-15631-1l4zl2h/spec.rb:57: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) #new_food does not generate food outside of borders (height)
     Failure/Error: expect(next_food[1]).to be_between(0, dimensions[:height].pred)
     NoMethodError:
       undefined method `[]' for //:Regexp
     # /tmp/d20151026-15631-1l4zl2h/spec.rb:61: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)>'

  4) #obstacle_ahead? returns true if snake body ahead
     Failure/Error: expect(
       
       expected: true
            got: nil
       
       (compared using ==)
     # /tmp/d20151026-15631-1l4zl2h/spec.rb:83: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)>'

  5) #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: nil
       
       (compared using ==)
     # /tmp/d20151026-15631-1l4zl2h/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)>'

  6) #danger? returns true if obstacle in one turn
     Failure/Error: expect(danger?([[7, 6], [8, 6], [9, 6]], [1, 0], dimensions)).to eq true
       
       expected: true
            got: nil
       
       (compared using ==)
     # /tmp/d20151026-15631-1l4zl2h/spec.rb:109: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)>'

  7) #danger? returns true if obstacle in two turns
     Failure/Error: expect(danger?([[6, 6], [7, 6], [8, 6]], [1, 0], dimensions)).to eq true
       
       expected: true
            got: nil
       
       (compared using ==)
     # /tmp/d20151026-15631-1l4zl2h/spec.rb:113: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)>'

  8) #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: nil
       
       (compared using ==)
     # /tmp/d20151026-15631-1l4zl2h/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.01185 seconds
20 examples, 8 failures

Failed examples:

rspec /tmp/d20151026-15631-1l4zl2h/spec.rb:49 # #new_food generates food on empty position
rspec /tmp/d20151026-15631-1l4zl2h/spec.rb:56 # #new_food does not generate food outside of borders (width)
rspec /tmp/d20151026-15631-1l4zl2h/spec.rb:60 # #new_food does not generate food outside of borders (height)
rspec /tmp/d20151026-15631-1l4zl2h/spec.rb:82 # #obstacle_ahead? returns true if snake body ahead
rspec /tmp/d20151026-15631-1l4zl2h/spec.rb:92 # #obstacle_ahead? returns false if no obstacle ahead
rspec /tmp/d20151026-15631-1l4zl2h/spec.rb:108 # #danger? returns true if obstacle in one turn
rspec /tmp/d20151026-15631-1l4zl2h/spec.rb:112 # #danger? returns true if obstacle in two turns
rspec /tmp/d20151026-15631-1l4zl2h/spec.rb:116 # #danger? returns false if obstacle in three turns

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

Евгени обнови решението на 18.10.2015 22:11 (преди над 9 години)

+
+def move(snake, direction)
+ snake_clone=Array.new(snake)
+ temp_array=snake_clone[snake.length-1]
+ push_array=[]
+ temp_array.each_index { |i| push_array[i] = temp_array[i] + direction[i] }
+ snake_clone.push(push_array).shift
+ snake_clone
+end
+def grow(snake, direction)
+ grow_snake=Array.new(snake)
+ work_snake = grow_snake[snake.length-1]
+ push_array=[]
+ work_snake.each_index{ |i| push_array[i] =work_snake[i] + direction[i] }
+ grow_snake.push(push_array)
+
+end
+def new_food(food, snake, dimensions)
+
+end
+def obstacle_ahead?(snake, direction, dimensions)
+ copy_snake=Array.new(snake)
+ work_snake=copy_snake[snake.length-1]
+ if ((work_snake[0]+direction[0])>=dimensions[:width])
+ true
+ end
+ if ((work_snake[1]+direction[1])>=dimensions[:height])
+ true
+ end
+end
+def danger?(snake, direction, dimensions)
+ copy_snake=Array.new(snake)
+ work_snake=copy_snake[snake.length-1]
+ if ((work_snake[0]+direction[0]+1)>=dimensions[:width])
+ true
+ end
+ if ((work_snake[1]+direction[1]+1)>=dimensions[:height])
+ true
+ end
+
+end

Решението ти противоречи с определени неща, за които сме говорили на лекции. Нарушаваш и конвенции.

Ето няколко конкретни забележки:

  • Липсват space-ове около оператори
  • Липсват празни редове между дефинициите на функциите
  • Array.new(snake)? На лекции споменахме за dup. По-добър вариант е.
  • Не даваш подходящи имена. Името трябва да описва добре. Да е свързано с проблема, който решаваш. В този ред на мисли temp_array и push_array не дават никаква информация освен някакви имплементационни детайли (които не ни интересуват особено). Например, temp_array=snake_clone[snake.length-1] ще носи много повече смисъл така: head = snake_clone.last
  • snake_clone[snake.length-1] -> snake_clone[-1] -> snake_clone.last
  • ...

Не знам дали работи правилно, но дори и да е така, най-вероятно ще ти вземем точки заради неспазване на конвенции и лошо именуване, ако не ги пооправиш до края на срока.

Евгени обнови решението на 19.10.2015 16:09 (преди над 9 години)

+
def move(snake, direction)
- snake_clone=Array.new(snake)
- temp_array=snake_clone[snake.length-1]
- push_array=[]
- temp_array.each_index { |i| push_array[i] = temp_array[i] + direction[i] }
- snake_clone.push(push_array).shift
- snake_clone
+
+ head=snake.dup
+ old_head=head[-1]
+ new_head=[]
+
+ old_head.each_index{ |i| new_head[i] = old_head[i] + direction[i] }
+
+ head.push(new_head).shift
+ head
end
+
def grow(snake, direction)
- grow_snake=Array.new(snake)
- work_snake = grow_snake[snake.length-1]
- push_array=[]
- work_snake.each_index{ |i| push_array[i] =work_snake[i] + direction[i] }
- grow_snake.push(push_array)
+ snake_body=snake.dup
+ old_body = snake_body[-1]
+ new_snake_body=[]
+
+ old_body.each_index{ |i| new_snake_body[i] = old_body[i] + direction[i] }
+
+ snake_body.push(new_snake_body)
+
end
-def new_food(food, snake, dimensions)
+def new_food(food, snake, dimensions)
+//# TODO:
end
+
def obstacle_ahead?(snake, direction, dimensions)
- copy_snake=Array.new(snake)
- work_snake=copy_snake[snake.length-1]
- if ((work_snake[0]+direction[0])>=dimensions[:width])
- true
- end
- if ((work_snake[1]+direction[1])>=dimensions[:height])
- true
- end
+
+ head=snake.dup
+ head_direction=head[-1]
+ if ((head_direction.first + direction[0]) >= dimensions[:width])
+ true
+ end
+
+ if ((head_direction.last + direction[1]) >= dimensions[:height])
+ true
+ end
end
+
def danger?(snake, direction, dimensions)
- copy_snake=Array.new(snake)
- work_snake=copy_snake[snake.length-1]
- if ((work_snake[0]+direction[0]+1)>=dimensions[:width])
- true
- end
- if ((work_snake[1]+direction[1]+1)>=dimensions[:height])
- true
- end
+
+ head=snake.dup
+ head_position=head[-1]
+
+ if ((head_position.first + direction.first+1) >= dimensions[:width])
+ true
+ end
+
+ if ((head_position.last + direction.last+1) >= dimensions[:height])
+ true
+ end
end

Евгени обнови решението на 19.10.2015 16:10 (преди над 9 години)

def move(snake, direction)
head=snake.dup
old_head=head[-1]
new_head=[]
old_head.each_index{ |i| new_head[i] = old_head[i] + direction[i] }
head.push(new_head).shift
head
+
end
def grow(snake, direction)
snake_body=snake.dup
old_body = snake_body[-1]
new_snake_body=[]
old_body.each_index{ |i| new_snake_body[i] = old_body[i] + direction[i] }
snake_body.push(new_snake_body)
end
def new_food(food, snake, dimensions)
//# TODO:
end
def obstacle_ahead?(snake, direction, dimensions)
head=snake.dup
head_direction=head[-1]
if ((head_direction.first + direction[0]) >= dimensions[:width])
true
end
if ((head_direction.last + direction[1]) >= dimensions[:height])
true
end
+
end
def danger?(snake, direction, dimensions)
head=snake.dup
head_position=head[-1]
if ((head_position.first + direction.first+1) >= dimensions[:width])
true
end
if ((head_position.last + direction.last+1) >= dimensions[:height])
true
end
end