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

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

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

Резултати

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

Код

def get_next_position_of_head(head_position, direction)
[head_position, direction].transpose.map { |x| x.reduce(:+) }
end
def move(snake, direction)
snake = snake.dup
snake.shift
snake << get_next_position_of_head(snake.last, direction)
end
def grow(snake, direction)
snake = snake.dup
snake << get_next_position_of_head(snake.last, direction)
end
def clear_used_positions(available_positions, positions_to_remove)
positions_to_remove.each do |position|
available_positions[position[0]].delete(position[1])
end
end
def new_food(food, snake, dimensions)
available_positions = {}
cells = [*0...dimensions[:height]]
dimensions[:width].times { |i| available_positions[i] = cells.flatten }
clear_used_positions(available_positions, snake) if snake
clear_used_positions(available_positions, food) if food
available_row = available_positions.find { |_, positions| positions.size > 0 }
[available_row[0], available_row[1].last]
end
def obstacle_ahead?(snake, direction, dimensions)
head_next_position = get_next_position_of_head(snake.last, direction)
head_next_position[0] >= dimensions[:width] ||
head_next_position[0] < 0 ||
head_next_position[1] >= dimensions[:height] ||
head_next_position[1] < 0 || snake.include?(head_next_position)
end
def danger?(snake, direction, dimensions)
obstacle_ahead?(snake, direction.map { |x| x * 2 }, dimensions)
end

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

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

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-172zj7x/solution.rb:2:in `transpose'
     # /tmp/d20151026-15631-172zj7x/solution.rb:2:in `get_next_position_of_head'
     # /tmp/d20151026-15631-172zj7x/solution.rb:8:in `move'
     # /tmp/d20151026-15631-172zj7x/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)>'

Finished in 0.01458 seconds
20 examples, 1 failure

Failed examples:

rspec /tmp/d20151026-15631-172zj7x/spec.rb:11 # #move moves one-position-sized snake

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

Рали обнови решението на 19.10.2015 01:32 (преди над 9 години)

+def get_next_position_of_head(head_position, direction)
+ [head_position, direction].transpose.map { |x| x.reduce(:+) }
+end
+
+def move(snake, direction)
+ snake = snake.dup
+ snake.shift
+ snake << get_next_position_of_head(snake.last, direction)
+end
+
+def grow(snake, direction)
+ snake = snake.dup
+ snake << get_next_position_of_head(snake.last, direction)
+end
+
+def clear_used_positions(available_positions, positions_to_remove)
+ positions_to_remove.each do |position|
+ available_positions[position[0]].delete(position[1])
+ end
+end
+
+def new_food(food, snake, dimensions)
+ available_positions = {}
+ cells = [*0...dimensions[:height]]
+ dimensions[:width].times { |i| available_positions[i] = cells.flatten }
+ clear_used_positions(available_positions, snake) if snake
+ clear_used_positions(available_positions, food) if food
+
+ available_row = available_positions.find { |_, positions| positions.size > 0 }
+ [available_row[0], available_row[1].last]
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ head_next_position = get_next_position_of_head(snake.last, direction)
+
+ head_next_position[0] >= dimensions[:width] ||
+ head_next_position[0] < 0 ||
+ head_next_position[1] >= dimensions[:height] ||
+ head_next_position[1] < 0 || snake.include?(head_next_position)
+end
+
+def danger?(snake, direction, dimensions)
+ obstacle_ahead?(snake, direction.map { |x| x * 2 }, dimensions)
+end