Станимир обнови решението на 14.10.2015 13:46 (преди над 9 години)
можеш да пренапишеш not on_snake and not on_food and not out_of_bounds
като not(on_snake or on_food or out_of_bounds)
За new_food
може да се пробваш с някаква комбинаторика, ако много искаш да избегнеш цикъла.
snake
в grow
остава в изходния резултат. Това значи, че някой, който викне grow
, може да промени оригиналния snake
масив. Помисли как да не се стигне дотам
snake = [[1,1],[2,1],[3,1]]
p grow(snake, [1,0]) # => [[1, 1], [2, 1], [3, 1], [4, 1]]
p snake # => [[1, 1], [2, 1], [3, 1]]
p grow(snake, [0,1]) # => [[1, 1], [2, 1], [3, 1], [3, 2]]
p snake # => [[1, 1], [2, 1], [3, 1]]
Аз ли пропускам нещо, но не виждам snake
да се променя в grow
.
От документацията за Array#+ "Concatenation — Returns a new array built by concatenating the two arrays together to produce a third array."
snake = [[2, 1], [2, 2]]
direction = [1, 0]
new_snake = grow(snake, direction)
p snake
p new_snake
snake[0][0] = 'WTF'
p snake
p new_snake
Копираш мястото на snake
, но не и елементите в него, new_snake[0] сочи на същото място, където и snake[0]
.
По принцип в задачата се иска само да не mute-ваш аргументите в своите функции, така че решението ти е ок в този смисъл(но е хубаво да имаш в предвид това поведение. Ако ти се наложи някой път да се предпазиш от такова бъркане в масива ти, може да ползваш dup
и clone
.