Решение на Втора задача от Марк Андонов

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

Към профила на Марк Андонов

Резултати

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

Код

def move(snake, direction)
new_snake = snake.dup
new_element = [snake.last[0] + direction[0], snake.last[1] + direction[1]]
new_snake.shift
new_snake << new_element
end
def grow(snake, direction)
new_snake = snake.dup
new_element = [snake.last[0] + direction[0], snake.last[1] + direction[1]]
new_snake << new_element
end
def new_food(food, snake, dimensions)
width_set = (0..dimensions[:width] - 1).to_a
height_set = (0..dimensions[:height] - 1).to_a
new_food_set = width_set.product(height_set) - snake - food
(new_food_set.shuffle).first
end
def obstacle_ahead?(snake, direction, dimensions)
new_element = [snake.last[0] + direction[0], snake.last[1] + direction[1]]
check_height = new_element[1] >= dimensions[:height] || new_element[1] < 0
check_width = new_element[0] >= dimensions[:width] || new_element[0] < 0
check_width || check_height || snake.include?(new_element) ? true : false
end
def danger?(snake, direction, dimensions)
new_snake = move(snake, direction)
check_first_move = obstacle_ahead?(snake, direction, dimensions)
check_second_move = obstacle_ahead?(new_snake, direction, dimensions)
check_first_move || check_second_move ? true : false
end

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

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

Finished in 0.01929 seconds
20 examples, 0 failures

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

Марк обнови решението на 14.10.2015 18:56 (преди над 9 години)

+def sum_corresponding_elements_of_arrays(a, b)
+ n = a.length - 1
+ (0..n).map { |i| a[i] + b[i]}
+end
+
+def move(snake, direction)
+ new_snake = Array.new(snake)
+ new_element = sum_corresponding_elements_of_arrays(new_snake.last, direction)
+ new_snake.shift
+ new_snake.push(new_element)
+end
+
+def grow(snake, direction)
+new_snake = Array.new(snake)
+ new_element = sum_corresponding_elements_of_arrays(new_snake.last, direction)
+ new_snake.push(new_element)
+end
+
+def new_food(food, snake, dimensions)
+ width_set = Array.new
+ height_set = Array.new
+ new_food_set = Array.new
+
+ width_set = (0..dimensions[:width] - 1).map { |i| width_set[i] = i}
+ height_set = (0..dimensions[:height] - 1).map { |i| height_set[i] = i}
+
+ new_food_set = width_set.product(height_set) + height_set.product(width_set)
+ new_food_set = new_food_set - snake - food
+ ((new_food_set.uniq).shuffle).first
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ new_element = sum_corresponding_elements_of_arrays(snake.last, direction)
+
+ check_width = new_element.first >= dimensions[:height]
+ check_height = new_element.last >= dimensions[:width]
+ check_width or check_height or snake.include?(new_element) ? true : false
+end
+
+def danger?(snake, direction, dimensions)
+ new_snake = move(snake, direction)
+ check_first_move = obstacle_ahead?(snake, direction, dimensions)
+ check_second_move = obstacle_ahead?(new_snake, direction, dimensions)
+
+ check_first_move or check_second_move ? true : false
+end

Относно new_food - правиш много лоши неща :)

width_set = Array.new
width_set = (0..dimensions[:width] - 1).map { |i| width_set[i] = i}
  • Не прави Array.new, използвай width_set = [].
  • (0..dimensions[:width] - 1) е същото като (0...dimensions[:width])
  • Правиш map в който променяш width_set и връщаш i. После масивът с всичките i-та го присвояваш на width_set.
  • (0...dimensions[:width]) е Range, то има един метод Range#to_a, което го прави на масив. :)
new_food_set = width_set.product(height_set) + height_set.product(width_set)
  • Това е просто грешно. width_set.product(height_set) връща масив от масиви, където първият елемент е координата по width, а вторият е по height. height_set.product(width_set) тук първият е по height, вторият е по width. Та .. всички точки (пр. от змята, от храната) са [width, height].
((new_food_set.uniq).shuffle).first
  • Да игнорираме uniq. Правиш empty_cells.shuffe.first, можеш просто да използваш Array#sample, т.е. empty_cells.sample. (и няма нужда от всичките скоби)

Относно move, grow

  • Пак не използвай Array.new има Array#dup
  • sum_corresponding_elements_of_arrays e .. Махни го, замени го, промени го, burn it with igni.
  • В grow индентацията не е ок.

Относно obstacle_ahead? и danger?

check_first_move or check_second_move ? true : false
  • Това ако му сложим скобите ще е равно на
check_first_move or (check_second_move ? true : false)
  • Но ако игнорираме това, ти правиш true ? true : false, та така е по-добре:
check_first_move or check_second_move 
  • А така е най-добре:
check_first_move || check_second_move 
  • Погледни тази тема във форума
  • В obstacle_ahead? проверявай също за отрицателни числата, защото полето има 4 стени :)

Марк обнови решението на 19.10.2015 16:12 (преди над 9 години)

-def sum_corresponding_elements_of_arrays(a, b)
- n = a.length - 1
- (0..n).map { |i| a[i] + b[i]}
-end
-
def move(snake, direction)
- new_snake = Array.new(snake)
- new_element = sum_corresponding_elements_of_arrays(new_snake.last, direction)
+ new_snake = snake.dup
+ new_element = [snake.last[0] + direction[0], snake.last[1] + direction[1]]
new_snake.shift
- new_snake.push(new_element)
+ new_snake << new_element
end
def grow(snake, direction)
-new_snake = Array.new(snake)
- new_element = sum_corresponding_elements_of_arrays(new_snake.last, direction)
- new_snake.push(new_element)
+ new_snake = snake.dup
+ new_element = [snake.last[0] + direction[0], snake.last[1] + direction[1]]
+ new_snake << new_element
end
def new_food(food, snake, dimensions)
- width_set = Array.new
- height_set = Array.new
- new_food_set = Array.new
+ width_set = (0..dimensions[:width] - 1).to_a
+ height_set = (0..dimensions[:height] - 1).to_a
- width_set = (0..dimensions[:width] - 1).map { |i| width_set[i] = i}
- height_set = (0..dimensions[:height] - 1).map { |i| height_set[i] = i}
-
- new_food_set = width_set.product(height_set) + height_set.product(width_set)
- new_food_set = new_food_set - snake - food
- ((new_food_set.uniq).shuffle).first
+ new_food_set = width_set.product(height_set) - snake - food
+ (new_food_set.shuffle).first
end
def obstacle_ahead?(snake, direction, dimensions)
- new_element = sum_corresponding_elements_of_arrays(snake.last, direction)
+ new_element = [snake.last[0] + direction[0], snake.last[1] + direction[1]]
- check_width = new_element.first >= dimensions[:height]
- check_height = new_element.last >= dimensions[:width]
- check_width or check_height or snake.include?(new_element) ? true : false
+ check_height = new_element[1] >= dimensions[:height] || new_element[1] < 0
+ check_width = new_element[0] >= dimensions[:width] || new_element[0] < 0
+ check_width || check_height || snake.include?(new_element) ? true : false
end
def danger?(snake, direction, dimensions)
new_snake = move(snake, direction)
check_first_move = obstacle_ahead?(snake, direction, dimensions)
check_second_move = obstacle_ahead?(new_snake, direction, dimensions)
- check_first_move or check_second_move ? true : false
+ check_first_move || check_second_move ? true : false
end