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

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

Към профила на Алекс Николов

Резултати

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

Код

def new_head(snake, direction)
[snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
def move(snake, direction)
new_snake = snake.dup
new_snake.shift
new_snake << new_head(new_snake, direction)
end
def grow(snake, direction)
new_snake = snake.dup
new_snake << new_head(new_snake, direction)
end
def new_food(food, snake, dimensions)
play_field = [*0...dimensions[:width]].product [*0...dimensions[:height]]
new_food_location = (play_field - food - snake).sample
end
def obstacle_snake?(snake, direction)
snake.include? new_head(snake, direction)
end
def obstacle_wall?(snake, direction, dimensions)
small_width = new_head(snake, direction)[0] < 0
big_width = new_head(snake, direction)[0] >= dimensions[:width]
small_height = new_head(snake, direction)[1] < 0
big_height = new_head(snake, direction)[1] >= dimensions[:height]
small_width or small_height or big_width or big_height
end
def obstacle_ahead?(snake, direction, dimensions)
obstacle_snake?(snake, direction) or
obstacle_wall?(snake, direction, dimensions)
end
def danger?(snake, direction, dimensions)
moved_snake = move(snake, direction)
close_to_death = obstacle_ahead?(snake, direction, dimensions) or
obstacle_ahead?(moved_snake, direction, dimensions)
end

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

.F..................

Failures:

  1) #move moves one-position-sized snake
     Failure/Error: expect(move([[2, 2]], [-1, 0])).to eq([[1, 2]])
     NoMethodError:
       undefined method `[]' for nil:NilClass
     # /tmp/d20151026-15631-1fupfv8/solution.rb:2:in `new_head'
     # /tmp/d20151026-15631-1fupfv8/solution.rb:8:in `move'
     # /tmp/d20151026-15631-1fupfv8/spec.rb:12: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.01496 seconds
20 examples, 1 failure

Failed examples:

rspec /tmp/d20151026-15631-1fupfv8/spec.rb:11 # #move moves one-position-sized snake

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

Алекс обнови решението на 14.10.2015 23:39 (преди над 9 години)

+def new_head(snake, direction)
+ [snake.last[0] + direction[0], snake.last[1] + direction[1]]
+end
+
+def move(snake, direction)
+ new_snake = snake.dup
+ new_snake.shift
+ new_snake << new_head(new_snake, direction)
+end
+
+def grow(snake, direction)
+ new_snake = snake.dup
+ new_snake << new_head(new_snake, direction)
+end
+
+def random_pair(range_one, range_two)
+ random_number_one = rand 0...range_one
+ random_number_two = rand 0...range_two
+ [random_number_one, random_number_two]
+end
+
+def new_food(food, snake, dimensions)
+ new_food_location = random_pair(dimensions[:width], dimensions[:height])
+
+ while (snake + food).include? new_food_location
+ new_food_location = random_pair(dimensions[:width], dimensions[:height])
+ end
+
+ new_food_location
+end
+
+def obstacle_snake?(snake, direction)
+ snake.include? new_head(snake, direction)
+end
+
+def obstacle_wall?(snake, direction, dimensions)
+ small_width = new_head(snake, direction)[0] < 0
+ big_width = new_head(snake, direction)[0] >= dimensions[:width]
+ small_height = new_head(snake, direction)[1] < 0
+ big_height = new_head(snake, direction)[1] >= dimensions[:height]
+
+ small_width or small_height or big_width or big_height
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ obstacle_snake?(snake, direction) or
+ obstacle_wall?(snake, direction, dimensions)
+end
+
+def danger?(snake, direction, dimensions)
+ close_to_death = obstacle_ahead?(snake, direction, dimensions)
+ unless close_to_death
+ moved_snake = move(snake, direction)
+ close_to_death = obstacle_ahead?(moved_snake, direction, dimensions)
+ end
+ close_to_death
+end

random_number_one = rand 0...range_one

Тук можеш директно да пишеш rand range_one, макар че range_one е объркващо име. То ми казва => аз съм range, но след това създавам нов range с 0 с него(защото все пак е число, нещо по-неограничаващо като first е по-добро име)

while в new_food можеш да го пренапишеш като loop и няма да ти се налага два пъти да пишеш на колко е равна променливта. Фундаментално в new_food правиш малко излишни неща(може да се ограничиш къде проверяваш)

В danger? можеш да преизползваш някой helper и да си съкратиш доста кода

Ок, тогава проблемът е в ограниченията, не в теб(или дали това трябва да се възприема като 2 нива на влагане).

Въпреки това, имай предвид, че има малко по-хитър начин да решиш new_food без дълги цикли : ]

Алекс обнови решението на 18.10.2015 11:53 (преди над 9 години)

def new_head(snake, direction)
[snake.last[0] + direction[0], snake.last[1] + direction[1]]
end
def move(snake, direction)
new_snake = snake.dup
new_snake.shift
new_snake << new_head(new_snake, direction)
end
def grow(snake, direction)
new_snake = snake.dup
new_snake << new_head(new_snake, direction)
end
-def random_pair(range_one, range_two)
- random_number_one = rand 0...range_one
- random_number_two = rand 0...range_two
- [random_number_one, random_number_two]
-end
-
def new_food(food, snake, dimensions)
- new_food_location = random_pair(dimensions[:width], dimensions[:height])
-
- while (snake + food).include? new_food_location
- new_food_location = random_pair(dimensions[:width], dimensions[:height])
- end
-
- new_food_location
+ play_field = [*0...dimensions[:width]].product [*0...dimensions[:height]]
+ new_food_location = (play_field - food - snake).sample
end
def obstacle_snake?(snake, direction)
snake.include? new_head(snake, direction)
end
def obstacle_wall?(snake, direction, dimensions)
small_width = new_head(snake, direction)[0] < 0
big_width = new_head(snake, direction)[0] >= dimensions[:width]
small_height = new_head(snake, direction)[1] < 0
big_height = new_head(snake, direction)[1] >= dimensions[:height]
small_width or small_height or big_width or big_height
end
def obstacle_ahead?(snake, direction, dimensions)
obstacle_snake?(snake, direction) or
obstacle_wall?(snake, direction, dimensions)
end
def danger?(snake, direction, dimensions)
- close_to_death = obstacle_ahead?(snake, direction, dimensions)
- unless close_to_death
- moved_snake = move(snake, direction)
- close_to_death = obstacle_ahead?(moved_snake, direction, dimensions)
- end
- close_to_death
+ moved_snake = move(snake, direction)
+ close_to_death = obstacle_ahead?(snake, direction, dimensions) or
+ obstacle_ahead?(moved_snake, direction, dimensions)
end