Решение на Втора задача от Теодор Климентов

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

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

Резултати

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

Код

def next_segment(snake, direction)
snake.last.zip(direction).map { |a, b| a + b }
end
def grow(snake, direction)
snake.dup << next_segment(snake, direction)
end
def move(snake, direction)
snake[1 .. -1] << next_segment(snake, direction)
end
def new_food(food, snake, dimensions)
w, h = dimensions[:width], dimensions[:height]
all_places = (0 ... w).to_a.product (0 ... h).to_a
(all_places - food - snake).sample
end
def obstacle_ahead?(snake, direction, dimensions)
new_snake = move(snake, direction)
return true if new_snake.count(new_snake.last) > 1
x, y = new_snake.last
w, h = dimensions[:width], dimensions[:height]
not((0 ... w).include? x and (0 ... h).include? y)
end
def danger?(snake, direction, dimensions)
obstacle_ahead?(snake, direction, dimensions) or
obstacle_ahead?(move(snake, direction), direction, dimensions)
end

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

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

Failures:

  1) #obstacle_ahead? returns true if snake body ahead
     Failure/Error: expect(
       
       expected: true
            got: false
       
       (compared using ==)
     # /tmp/d20151026-15631-sqe7dr/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.01486 seconds
20 examples, 1 failure

Failed examples:

rspec /tmp/d20151026-15631-sqe7dr/spec.rb:82 # #obstacle_ahead? returns true if snake body ahead

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

Теодор обнови решението на 14.10.2015 08:44 (преди над 9 години)

+def grow(snake, direction)
+ new_segment = snake.last.zip(direction).map { |a, b| a + b }
+ snake[0 .. -1].push(new_segment)
+end
+
+def move(snake, direction)
+ grow(snake, direction).drop(1)
+end
+
+def generate_coordinates(dimensions)
+ w = Random.rand(dimensions[:width])
+ h = Random.rand(dimensions[:height])
+ [w ,h]
+end
+
+def new_food(food, snake, dimensions)
+ taken_places = snake.concat(food)
+ new_food = snake.last
+
+ while taken_places.include? new_food
+ new_food = generate_coordinates(dimensions)
+ end
+
+ new_food
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ x, y = move(snake, direction).last
+ w, h = dimensions[:width], dimensions[:height]
+ not([0 ... w].include? x and [0 ... h].include? y)
+end
+
+def danger?(snake, direction, dimensions)
+ obstacle_ahead?(snake, direction, dimensions) or
+ obstacle_ahead?(move(snake, direction), direction, dimensions)
+end

Теодор обнови решението на 14.10.2015 19:47 (преди над 9 години)

def grow(snake, direction)
new_segment = snake.last.zip(direction).map { |a, b| a + b }
snake[0 .. -1].push(new_segment)
end
def move(snake, direction)
grow(snake, direction).drop(1)
end
-def generate_coordinates(dimensions)
- w = Random.rand(dimensions[:width])
- h = Random.rand(dimensions[:height])
- [w ,h]
-end
-
def new_food(food, snake, dimensions)
- taken_places = snake.concat(food)
- new_food = snake.last
-
- while taken_places.include? new_food
- new_food = generate_coordinates(dimensions)
- end
-
- new_food
+ w, h = dimensions[:width], dimensions[:height]
+ all_places = (0 ... w).to_a.product (0 ... h).to_a
+ (all_places - food - snake).sample
end
def obstacle_ahead?(snake, direction, dimensions)
x, y = move(snake, direction).last
w, h = dimensions[:width], dimensions[:height]
- not([0 ... w].include? x and [0 ... h].include? y)
+ not((0 ... w).include? x and (0 ... h).include? y)
end
def danger?(snake, direction, dimensions)
obstacle_ahead?(snake, direction, dimensions) or
obstacle_ahead?(move(snake, direction), direction, dimensions)
end

snake[0 .. -1].push(new_segment)

предполагам, че взимаш slice, за да го копираш, но по-четимо и ясно е просто да ползваш метод за това: snake.dup изразът е по-добре е да го запишеш като snake.dup << new_segment или snake.dup + [new_segment], защото това носи повече значение на "този масив, долепен до тази стойност. Когато четеш push, очакваш, че се вкарват данни в масива, за да го ползваш по-нататък(а фактът, че връща новия удължен масив изглежда като имплементационен детайл)

Интересно решение за new_food.

move(snake, direction).last върши доста работа, само за да ти върне следващото поле : ) Помисли, дали не можеш да отделиш намирането на следващо поле, и да го преизползваш. Освен това, забележи, че се иска още нещо за obstacle_ahead?

Като цяло, добро решение, но се нуждае от още малко любов : )

Теодор обнови решението на 18.10.2015 15:37 (преди над 9 години)

+def next_segment(snake, direction)
+ snake.last.zip(direction).map { |a, b| a + b }
+end
+
def grow(snake, direction)
- new_segment = snake.last.zip(direction).map { |a, b| a + b }
- snake[0 .. -1].push(new_segment)
+ snake.dup << next_segment(snake, direction)
end
def move(snake, direction)
- grow(snake, direction).drop(1)
+ snake[1 .. -1] << next_segment(snake, direction)
end
def new_food(food, snake, dimensions)
w, h = dimensions[:width], dimensions[:height]
all_places = (0 ... w).to_a.product (0 ... h).to_a
(all_places - food - snake).sample
end
def obstacle_ahead?(snake, direction, dimensions)
- x, y = move(snake, direction).last
+ new_snake = move(snake, direction)
+ return true if new_snake.count(new_snake.last) > 1
+
+ x, y = new_snake.last
w, h = dimensions[:width], dimensions[:height]
not((0 ... w).include? x and (0 ... h).include? y)
end
def danger?(snake, direction, dimensions)
obstacle_ahead?(snake, direction, dimensions) or
obstacle_ahead?(move(snake, direction), direction, dimensions)
end