Решение на Втора задача от Христина Тодорова

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

Към профила на Христина Тодорова

Резултати

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

Код

def next_move(snake, direction)
[snake[-1][0] + direction[0], snake[-1][1] + direction[1]]
end
def move(snake, direction)
snake.drop(1) + [next_move(snake, direction)]
end
def grow(snake, direction)
snake + [next_move(snake, direction)]
end
def make_food(dimensions)
[] << rand(0...dimensions[:width]) << rand(0...dimensions[:height])
end
def new_food(food, snake, dimensions)
fresh_food = make_food(dimensions)
if food.include?(fresh_food) || snake.include?(fresh_food)
new_food(food, snake, dimensions)
else
fresh_food
end
end
def obstacle_ahead?(snake, direction, dimensions)
move = next_move(snake, direction)
move[0] < 0 || move[0] >= 10 || move[1] < 0 ||
move[1] >= 10 || snake.include?(move)
end
def danger?(snake, direction, dimensions)
new_direction = direction.collect { |n| n*2 }
obstacle_ahead?(snake, direction, dimensions) ||
obstacle_ahead?(snake, new_direction, dimensions)
end

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

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

Finished in 0.01439 seconds
20 examples, 0 failures

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

Христина обнови решението на 16.10.2015 00:19 (преди над 9 години)

+def make_a_move(snake, direction)
+ [snake[-1], direction].transpose.map {|a| a.inject(:+)}
+end
+
+def move(snake, direction)
+ snake.drop(1) | [make_a_move(snake, direction)]
+end
+
+def grow(snake, direction)
+ snake | [make_a_move(snake, direction)]
+end
+
+def make_food(dimensions)
+ array = Array.new
+ array << rand(0...dimensions[:width]) << rand(0...dimensions[:height])
+end
+
+def new_food(food, snake, dimensions)
+ create_food = make_food(dimensions)
+ if food.include?(create_food) || snake.include?(create_food)
+ new_food(food, snake, dimensions)
+ else
+ create_food
+ end
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ move = make_a_move(snake, direction)
+ if move[0] < 0 || move[0]>=10 || move[1] < 0 ||
+ move[1]>=10 || snake.include?(move)
+ true
+ else
+ false
+ end
+end
+
+def try_again
+ obstacle_ahead?(snake, direction.collect { |n| n*2 }, dimensions)
+end
+
+def danger?(snake, direction, dimensions)
+ if obstacle_ahead?(snake, direction, dimensions)
+ true
+ else
+ try_again
+ end
+end

Христина обнови решението на 18.10.2015 12:52 (преди над 9 години)

def make_a_move(snake, direction)
[snake[-1], direction].transpose.map {|a| a.inject(:+)}
end
def move(snake, direction)
snake.drop(1) | [make_a_move(snake, direction)]
end
def grow(snake, direction)
snake | [make_a_move(snake, direction)]
end
def make_food(dimensions)
array = Array.new
array << rand(0...dimensions[:width]) << rand(0...dimensions[:height])
end
def new_food(food, snake, dimensions)
create_food = make_food(dimensions)
if food.include?(create_food) || snake.include?(create_food)
new_food(food, snake, dimensions)
else
create_food
end
end
def obstacle_ahead?(snake, direction, dimensions)
move = make_a_move(snake, direction)
if move[0] < 0 || move[0]>=10 || move[1] < 0 ||
move[1]>=10 || snake.include?(move)
true
else
false
end
end
-def try_again
- obstacle_ahead?(snake, direction.collect { |n| n*2 }, dimensions)
-end
-
def danger?(snake, direction, dimensions)
- if obstacle_ahead?(snake, direction, dimensions)
- true
- else
- try_again
- end
+ new_direction = direction.collect { |n| n*2 }
+
+ obstacle_ahead?(snake, direction, dimensions) ||
+ obstacle_ahead?(snake, new_direction, dimensions)
end

Няколко идеи:

  • [snake[-1], direction].transpose.map {|a| a.inject(:+)} e overkill. Искаше просто [x1 + y1, x2 + y2], не се ограничавай да е задължително one-liner.
  • Обединение на множества (Array#|) звучи малко странно. Също ще се счупи, ако накараме змията да се самозахапе. Защо не +.
  • Предпочитай литералния синтаксис за създаване на масиви []. Междинната променлива в make_food е излишна, може [x, y].
  • direction.collect { |n| n*2 } e хитро, но не е моментално очевидно. Също разчита на имплементационен детайл в make_a_move. Посоката би следвало да е само посока, а не вектор. Можеше вместо това да правиш проверка за змията, след като е мръднала.
  • Слагай space-ове около оператори x+y vs x + y.
  • Не е нужно условието в obstacle_ahead?. if some_boolean_value then true else false e същото като само some_boolean_value.
  • Откъм имена - make_a_move е леко двусмислено. Аз го чета мръдни. А всъщност е нещо като следваща позиция. create_food звучи като нещо, което създава храна, а не като новосъздадена храна.

Христина обнови решението на 18.10.2015 17:45 (преди над 9 години)

-def make_a_move(snake, direction)
- [snake[-1], direction].transpose.map {|a| a.inject(:+)}
+def next_move(snake, direction)
+ [snake[-1][0]+direction[0], snake[-1][1]+direction[1]]
end
def move(snake, direction)
- snake.drop(1) | [make_a_move(snake, direction)]
+ snake.drop(1) + [next_move(snake, direction)]
end
def grow(snake, direction)
- snake | [make_a_move(snake, direction)]
+ snake + [next_move(snake, direction)]
end
def make_food(dimensions)
- array = Array.new
- array << rand(0...dimensions[:width]) << rand(0...dimensions[:height])
+ [] << rand(0...dimensions[:width]) << rand(0...dimensions[:height])
end
def new_food(food, snake, dimensions)
- create_food = make_food(dimensions)
- if food.include?(create_food) || snake.include?(create_food)
+ fresh_food = make_food(dimensions)
+ if food.include?(fresh_food) || snake.include?(fresh_food)
new_food(food, snake, dimensions)
else
- create_food
+ fresh_food
end
end
def obstacle_ahead?(snake, direction, dimensions)
- move = make_a_move(snake, direction)
- if move[0] < 0 || move[0]>=10 || move[1] < 0 ||
- move[1]>=10 || snake.include?(move)
- true
- else
- false
- end
+ move = next_move(snake, direction)
+ move[0] < 0 || move[0] >= 10 || move[1] < 0 ||
+ move[1] >= 10 || snake.include?(move)
end
def danger?(snake, direction, dimensions)
new_direction = direction.collect { |n| n*2 }
obstacle_ahead?(snake, direction, dimensions) ||
obstacle_ahead?(snake, new_direction, dimensions)
end

Христина обнови решението на 18.10.2015 17:54 (преди над 9 години)

def next_move(snake, direction)
- [snake[-1][0]+direction[0], snake[-1][1]+direction[1]]
+ [snake[-1][0] + direction[0], snake[-1][1] + direction[1]]
end
def move(snake, direction)
snake.drop(1) + [next_move(snake, direction)]
end
def grow(snake, direction)
snake + [next_move(snake, direction)]
end
def make_food(dimensions)
[] << rand(0...dimensions[:width]) << rand(0...dimensions[:height])
end
def new_food(food, snake, dimensions)
fresh_food = make_food(dimensions)
if food.include?(fresh_food) || snake.include?(fresh_food)
new_food(food, snake, dimensions)
else
fresh_food
end
end
def obstacle_ahead?(snake, direction, dimensions)
move = next_move(snake, direction)
move[0] < 0 || move[0] >= 10 || move[1] < 0 ||
move[1] >= 10 || snake.include?(move)
end
def danger?(snake, direction, dimensions)
new_direction = direction.collect { |n| n*2 }
obstacle_ahead?(snake, direction, dimensions) ||
obstacle_ahead?(snake, new_direction, dimensions)
end