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

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

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

Резултати

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

Код

def new_head(snake, direction)
new_head = snake.last.dup
new_head.map!.with_index { |element, index| element + direction[index] }
end
def move(snake, direction)
grow(snake.drop(1), direction)
end
def grow(snake, direction)
snake + [new_head(snake, direction)]
end
def new_food(food, snake, dimensions)
xs = (0...dimensions[:width]).to_a
ys = (0...dimensions[:height]).to_a
grid = xs.product(ys)
(grid - (food + snake)).sample
end
def obstacle_ahead?(snake, direction, dimensions)
next_step = new_head(snake, direction)
snake.include?(next_step) or
next_step[0] == dimensions[:width] or
next_step[1] == dimensions[:height] or
next_step[0] < 0 or
next_step[1] < 0
end
def danger?(snake, direction, dimensions)
obstacle_ahead?(snake, direction, dimensions) or
obstacle_ahead?(move(snake, direction), direction, dimensions)
end

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

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

Failures:

  1) #move moves one-position-sized snake
     Failure/Error: expect(move([[2, 2]], [-1, 0])).to eq([[1, 2]])
     TypeError:
       can't dup NilClass
     # /tmp/d20151026-15631-1khepd8/solution.rb:2:in `dup'
     # /tmp/d20151026-15631-1khepd8/solution.rb:2:in `new_head'
     # /tmp/d20151026-15631-1khepd8/solution.rb:11:in `grow'
     # /tmp/d20151026-15631-1khepd8/solution.rb:7:in `move'
     # /tmp/d20151026-15631-1khepd8/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.01488 seconds
20 examples, 1 failure

Failed examples:

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

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

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

+def move(snake, direction)
+ new_snake = snake.drop(1)
+ grow(new_snake, direction)
+end
+
+def grow(snake, direction)
+ new_head = snake.last.dup
+ new_head.map!.with_index { |element, index| element + direction[index] }
+ snake + [new_head]
+end
+
+def new_food(food, snake, dimensions)
+ xs = (0..dimensions[:width] - 1).to_a
+ ys = (0..dimensions[:height] - 1).to_a
+ grid = xs.product(ys)
+ (grid - (food + snake)).sample
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ next_step = snake.last.dup
+ next_step.map!.with_index { |element, index| element + direction[index] }
+ if snake.include?(next_step)
+ true
+ elsif next_step[0] == dimensions[:width] or
+ next_step[1] == dimensions[:height]
+ true
+ else
+ false
+ end
+end
+
+def danger?(snake, direction, dimensions)
+ obstacle_ahead?(snake, direction, dimensions) or
+ obstacle_ahead?(move(snake, direction), direction, dimensions)
+end

Няколко забележки:

  • move може да се опрости до:

      def move(snake, direction)
        grow(snake.drop(1), direction)
      end
    
  • (0..dimensions[:width] - 1) <=> (0...dimensions[:width])

  • Имаш повтаряща се логика в move и obstacle_ahead (за new_head става въпрос). Добре е да бъде изкарана в отделна функция.
  • Следното:

    if snake.include?(next_step)
      true
    elsif next_step[0] == dimensions[:width] or
          next_step[1] == dimensions[:height]
      true
    else
      false
    end
    

    се свежда до: snake.include?(next_step) or next_step[0] == dimensions[:width] or next_step[1] == dimensions[:height]

    ПП: Това не е пълната проверка, която трябва да направиш.

  • danger? трябва да се подравни така:

      def danger?(snake, direction, dimensions)
        obstacle_ahead?(snake, direction, dimensions) or
          obstacle_ahead?(move(snake, direction), direction, dimensions)
      end
    

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

+def new_head(snake, direction)
+ new_head = snake.last.dup
+ new_head.map!.with_index { |element, index| element + direction[index] }
+end
+
def move(snake, direction)
- new_snake = snake.drop(1)
- grow(new_snake, direction)
+ grow(snake.drop(1), direction)
end
def grow(snake, direction)
- new_head = snake.last.dup
- new_head.map!.with_index { |element, index| element + direction[index] }
- snake + [new_head]
+ snake + [new_head(snake, direction)]
end
def new_food(food, snake, dimensions)
- xs = (0..dimensions[:width] - 1).to_a
- ys = (0..dimensions[:height] - 1).to_a
+ xs = (0...dimensions[:width]).to_a
+ ys = (0...dimensions[:height]).to_a
grid = xs.product(ys)
(grid - (food + snake)).sample
end
def obstacle_ahead?(snake, direction, dimensions)
- next_step = snake.last.dup
- next_step.map!.with_index { |element, index| element + direction[index] }
- if snake.include?(next_step)
- true
- elsif next_step[0] == dimensions[:width] or
- next_step[1] == dimensions[:height]
- true
- else
- false
- end
+ next_step = new_head(snake, direction)
+ snake.include?(next_step) or
+ next_step[0] == dimensions[:width] or
+ next_step[1] == dimensions[:height] or
+ next_step[0] < 0 or
+ next_step[1] < 0
end
def danger?(snake, direction, dimensions)
obstacle_ahead?(snake, direction, dimensions) or
- obstacle_ahead?(move(snake, direction), direction, dimensions)
+ obstacle_ahead?(move(snake, direction), direction, dimensions)
end