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