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

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

Към профила на Иван Стоилов

Резултати

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

Код

def new_head
head = -> (u, v) {[u[0] + v[0], u[1] + v[1]]}
end
def get_new_position(snake, direction)
new_position = new_head.call(snake[-1], direction)
if not snake.include? new_position
snake.push(new_position)
else
nil
end
end
def move(snake, direction)
new_snake = snake.dup
new_snake.shift
get_new_position(new_snake, direction)
end
def grow(snake, direction)
new_snake = snake.dup
get_new_position(new_snake, direction)
end
def new_food(food, snake, dimensions)
new_food = [rand(dimensions[:width]), rand(dimensions[:height])]
while food.include? new_food or snake.include? new_food
new_food = [rand(dimensions[:width]), rand(dimensions[:height])]
end
new_food
end
def obstacle_ahead?(snake, direction, dimensions)
ahead = new_head.call(snake[-1], direction)
range_x = (0..dimensions[:width] - 1).to_a
range_y = (0..dimensions[:height] - 1).to_a
in_range = not(range_x.include? ahead[0] and range_y.include? ahead[1])
snake.include? ahead or in_range
end
def danger?(snake, direction, dimensions)
second_direction = direction.map{|n| n *= 2}
at_danger_first = obstacle_ahead?(snake, direction, dimensions)
at_danger_second = obstacle_ahead?(snake, second_direction, dimensions)
at_danger_first or at_danger_second
end

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

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

Failures:

  1) #move moves snake up/right/left/down
     Failure/Error: expect(move(snake, [0, -1])).to eq([[2, 3], [2, 4], [2, 5], [2, 4]])
       
       expected: [[2, 3], [2, 4], [2, 5], [2, 4]]
            got: nil
       
       (compared using ==)
     # /tmp/d20151026-15631-86sqw2/spec.rb:8: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) #move moves one-position-sized snake
     Failure/Error: expect(move([[2, 2]], [-1, 0])).to eq([[1, 2]])
     NoMethodError:
       undefined method `[]' for nil:NilClass
     # /tmp/d20151026-15631-86sqw2/solution.rb:2:in `block in new_head'
     # /tmp/d20151026-15631-86sqw2/solution.rb:6:in `call'
     # /tmp/d20151026-15631-86sqw2/solution.rb:6:in `get_new_position'
     # /tmp/d20151026-15631-86sqw2/solution.rb:18:in `move'
     # /tmp/d20151026-15631-86sqw2/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)>'

  3) #grow grows snake up/right/left/down
     Failure/Error: expect(grow(snake, [0, -1])).to eq([[2, 2], [2, 3], [2, 4], [2, 5], [2, 4]])
       
       expected: [[2, 2], [2, 3], [2, 4], [2, 5], [2, 4]]
            got: nil
       
       (compared using ==)
     # /tmp/d20151026-15631-86sqw2/spec.rb:29: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.01472 seconds
20 examples, 3 failures

Failed examples:

rspec /tmp/d20151026-15631-86sqw2/spec.rb:4 # #move moves snake up/right/left/down
rspec /tmp/d20151026-15631-86sqw2/spec.rb:11 # #move moves one-position-sized snake
rspec /tmp/d20151026-15631-86sqw2/spec.rb:25 # #grow grows snake up/right/left/down

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

Иван обнови решението на 18.10.2015 01:33 (преди над 9 години)

+def new_head
+ head = -> (u, v) {[u[0] + v[0], u[1] + v[1]]}
+end
+
+def get_new_position(snake, direction)
+ new_position = new_head.call(snake[snake.length - 1], direction)
+
+ if not snake.include? new_position
+ snake.push(new_position)
+ else
+ nil
+ end
+end
+
+def move(snake, direction)
+ new_snake = snake.dup
+ new_snake.shift
+ get_new_position(new_snake, direction)
+end
+
+def grow(snake, direction)
+ new_snake = snake.dup
+ get_new_position(new_snake, direction)
+end
+
+def new_food(food, snake, dimensions)
+ new_food = [rand(dimensions[:width]), rand(dimensions[:height])]
+
+ while food.include? new_food or snake.include? new_food
+ new_food = [rand(dimensions[:width]), rand(dimensions[:height])]
+ end
+
+ new_food
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ ahead = new_head.call(snake[snake.length - 1], direction)
+
+ range_x = (0..dimensions[:width] - 1).to_a
+ range_y = (0..dimensions[:height] - 1).to_a
+ in_range = not(range_x.include? ahead[0] and range_y.include? ahead[1])
+
+ snake.include? ahead or in_range
+end
+
+def danger?(snake, direction, dimensions)
+ second_direction = direction.map{|n| n *= 2}
+
+ at_danger_first = obstacle_ahead?(snake, direction, dimensions)
+ at_danger_second = obstacle_ahead?(snake, second_direction, dimensions)
+
+ at_danger_first or at_danger_second
+end

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

def new_head
head = -> (u, v) {[u[0] + v[0], u[1] + v[1]]}
end
def get_new_position(snake, direction)
- new_position = new_head.call(snake[snake.length - 1], direction)
+ new_position = new_head.call(snake[-1], direction)
if not snake.include? new_position
snake.push(new_position)
else
nil
end
end
def move(snake, direction)
new_snake = snake.dup
new_snake.shift
get_new_position(new_snake, direction)
end
def grow(snake, direction)
new_snake = snake.dup
get_new_position(new_snake, direction)
end
def new_food(food, snake, dimensions)
new_food = [rand(dimensions[:width]), rand(dimensions[:height])]
while food.include? new_food or snake.include? new_food
new_food = [rand(dimensions[:width]), rand(dimensions[:height])]
end
new_food
end
def obstacle_ahead?(snake, direction, dimensions)
- ahead = new_head.call(snake[snake.length - 1], direction)
+ ahead = new_head.call(snake[-1], direction)
range_x = (0..dimensions[:width] - 1).to_a
range_y = (0..dimensions[:height] - 1).to_a
in_range = not(range_x.include? ahead[0] and range_y.include? ahead[1])
snake.include? ahead or in_range
end
def danger?(snake, direction, dimensions)
second_direction = direction.map{|n| n *= 2}
at_danger_first = obstacle_ahead?(snake, direction, dimensions)
at_danger_second = obstacle_ahead?(snake, second_direction, dimensions)
at_danger_first or at_danger_second
end