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

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

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

Резултати

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

Код

def grow(snake, direction)
grown = snake.clone
grown << [grown[-1][0] + direction[0], grown[-1][1] + direction[1]]
end
def move(snake, direction)
new_snake = grow(snake, direction)
new_snake.drop(1)
end
def new_food(food, snake, dimensions)
position = food[0].clone
width = dimensions[:width]
height = dimensions[:height]
while (food.include? position or snake.include? position) do
position = [rand(0...width), rand(0...height)]
end
position
end
def obstacle_ahead?(snake, direction, dimensions)
position = snake[-1][0] + direction[0], snake[-1][1] + direction[1]
x = position[0]
y = position[1]
width = dimensions[:width]
height = dimensions[:height]
snake.include? position or x < 0 or x >= width or y < 0 or y >= height
end
def danger?(snake, direction, dimensions)
will_hit = ->(x) { obstacle_ahead? x, direction, dimensions }
# Skip the end of the snake's tail (first element in the array) because
# the snake can't hit it (it will move out of the way when the snake moves)
will_hit.(snake.clone.drop(1)) or will_hit.(move(snake, direction).drop(1))
end

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

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

Finished in 0.01432 seconds
20 examples, 0 failures

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

Павел обнови решението на 16.10.2015 23:50 (преди над 9 години)

+def grow(snake, direction)
+ new_snake = snake.clone
+ new_snake << [new_snake[-1][0] + direction[0], new_snake[-1][1] + direction[1]]
+end
+
+def move(snake, direction)
+ new_snake = grow(snake, direction)
+ new_snake.delete_at(0)
+ new_snake
+end
+
+def new_food(food, snake, dimensions)
+ position = food[0].clone
+ width = dimensions[:width]
+ height = dimensions[:height]
+ while (food.include? position or snake.include? position) do
+ position = [rand(0...width), rand(0...height)]
+ end
+ position
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ position = snake[-1][0] + direction[0], snake[-1][1] + direction[1]
+ x = position[0]
+ y = position[1]
+ width = dimensions[:width]
+ height = dimensions[:height]
+ snake.include? position or x < 0 or x >= width or y < 0 or y >= height
+end
+
+def danger?(snake, direction, dimensions)
+ moved_snake = snake.clone
+ moved_snake.delete_at(0)
+ return true if obstacle_ahead? moved_snake, direction, dimensions
+
+ new_snake = move(snake, direction)
+ new_snake.delete_at(0)
+ return true if obstacle_ahead? new_snake, direction, dimensions
+ false
+end

Не оставяй табове в кода

Настрой си редактора да ти слага 2 space-a на всеки таб за Ruby code. Ако не предаваш правилно идентиран код, ще взимаме точки.

new_snake.delete_at(0) <=> new_snake.shift

Друг вариант е директно да ползваш .drop(1)

moved_snake.delete_at(0) Защо правиш това? Излишно е, и ако го изпуснеш, можеш да комбинираш condition-ите си в много по-кратко решение.

Защото края на опашката на змията не ме интересува в случая. В момента, в който змията се премести, тя вече няма да е там. Премахвам я от масива за да избегна false positives за колизии.

Павел обнови решението на 18.10.2015 21:08 (преди над 9 години)

def grow(snake, direction)
- new_snake = snake.clone
- new_snake << [new_snake[-1][0] + direction[0], new_snake[-1][1] + direction[1]]
+ grown = snake.clone
+ grown << [grown[-1][0] + direction[0], grown[-1][1] + direction[1]]
end
def move(snake, direction)
- new_snake = grow(snake, direction)
- new_snake.delete_at(0)
- new_snake
+ new_snake = grow(snake, direction)
+ new_snake.drop(1)
end
def new_food(food, snake, dimensions)
- position = food[0].clone
- width = dimensions[:width]
- height = dimensions[:height]
- while (food.include? position or snake.include? position) do
- position = [rand(0...width), rand(0...height)]
- end
- position
+ position = food[0].clone
+ width = dimensions[:width]
+ height = dimensions[:height]
+ while (food.include? position or snake.include? position) do
+ position = [rand(0...width), rand(0...height)]
+ end
+ position
end
def obstacle_ahead?(snake, direction, dimensions)
- position = snake[-1][0] + direction[0], snake[-1][1] + direction[1]
- x = position[0]
- y = position[1]
- width = dimensions[:width]
- height = dimensions[:height]
- snake.include? position or x < 0 or x >= width or y < 0 or y >= height
+ position = snake[-1][0] + direction[0], snake[-1][1] + direction[1]
+ x = position[0]
+ y = position[1]
+ width = dimensions[:width]
+ height = dimensions[:height]
+ snake.include? position or x < 0 or x >= width or y < 0 or y >= height
end
def danger?(snake, direction, dimensions)
- moved_snake = snake.clone
- moved_snake.delete_at(0)
- return true if obstacle_ahead? moved_snake, direction, dimensions
+ will_hit = ->(x) { obstacle_ahead? x, direction, dimensions }
- new_snake = move(snake, direction)
- new_snake.delete_at(0)
- return true if obstacle_ahead? new_snake, direction, dimensions
- false
+ # Skip the end of the snake's tail (first element in the array) because
+ # the snake can't hit it (it will move out of the way when the snake moves)
+ will_hit.(snake.clone.drop(1)) or will_hit.(move(snake, direction).drop(1))
end