Решение на Втора задача от Методи Димитров

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

Към профила на Методи Димитров

Резултати

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

Код

def game_field_matrix(dimensions)
game_field_column = (0...dimensions[:width] ).to_a
game_field_row = (0...dimensions[:height]).to_a
game_field_row.product game_field_column
end
def move_head(snake, direction)
Array.new(2) { |index| snake.last[index] + direction[index] }
end
def move(snake, direction)
grow(snake, direction).drop 1
end
def grow(snake, direction)
snake + [move_head(snake, direction)]
end
def new_food(food, snake, dimensions)
(game_field_matrix(dimensions) - food - snake).shuffle.first
end
def obstacle_ahead?(snake, direction, dimensions)
snake_head = move_head(snake, direction)
board_matrix = game_field_matrix(dimensions)
head_inside_board = board_matrix.include? snake_head
head_bite_snake = snake.include? snake_head
(not head_inside_board) or head_bite_snake
end
def danger?(snake, direction, dimensions)
snake_head = move_head(snake, direction)
first_move = obstacle_ahead?(snake, direction, dimensions)
second_move = obstacle_ahead?(snake + [snake_head], direction, dimensions)
first_move or second_move
end

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

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

Finished in 0.01585 seconds
20 examples, 0 failures

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

Методи обнови решението на 13.10.2015 22:35 (преди над 9 години)

+def game_board(dimensions)
+ game_board_list = (0...dimensions[:width]).to_a
+ game_board_list.product((0...dimensions[:height]).to_a)
+end
+
+def move(snake, direction)
+ grow(snake, direction)[1..(-1)]
+end
+
+def grow(snake, direction)
+ snake + [snake.last.zip(direction).map { |n| n.inject(:+) }]
+end
+
+def new_food(food, snake, dimensions)
+ (game_board(dimensions) - food - snake).first
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ next_move_snake = move(snake, direction)
+ inside_board = (next_move_snake - game_board(dimensions)).empty?
+ snake_bitten = next_move_snake[0..(-2)].member? next_move_snake.last
+ (not inside_board) or snake_bitten
+end
+
+def danger?(snake, direction, dimensions)
+ next_move_snake = move(snake, direction)
+ first_move_danger = obstacle_ahead?(snake, direction, dimensions)
+ second_move_danger = obstacle_ahead?(next_move_snake, direction, dimensions)
+ first_move_danger or second_move_danger
+end
  • [snake.last.zip(direction).map { |n| n.inject(:+) }]. Yay. Искаше [x1 + x2, y1 + y2]. Опрости го малко.
  • Това да вземеш цялата мръднала змия и от нея да махнеш всички квадратчета на дъската не ти ли изглежда малко наобратно? Можеше да имаш метод, който да ти връща следващото квадратче и да го използваш навсякъде.
  • От описанието game_board_list не се разбира какво има вътре. Ако адресираш горната точка няма и да ти се налага да му мислиш адекватно име.
  • Поровичкай още из Array документацията. Със сигурност ще намериш методи за всичко без първия/всичко без последния/произволен елемент/etc.
  • Поради някаква причина в grow си индентирал с 3 space-a.

Като изключим горните, решението е доста кратко и чисто. Харесва ми.

Методи обнови решението на 19.10.2015 14:04 (преди над 9 години)

-def game_board(dimensions)
- game_board_list = (0...dimensions[:width]).to_a
- game_board_list.product((0...dimensions[:height]).to_a)
+def game_field_matrix(dimensions)
+ game_field_column = (0...dimensions[:width] ).to_a
+ game_field_row = (0...dimensions[:height]).to_a
+ game_field_row.product game_field_column
end
+def move_head(snake, direction)
+ Array.new(2) { |index| snake.last[index] + direction[index]}
+end
def move(snake, direction)
- grow(snake, direction)[1..(-1)]
+ grow(snake, direction).drop 1
end
def grow(snake, direction)
- snake + [snake.last.zip(direction).map { |n| n.inject(:+) }]
+ snake + [move_head(snake, direction)]
end
def new_food(food, snake, dimensions)
- (game_board(dimensions) - food - snake).first
+ (game_field_matrix(dimensions) - food - snake).shuffle.first
end
def obstacle_ahead?(snake, direction, dimensions)
- next_move_snake = move(snake, direction)
- inside_board = (next_move_snake - game_board(dimensions)).empty?
- snake_bitten = next_move_snake[0..(-2)].member? next_move_snake.last
- (not inside_board) or snake_bitten
+ snake_head = move_head(snake, direction)
+ board_matrix = game_field_matrix(dimensions)
+ head_inside_board = board_matrix.include? snake_head
+ head_bite_snake = snake.include? snake_head
+ (not head_inside_board) or head_bite_snake
end
def danger?(snake, direction, dimensions)
- next_move_snake = move(snake, direction)
- first_move_danger = obstacle_ahead?(snake, direction, dimensions)
- second_move_danger = obstacle_ahead?(next_move_snake, direction, dimensions)
- first_move_danger or second_move_danger
+ snake_head = move_head(snake, direction)
+ first_move = obstacle_ahead?(snake, direction, dimensions)
+ second_move = obstacle_ahead?(snake + [snake_head], direction, dimensions)
+ first_move or second_move
end

Методи обнови решението на 19.10.2015 14:17 (преди над 9 години)

def game_field_matrix(dimensions)
game_field_column = (0...dimensions[:width] ).to_a
game_field_row = (0...dimensions[:height]).to_a
game_field_row.product game_field_column
end
def move_head(snake, direction)
Array.new(2) { |index| snake.last[index] + direction[index]}
end
+
def move(snake, direction)
grow(snake, direction).drop 1
end
def grow(snake, direction)
snake + [move_head(snake, direction)]
end
def new_food(food, snake, dimensions)
(game_field_matrix(dimensions) - food - snake).shuffle.first
end
def obstacle_ahead?(snake, direction, dimensions)
snake_head = move_head(snake, direction)
board_matrix = game_field_matrix(dimensions)
head_inside_board = board_matrix.include? snake_head
head_bite_snake = snake.include? snake_head
(not head_inside_board) or head_bite_snake
end
def danger?(snake, direction, dimensions)
snake_head = move_head(snake, direction)
first_move = obstacle_ahead?(snake, direction, dimensions)
second_move = obstacle_ahead?(snake + [snake_head], direction, dimensions)
first_move or second_move
end

Методи обнови решението на 19.10.2015 15:32 (преди над 9 години)

def game_field_matrix(dimensions)
game_field_column = (0...dimensions[:width] ).to_a
game_field_row = (0...dimensions[:height]).to_a
game_field_row.product game_field_column
end
def move_head(snake, direction)
- Array.new(2) { |index| snake.last[index] + direction[index]}
+ Array.new(2) { |index| snake.last[index] + direction[index] }
end
def move(snake, direction)
grow(snake, direction).drop 1
end
def grow(snake, direction)
snake + [move_head(snake, direction)]
end
def new_food(food, snake, dimensions)
(game_field_matrix(dimensions) - food - snake).shuffle.first
end
def obstacle_ahead?(snake, direction, dimensions)
snake_head = move_head(snake, direction)
board_matrix = game_field_matrix(dimensions)
head_inside_board = board_matrix.include? snake_head
head_bite_snake = snake.include? snake_head
(not head_inside_board) or head_bite_snake
end
def danger?(snake, direction, dimensions)
snake_head = move_head(snake, direction)
first_move = obstacle_ahead?(snake, direction, dimensions)
second_move = obstacle_ahead?(snake + [snake_head], direction, dimensions)
first_move or second_move
end