Иван обнови решението на 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