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

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

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

Резултати

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

Код

def in_bounds?(position, dimensions)
xs = position[0] < 0 || position[0] >= dimensions[:width]
ys = position[1] < 0 || position[1] >= dimensions[:height]
!(xs || ys)
end
def get_next_position(snake, direction)
snake_head_position = snake[-1]
xs = snake_head_position[0] + direction[0]
ys = snake_head_position[1] + direction[1]
[xs, ys]
end
def move(snake, direction)
new_snake = grow(snake, direction)[1..-1]
end
def grow(snake, direction)
dummy_snake = snake.dup
dummy_snake.push get_next_position snake, direction
end
def new_food(food, snake, dimensions)
xs = rand dimensions[:width]
ys = rand dimensions[:height]
part = [xs, ys]
if !snake.include? part and !food.include? part
return part
end
new_food(food, snake, dimensions)
end
def obstacle_ahead?(snake, direction, dimensions)
snake_head_position = snake[-1]
xs = snake_head_position[0] + direction[0]
ys = snake_head_position[1] + direction[1]
part = [xs, ys]
(snake.include? part) || !in_bounds?(part, dimensions)
end
def danger?(snake, direction, dimensions)
moved_snake = move snake, direction
direct_danger = obstacle_ahead? snake, direction, dimensions
second_step_danger = obstacle_ahead? moved_snake, direction, dimensions
direct_danger || second_step_danger
end

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

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

Finished in 0.01442 seconds
20 examples, 0 failures

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

Бони обнови решението на 14.10.2015 23:46 (преди над 9 години)

+def in_bounds?(position, dimensions)
+ xs = position[0] < 0 || position[0] >= dimensions[:width]
+ ys = position[1] < 0 || position[1] >= dimensions[:height]
+ !(xs || ys)
+end
+
+def array_contains?(array, part)
+ result = false
+ for array_part in array
+ result = result || (part[0] == array_part[0] and part[1] == array_part[1])
+ end
+
+ return result
+end
+
+def move(snake, direction)
+ new_snake = snake.slice(1, snake.length - 1)
+ snake_head_position = snake[snake.length - 1]
+ xs = snake_head_position[0] + direction[0]
+ ys = snake_head_position[1] + direction[1]
+ new_snake.push([xs, ys])
+end
+
+def grow(snake, direction)
+ dummy_snake = [nil].concat(snake)
+ move(dummy_snake, direction)
+end
+
+def new_food(food, snake, dimensions)
+ xs = rand(dimensions[:width])
+ ys = rand(dimensions[:height])
+ part = [xs, ys]
+ if(!(array_contains?(snake, part)) and !(array_contains?(food, part))) then
+ return part
+ end
+
+ return new_food(food, snake, dimensions)
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ snake_head_position = snake[snake.length - 1]
+ xs = snake_head_position[0] + direction[0]
+ ys = snake_head_position[1] + direction[1]
+
+ part = [xs, ys]
+ array_contains?(snake, part) || !(in_bounds?(part, dimensions))
+end
+
+def danger?(snake, direction, dimensions)
+ moved_snake = move(snake, direction)
+ direct_danger = obstacle_ahead?(snake, direction, dimensions)
+ second_step_danger = obstacle_ahead?(moved_snake, direction, dimensions)
+ direct_danger || second_step_danger
+end

array_contains? Ако потърсиш в документацията(или google), може да откриеш че има метод, който проверява за елемент в редица.

snake.slice(1, snake.length - 1) се пише snake[1..-1] в Руби. Готино е , защото ти спестява да пишеш ldfsd.length всеки път.

if(!(array_contains?(snake, part)) and !(array_contains?(food, part))) then
  return part
end

Пишеш if без скоби на условието и без then

Освен това нямаш нужда от return на последните редове, винаги стойността на последния израз в метод се връща.

snake[snake.length - 1] <=> snake[-1]

Като цяло, има едно парче информация, което ако изнесеш да ти се изчислява в отделна функция, може да преизползваш, вместо да викаш move всеки път, помисли кое може да е.

Добро решение, само погледни забележките и трябва малко да си преговориш синтаксиса : ]

Бони обнови решението на 18.10.2015 15:26 (преди над 9 години)

def in_bounds?(position, dimensions)
xs = position[0] < 0 || position[0] >= dimensions[:width]
ys = position[1] < 0 || position[1] >= dimensions[:height]
!(xs || ys)
end
-def array_contains?(array, part)
- result = false
- for array_part in array
- result = result || (part[0] == array_part[0] and part[1] == array_part[1])
- end
-
- return result
+def get_next_position(snake, direction)
+ snake_head_position = snake[-1]
+ xs = snake_head_position[0] + direction[0]
+ ys = snake_head_position[1] + direction[1]
+ [xs, ys]
end
def move(snake, direction)
- new_snake = snake.slice(1, snake.length - 1)
- snake_head_position = snake[snake.length - 1]
- xs = snake_head_position[0] + direction[0]
- ys = snake_head_position[1] + direction[1]
- new_snake.push([xs, ys])
+ new_snake = grow(snake, direction)[1..-1]
end
def grow(snake, direction)
- dummy_snake = [nil].concat(snake)
- move(dummy_snake, direction)
+ dummy_snake = snake.dup
+ dummy_snake.push get_next_position snake, direction
end
def new_food(food, snake, dimensions)
- xs = rand(dimensions[:width])
- ys = rand(dimensions[:height])
+ xs = rand dimensions[:width]
+ ys = rand dimensions[:height]
part = [xs, ys]
- if(!(array_contains?(snake, part)) and !(array_contains?(food, part))) then
+ if !snake.include? part and !food.include? part
return part
end
- return new_food(food, snake, dimensions)
+ new_food(food, snake, dimensions)
end
def obstacle_ahead?(snake, direction, dimensions)
- snake_head_position = snake[snake.length - 1]
+ snake_head_position = snake[-1]
xs = snake_head_position[0] + direction[0]
ys = snake_head_position[1] + direction[1]
part = [xs, ys]
- array_contains?(snake, part) || !(in_bounds?(part, dimensions))
+ (snake.include? part) || !in_bounds?(part, dimensions)
end
def danger?(snake, direction, dimensions)
- moved_snake = move(snake, direction)
- direct_danger = obstacle_ahead?(snake, direction, dimensions)
- second_step_danger = obstacle_ahead?(moved_snake, direction, dimensions)
+ moved_snake = move snake, direction
+ direct_danger = obstacle_ahead? snake, direction, dimensions
+ second_step_danger = obstacle_ahead? moved_snake, direction, dimensions
direct_danger || second_step_danger
end