Решение на Втора задача от Александър Дражев

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

Към профила на Александър Дражев

Резултати

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

Код

def head_after_move(snake, direction)
[snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
def position_at_index(index, width)
[index % width, index / width]
end
def move(snake, direction)
grow(snake, direction).drop(1)
end
def grow(snake, direction)
snake + [head_after_move(snake, direction)]
end
def new_food(food, snake, dimensions)
taken = food + snake
width = dimensions[:width]
food_index = 0
food_index += 1 while taken.include?(position_at_index(food_index, width))
position_at_index(food_index, width)
end
def obstacle_ahead?(snake, direction, dimensions)
xs_ahead, ys_ahead = head_after_move(snake, direction)
vertical_wall_ahead = (xs_ahead == -1 or xs_ahead == dimensions[:width])
horizontal_wall_ahead = (ys_ahead == -1 or ys_ahead == dimensions[:height])
snake_ahead = snake.include?([xs_ahead, ys_ahead])
vertical_wall_ahead or horizontal_wall_ahead or snake_ahead
end
def danger?(snake, direction, dimensions)
dies_in_one = obstacle_ahead?(snake, direction, dimensions)
dies_in_two = obstacle_ahead?(move(snake, direction), direction, dimensions)
dies_in_one or dies_in_two
end

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

....................

Finished in 0.01432 seconds
20 examples, 0 failures

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

Александър обнови решението на 14.10.2015 06:19 (преди над 9 години)

+def head_after_move(snake, direction)
+ [snake.last[0] + direction[0], snake.last[1] + direction[1]]
+end
+
+def random_position(dimensions)
+ [rand(0...dimensions[:width]), rand(0...dimensions[:height])]
+end
+
+def move(snake, direction)
+ grow(snake, direction).drop(1)
+end
+
+def grow(snake, direction)
+ snake + [head_after_move(snake, direction)]
+end
+
+def new_food(food, snake, dimensions)
+ new_food = random_position(dimensions)
+ taken = food + snake
+
+ new_food = random_position(dimensions) while (taken.include?(new_food))
+
+ new_food
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ xs_ahead, ys_ahead = head_after_move(snake, direction)
+
+ vertical_wall_ahead = (xs_ahead == -1 or xs_ahead == dimensions[:width])
+ horizontal_wall_ahead = (ys_ahead == -1 or ys_ahead == dimensions[:height])
+ snake_ahead = snake.include?([xs_ahead, ys_ahead])
+
+ vertical_wall_ahead or horizontal_wall_ahead or snake_ahead
+end
+
+def danger?(snake, direction, dimensions)
+ dies_in_one = obstacle_ahead?(snake, direction, dimensions)
+ dies_in_two = obstacle_ahead?(move(snake, direction), direction, dimensions)
+ dies_in_one or dies_in_two
+end

Александър обнови решението на 14.10.2015 15:43 (преди над 9 години)

def head_after_move(snake, direction)
[snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
def random_position(dimensions)
[rand(0...dimensions[:width]), rand(0...dimensions[:height])]
end
def move(snake, direction)
grow(snake, direction).drop(1)
end
def grow(snake, direction)
snake + [head_after_move(snake, direction)]
end
def new_food(food, snake, dimensions)
new_food = random_position(dimensions)
taken = food + snake
- new_food = random_position(dimensions) while (taken.include?(new_food))
+ new_food = random_position(dimensions) while taken.include?(new_food)
new_food
end
def obstacle_ahead?(snake, direction, dimensions)
xs_ahead, ys_ahead = head_after_move(snake, direction)
vertical_wall_ahead = (xs_ahead == -1 or xs_ahead == dimensions[:width])
horizontal_wall_ahead = (ys_ahead == -1 or ys_ahead == dimensions[:height])
snake_ahead = snake.include?([xs_ahead, ys_ahead])
vertical_wall_ahead or horizontal_wall_ahead or snake_ahead
end
def danger?(snake, direction, dimensions)
dies_in_one = obstacle_ahead?(snake, direction, dimensions)
dies_in_two = obstacle_ahead?(move(snake, direction), direction, dimensions)
dies_in_one or dies_in_two
end

Александър обнови решението на 14.10.2015 22:05 (преди над 9 години)

def head_after_move(snake, direction)
[snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
def random_position(dimensions)
- [rand(0...dimensions[:width]), rand(0...dimensions[:height])]
+ [rand(dimensions[:width]), rand(dimensions[:height])]
end
def move(snake, direction)
grow(snake, direction).drop(1)
end
def grow(snake, direction)
snake + [head_after_move(snake, direction)]
end
def new_food(food, snake, dimensions)
new_food = random_position(dimensions)
taken = food + snake
new_food = random_position(dimensions) while taken.include?(new_food)
new_food
end
def obstacle_ahead?(snake, direction, dimensions)
xs_ahead, ys_ahead = head_after_move(snake, direction)
vertical_wall_ahead = (xs_ahead == -1 or xs_ahead == dimensions[:width])
horizontal_wall_ahead = (ys_ahead == -1 or ys_ahead == dimensions[:height])
snake_ahead = snake.include?([xs_ahead, ys_ahead])
vertical_wall_ahead or horizontal_wall_ahead or snake_ahead
end
def danger?(snake, direction, dimensions)
dies_in_one = obstacle_ahead?(snake, direction, dimensions)
dies_in_two = obstacle_ahead?(move(snake, direction), direction, dimensions)
dies_in_one or dies_in_two
end

Александър обнови решението на 18.10.2015 04:30 (преди над 9 години)

def head_after_move(snake, direction)
[snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
-def random_position(dimensions)
- [rand(dimensions[:width]), rand(dimensions[:height])]
+def position_at_index(index, width)
+ [index % width, index / width]
end
def move(snake, direction)
grow(snake, direction).drop(1)
end
def grow(snake, direction)
snake + [head_after_move(snake, direction)]
end
def new_food(food, snake, dimensions)
- new_food = random_position(dimensions)
taken = food + snake
+ width = dimensions[:width]
- new_food = random_position(dimensions) while taken.include?(new_food)
+ food_index = 0
+ food_index += 1 while taken.include?(position_at_index(food_index, width))
- new_food
+ position_at_index(food_index, width)
end
def obstacle_ahead?(snake, direction, dimensions)
xs_ahead, ys_ahead = head_after_move(snake, direction)
vertical_wall_ahead = (xs_ahead == -1 or xs_ahead == dimensions[:width])
horizontal_wall_ahead = (ys_ahead == -1 or ys_ahead == dimensions[:height])
snake_ahead = snake.include?([xs_ahead, ys_ahead])
vertical_wall_ahead or horizontal_wall_ahead or snake_ahead
end
def danger?(snake, direction, dimensions)
dies_in_one = obstacle_ahead?(snake, direction, dimensions)
dies_in_two = obstacle_ahead?(move(snake, direction), direction, dimensions)
dies_in_one or dies_in_two
end

Като цяло супер. Чак ми е трудно да измисля какво да ти дам като идеи :)

  • Може би щеше да е по-добре да използваш истинска двойка вместо index. Щеше да си една идея по-близо до абстракцията на останалата част от кода. Нямаше да се налага да викаш position_at_index втори път на края на new_food.
  • Понякога кодът изглежда малко по-красив ако подравняваш близки подобни конструкции на съседни редове. Сложи 2 space-a след vertical_wall_ahead, така че двете = да са едно под друго и виж дали няма да ти хареса повече.
  • Малко си си играл да заобиколиш ограничението от 80 символа на ред (dies in one ..., width =). Не казвам, че не ти се е получило. :)