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

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

Към профила на Славяна Монкова

Резултати

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

Код

def sum_of_two_lists(first_list, second_list)
[first_list, second_list].transpose.map {|a | a.inject(:+)}
end
def move(snake, direction)
new_snake = snake.dup
new_snake.shift
new_snake << sum_of_two_lists(new_snake[-1], direction)
end
def grow(snake, direction)
new_snake = snake.dup
new_snake << sum_of_two_lists(new_snake[-1], direction)
end
def check_position?(position, dimensions = {})
position[0] >= 0 and position[1] >= 0 \
and position[0] < dimensions[:width] and position[1] < dimensions[:height]
end
def generate_position(dimensions)
[rand(dimensions[:width]), rand(dimensions[:height])]
end
def new_food(food, snake, dimensions)
busy_positions = food | snake
new_food = generate_position(dimensions)
new_food = generate_position(dimensions) while \
busy_positions.include? new_food
new_food
end
def obstacle_ahead?(snake, direction, dimensions = {})
next_position = grow(snake, direction)[-1]
snake.include? next_position or !check_position?(next_position, dimensions)
end
def danger?(snake, direction, dimensions = {})
two_positions_ahead = grow(grow(snake, direction), direction)[-1]
obstacle_ahead?(snake, direction, dimensions) or \
check_position?(two_positions_ahead, dimensions)
end

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

.F...............FF.

Failures:

  1) #move moves one-position-sized snake
     Failure/Error: expect(move([[2, 2]], [-1, 0])).to eq([[1, 2]])
     TypeError:
       no implicit conversion of nil into Array
     # /tmp/d20151026-15631-62e8br/solution.rb:2:in `transpose'
     # /tmp/d20151026-15631-62e8br/solution.rb:2:in `sum_of_two_lists'
     # /tmp/d20151026-15631-62e8br/solution.rb:8:in `move'
     # /tmp/d20151026-15631-62e8br/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) #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: false
       
       (compared using ==)
     # /tmp/d20151026-15631-62e8br/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)>'

  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-62e8br/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.01497 seconds
20 examples, 3 failures

Failed examples:

rspec /tmp/d20151026-15631-62e8br/spec.rb:11 # #move moves one-position-sized snake
rspec /tmp/d20151026-15631-62e8br/spec.rb:112 # #danger? returns true if obstacle in two turns
rspec /tmp/d20151026-15631-62e8br/spec.rb:116 # #danger? returns false if obstacle in three turns

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

Славяна обнови решението на 19.10.2015 15:25 (преди над 9 години)

+def sum_of_two_lists(first_list, second_list)
+ [first_list, second_list].transpose.map {|a | a.inject(:+)}
+end
+
+def move(snake, direction)
+ new_snake = snake.dup
+ new_snake.shift
+ new_snake << sum_of_two_lists(new_snake[-1], direction)
+end
+
+def grow(snake, direction)
+ new_snake = snake.dup
+ new_snake << sum_of_two_lists(new_snake[-1], direction)
+end
+
+def check_position?(position, dimensions = {})
+ position[0] >= 0 and position[1] >= 0 \
+ and position[0] < dimensions[:width] and position[1] < dimensions[:height]
+end
+
+def generate_position(dimensions)
+ [rand(dimensions[:width]), rand(dimensions[:height])]
+end
+
+def new_food(food, snake, dimensions)
+ busy_positions = food | snake
+ new_food = generate_position(dimensions)
+ new_food = generate_position(dimensions) while \
+ busy_positions.include? new_food
+ new_food
+end
+
+def obstacle_ahead?(snake, direction, dimensions = {})
+ next_position = grow(snake, direction)[-1]
+
+ snake.include? next_position or !check_position?(next_position, dimensions)
+end
+
+def danger?(snake, direction, dimensions = {})
+ two_positions_ahead = grow(grow(snake, direction), direction)[-1]
+
+ obstacle_ahead?(snake, direction, dimensions) or \
+ check_position?(two_positions_ahead, dimensions)
+end