Решение на Втора задача от Костадин Петричков

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

Към профила на Костадин Петричков

Резултати

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

Код

def move(snake, direction)
snake.drop(1) << [snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
def grow(snake, direction)
new_x = snake.last[0] + direction[0]
new_y = snake.last[1] + direction[1]
new_snake = snake << [new_x, new_y]
end
def generate_new_food(width_of_field, height_of_field)
position_x = rand(0..width_of_field)
position_y = rand(0..height_of_field)
[position_x, position_y]
end
def food_valid_position?(food, snake, dimension_x, dimension_y)
in_food = food & [generate_new_food(dimension_x, dimension_y)]
in_snake = snake & [generate_new_food(dimension_x, dimension_y)]
in_food.empty? and in_snake.empty?
end
def new_food(food, snake, dimensions)
position_x = dimensions[:width]
position_y = dimensions[:height]
is_food_valid = food_valid_position?(food, snake, position_x, position_y)
new_food_piece = generate_new_food(position_x, position_y)
until is_food_valid
new_food_piece = generate_new_food(position_x, position_y)
is_food_valid = food_valid_position?(food, snake, position_x, position_y)
end
new_food_piece
end
def obstacle_ahead?(snake, direction, dimensions)
in_snake = snake & [direction[0], direction[1]]
next_step = move(snake, direction).last
if next_step[0] >= dimensions[:width] or next_step[1] >= dimensions[:height]
in_wall = true
else
in_wall = false
end
in_snake.empty? and in_wall == false ? false : true
end
def danger?(snake, direction, dimensions)
first_move = obstacle_ahead?(snake, direction, dimensions)
return first_move if first_move == true
obstacle_ahead?(move(snake, direction), direction, dimensions)
end

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

...F.FF..F..F.......

Failures:

  1) #grow grows snake up/right/left/down
     Failure/Error: expect(grow(snake, [1, 0])).to eq([[2, 2], [2, 3], [2, 4], [2, 5], [3, 5]])
       
       expected: [[2, 2], [2, 3], [2, 4], [2, 5], [3, 5]]
            got: [[2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 6]]
       
       (compared using ==)
     # /tmp/d20151026-15631-1eziarh/spec.rb:27:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) #grow does not mutate the given arguments
     Failure/Error: expect { grow(snake, direction) }.not_to change { snake }
       result should not have changed, but did change from [[2, 2], [2, 3], [2, 4], [2, 5]] to [[2, 2], [2, 3], [2, 4], [2, 5], [2, 6]]
     # /tmp/d20151026-15631-1eziarh/spec.rb:38:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) #new_food generates food on empty position
     Failure/Error: expect(empty_positions).to include(next_food)
       expected [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]] to include [0, 3]
     # /tmp/d20151026-15631-1eziarh/spec.rb:53:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) #new_food does not generate food on position where the snake is
     Failure/Error: expect(snake).not_to include(next_food)
       expected [[0, 1], [1, 1], [2, 1], [2, 2]] not to include [1, 1]
     # /tmp/d20151026-15631-1eziarh/spec.rb:65:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) #obstacle_ahead? returns true if snake body ahead
     Failure/Error: expect(
       
       expected: true
            got: false
       
       (compared using ==)
     # /tmp/d20151026-15631-1eziarh/spec.rb:83:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.01518 seconds
20 examples, 5 failures

Failed examples:

rspec /tmp/d20151026-15631-1eziarh/spec.rb:25 # #grow grows snake up/right/left/down
rspec /tmp/d20151026-15631-1eziarh/spec.rb:36 # #grow does not mutate the given arguments
rspec /tmp/d20151026-15631-1eziarh/spec.rb:49 # #new_food generates food on empty position
rspec /tmp/d20151026-15631-1eziarh/spec.rb:64 # #new_food does not generate food on position where the snake is
rspec /tmp/d20151026-15631-1eziarh/spec.rb:82 # #obstacle_ahead? returns true if snake body ahead

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

Костадин обнови решението на 15.10.2015 13:53 (преди над 9 години)

+dimensions = {width: 7, height: 7}
+
+snake = [[4, 5], [4, 6], [5, 6], [5, 7]]
+
+direction = [0, 1]
+
+food = [[3, 2], [1, 1], [0, 5]]
+
+def move(snake, direction)
+ snake.drop(1) << [snake.last[0] + direction[0], snake.last[1] + direction[1]]
+end
+
+# p move(snake, direction)
+
+def grow(snake, direction)
+ snake << [snake.last[0] + direction[0], snake.last[1] + direction[1]]
+end
+
+# p grow(snake, direction)
+
+def generate_new_food(width_of_field, height_of_field)
+ position_x = rand(0..width_of_field)
+ position_y = rand(0..height_of_field)
+
+ [position_x, position_y]
+end
+
+def food_valid_position?(food, snake, dimension_x, dimension_y)
+ in_food = food & [generate_new_food(dimension_x, dimension_y)]
+ in_snake = snake & [generate_new_food(dimension_x, dimension_y)]
+
+ if in_food.empty? and in_snake.empty?
+ true
+ else
+ false
+ end
+end
+
+def new_food(food, snake, dimensions)
+ position_x = dimensions[:width]
+ position_y = dimensions[:height]
+
+ is_food_valid = food_valid_position?(food, snake, position_x, position_y)
+ new_food_piece = generate_new_food(position_x, position_y)
+
+ while is_food_valid == false
+ new_food_piece = generate_new_food(position_x, position_y)
+ is_food_valid = food_valid_position?(food, snake, position_x, position_y)
+ end
+
+ food << new_food_piece
+end
+
+# p "snake: ", snake
+# p 'food: ', food
+p 'new food: ', new_food(food, snake, dimensions)
+
+def obstacle_ahead?
+
+end
+
+def danger?
+end

Костадин обнови решението на 17.10.2015 14:30 (преди над 9 години)

-dimensions = {width: 7, height: 7}
-
+dimensions = {width: 9, height: 9}
snake = [[4, 5], [4, 6], [5, 6], [5, 7]]
-
direction = [0, 1]
-
food = [[3, 2], [1, 1], [0, 5]]
def move(snake, direction)
snake.drop(1) << [snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
-# p move(snake, direction)
-
def grow(snake, direction)
snake << [snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
-# p grow(snake, direction)
-
def generate_new_food(width_of_field, height_of_field)
position_x = rand(0..width_of_field)
position_y = rand(0..height_of_field)
[position_x, position_y]
end
def food_valid_position?(food, snake, dimension_x, dimension_y)
in_food = food & [generate_new_food(dimension_x, dimension_y)]
in_snake = snake & [generate_new_food(dimension_x, dimension_y)]
- if in_food.empty? and in_snake.empty?
- true
- else
- false
- end
+ in_food.empty? and in_snake.empty? ? true : false
end
def new_food(food, snake, dimensions)
position_x = dimensions[:width]
position_y = dimensions[:height]
is_food_valid = food_valid_position?(food, snake, position_x, position_y)
new_food_piece = generate_new_food(position_x, position_y)
- while is_food_valid == false
+ unless is_food_valid
new_food_piece = generate_new_food(position_x, position_y)
is_food_valid = food_valid_position?(food, snake, position_x, position_y)
end
- food << new_food_piece
+ new_food_piece
end
-# p "snake: ", snake
-# p 'food: ', food
-p 'new food: ', new_food(food, snake, dimensions)
+def obstacle_ahead?(snake, direction, dimensions)
+ in_snake = snake & [direction[0], direction[1]]
+ next_step = move(snake, direction).last
-def obstacle_ahead?
+ if next_step[0] >= dimensions[:width] or next_step[1] >= dimensions[:height]
+ in_wall = true
+ else
+ in_wall = false
+ end
+ in_snake.empty? and in_wall == false ? false : true
end
-def danger?
-end
+def danger?(snake, direction, dimensions)
+ obstacle_ahead?(move(snake, direction), direction, dimensions)
+end

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

  • В условието пишеше, че искаме методите да не мутират подадените аргументи. Array#<< променя на място, съответно grow ще е проблематичен.
  • Отне ми известно време да разбера как работи new_food. Счупен е поне по два начина. От една страна, правиш само два опита да генерираш храна. Вероятно си имал предвид until вместо unless. Другият - всяко извикване на generate_new_food ще връща нов произволен резултат. Сътветно квадратчетата, които ще имаш за in_food, in_snake и new_food_piece най-вероятно ще са различни (освен ако не извадиш супер голям късмет).
  • За danger? искахме да проверите дали ще има потенциална колизия след един или два хода, не само след два.
  • some_boolean_value ? true : false дава същия резултат като само some_boolean_value. Аналогично за if some_condition then x = true else x = false vs x = some_condition.
  • Дефинициите на променливите в началото предполагам си ги използвал за експерименти. На нас не са ни нужни, не ги включвай.
  • Винаги индентирай с два space-a. :)

Костадин обнови решението на 18.10.2015 23:49 (преди над 9 години)

-dimensions = {width: 9, height: 9}
-snake = [[4, 5], [4, 6], [5, 6], [5, 7]]
-direction = [0, 1]
-food = [[3, 2], [1, 1], [0, 5]]
-
def move(snake, direction)
snake.drop(1) << [snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
def grow(snake, direction)
- snake << [snake.last[0] + direction[0], snake.last[1] + direction[1]]
+ new_x = snake.last[0] + direction[0]
+ new_y = snake.last[1] + direction[1]
+ new_snake = snake << [new_x, new_y]
end
def generate_new_food(width_of_field, height_of_field)
position_x = rand(0..width_of_field)
position_y = rand(0..height_of_field)
[position_x, position_y]
end
def food_valid_position?(food, snake, dimension_x, dimension_y)
in_food = food & [generate_new_food(dimension_x, dimension_y)]
in_snake = snake & [generate_new_food(dimension_x, dimension_y)]
- in_food.empty? and in_snake.empty? ? true : false
+ in_food.empty? and in_snake.empty?
end
def new_food(food, snake, dimensions)
position_x = dimensions[:width]
position_y = dimensions[:height]
is_food_valid = food_valid_position?(food, snake, position_x, position_y)
new_food_piece = generate_new_food(position_x, position_y)
- unless is_food_valid
+ until is_food_valid
new_food_piece = generate_new_food(position_x, position_y)
is_food_valid = food_valid_position?(food, snake, position_x, position_y)
end
new_food_piece
end
def obstacle_ahead?(snake, direction, dimensions)
- in_snake = snake & [direction[0], direction[1]]
- next_step = move(snake, direction).last
+ in_snake = snake & [direction[0], direction[1]]
+ next_step = move(snake, direction).last
- if next_step[0] >= dimensions[:width] or next_step[1] >= dimensions[:height]
- in_wall = true
- else
- in_wall = false
- end
+ if next_step[0] >= dimensions[:width] or next_step[1] >= dimensions[:height]
+ in_wall = true
+ else
+ in_wall = false
+ end
- in_snake.empty? and in_wall == false ? false : true
+ in_snake.empty? and in_wall == false ? false : true
end
def danger?(snake, direction, dimensions)
- obstacle_ahead?(move(snake, direction), direction, dimensions)
-end
+ if obstacle_ahead?(snake, direction, dimensions)
+ true
+ else
+ obstacle_ahead?(move(snake, direction), direction, dimensions)
+ end
+end

Костадин обнови решението на 19.10.2015 16:20 (преди над 9 години)

def move(snake, direction)
snake.drop(1) << [snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
def grow(snake, direction)
new_x = snake.last[0] + direction[0]
new_y = snake.last[1] + direction[1]
new_snake = snake << [new_x, new_y]
end
def generate_new_food(width_of_field, height_of_field)
position_x = rand(0..width_of_field)
position_y = rand(0..height_of_field)
[position_x, position_y]
end
def food_valid_position?(food, snake, dimension_x, dimension_y)
in_food = food & [generate_new_food(dimension_x, dimension_y)]
in_snake = snake & [generate_new_food(dimension_x, dimension_y)]
in_food.empty? and in_snake.empty?
end
def new_food(food, snake, dimensions)
position_x = dimensions[:width]
position_y = dimensions[:height]
is_food_valid = food_valid_position?(food, snake, position_x, position_y)
new_food_piece = generate_new_food(position_x, position_y)
until is_food_valid
new_food_piece = generate_new_food(position_x, position_y)
is_food_valid = food_valid_position?(food, snake, position_x, position_y)
end
new_food_piece
end
def obstacle_ahead?(snake, direction, dimensions)
in_snake = snake & [direction[0], direction[1]]
next_step = move(snake, direction).last
if next_step[0] >= dimensions[:width] or next_step[1] >= dimensions[:height]
in_wall = true
else
in_wall = false
end
in_snake.empty? and in_wall == false ? false : true
end
def danger?(snake, direction, dimensions)
- if obstacle_ahead?(snake, direction, dimensions)
- true
- else
- obstacle_ahead?(move(snake, direction), direction, dimensions)
- end
+ first_move = obstacle_ahead?(snake, direction, dimensions)
+ return first_move if first_move == true
+
+ obstacle_ahead?(move(snake, direction), direction, dimensions)
end