Решение на Втора задача от Стоян Желязков

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

Към профила на Стоян Желязков

Резултати

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

Код

def move(snake, direction)
snake.drop(1).push new_head(snake.last, direction)
end
def grow(snake, direction)
snake.dup.push new_head(snake.last, direction)
end
def new_food(food, snake, dimensions)
max_width = dimensions[:width].pred
max_height = dimensions[:height].pred
all_positions = (0..max_width).to_a.product((0..max_height).to_a)
(all_positions - (food + snake)).sample
end
def obstacle_ahead?(snake, direction, dimensions)
new_position = new_head(snake.last, direction)
snake.include? new_position or wall_collision?(new_position, dimensions)
end
def danger?(snake, direction, dimensions)
obstacle_ahead?(snake, direction, dimensions) or
obstacle_ahead?(move(snake, direction), direction, dimensions)
end
#helper methods
def new_head(current_head, direction)
[current_head[0] + direction[0], current_head[1] + direction[1]]
end
def wall_collision?(position, dimensions)
position[0] < 0 or position[0] >= dimensions[:width] or
position[1] < 0 or position[1] >= dimensions[:height]
end

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

....................

Finished in 0.01605 seconds
20 examples, 0 failures

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

Стоян обнови решението на 13.10.2015 20:30 (преди над 9 години)

+def move(snake, direction)
+ snake[1.. -1].push [
+ snake[-1][0] + direction[0],
+ snake[-1][1] + direction[1]]
+end
+
+def grow(snake, direction)
+ snake[0.. -1].push [
+ snake[-1][0] + direction[0],
+ snake[-1][1] + direction[1]]
+end
+
+def new_food(food, snake, dimensions)
+ max_width = dimensions[:width] - 1
+ max_height = dimensions[:height] - 1
+ all_positions = (0..max_width).to_a.product((0..max_height).to_a)
+ available_positions = all_positions - (food + snake)
+ available_positions[Random.new.rand(available_positions.size)]
+end
+
+def obstacle_ahead?(snake, direction, dimensions)
+ new_position = [
+ snake[-1][0] + direction[0],
+ snake[-1][0] + direction[1]]
+ ! snake.include? new_position &&
+ new_position[0] > 0 && new_position[0] <= dimensions[:width] &&
+ new_position[1] > 0 && new_position[1] <= dimensions[:height]
+end
+
+def danger?(snake, direction, dimensions)
+ moved_snake = move(snake, direction)
+ obstacle_ahead?(snake, direction, dimensions) &&
+ obstacle_ahead?(moved_snake, direction, dimensions)
+end

Като се има предвид колко рано си го предал, gj. Все пак:

  • Изглежда малко си пообъркал условията. Защо в danger? искаш и двете да са изпълнени едновременно? В obstacle_ahead? защо искаш всички да са изпълнени (което btw няма как да стане) и защо за едното имаш отрицание?
  • Порови се малко из методите на Array. Някои от нещата с индексите изглеждат леко харески както си ги написал. Със сигурност ще намериш методи, които връщат масива без първия елемент, копие на масива, първия/последния елемент, random елемент и т.н.
  • Като навържеш 5 условия може да стане малко сложно. Помисли дали ако си направиш някой друг помощен метод кодът ти няма да стане по-разбираем.

Ще пусна редакция утре, но засега: 1) "Дефинирайте функцията danger?(snake, direction, dimensions), която приема съответниете данни и проверява дали ако змията продължава да се движи в същата посока ще умре след един или два хода." 2) За obstacle_ahead? не разбирам забележката :/ 3) За Array съм убеден че си прав, ще го направя джиджано ;) 4) Глождеше ме ама си мислех, че не давате помощни методи :D

С други думи благодаря за навременната проверка :) дано и утре имате време

Даже ги окуражаваме (ако са смислени). Не случайно има ограничение от 10 метода.

  • За danger? си направил така, че проверява дали ще умре след един и два хода
  • За obstacle_ahead? - прав си, че грешно съм го прочел. В момента всъщност си написал точно обратното на това, което се иска.

Стоян обнови решението на 15.10.2015 11:38 (преди над 9 години)

def move(snake, direction)
- snake[1.. -1].push [
- snake[-1][0] + direction[0],
- snake[-1][1] + direction[1]]
+ snake.drop(1).push new_head(snake.last, direction)
end
def grow(snake, direction)
- snake[0.. -1].push [
- snake[-1][0] + direction[0],
- snake[-1][1] + direction[1]]
+ Array.new(snake).push new_head(snake.last, direction)
end
def new_food(food, snake, dimensions)
max_width = dimensions[:width] - 1
max_height = dimensions[:height] - 1
all_positions = (0..max_width).to_a.product((0..max_height).to_a)
available_positions = all_positions - (food + snake)
available_positions[Random.new.rand(available_positions.size)]
end
def obstacle_ahead?(snake, direction, dimensions)
- new_position = [
- snake[-1][0] + direction[0],
- snake[-1][0] + direction[1]]
- ! snake.include? new_position &&
- new_position[0] > 0 && new_position[0] <= dimensions[:width] &&
- new_position[1] > 0 && new_position[1] <= dimensions[:height]
+ new_position = new_head(snake.last, direction)
+ snake.include? new_position or wall_collision?(new_position, dimensions)
end
def danger?(snake, direction, dimensions)
- moved_snake = move(snake, direction)
- obstacle_ahead?(snake, direction, dimensions) &&
- obstacle_ahead?(moved_snake, direction, dimensions)
+ obstacle_ahead?(snake, direction, dimensions) ||
+ obstacle_ahead?(move(snake, direction), direction, dimensions)
+end
+
+#helper methods
+def new_head(current_head, direction)
+ [current_head[0] + direction[0],
+ current_head[1] + direction[1]]
+end
+
+def wall_collision?(position, dimensions)
+ position[0] < 0 || position[0] >= dimensions[:width] ||
+ position[1] < 0 || position[1] >= dimensions[:height]
end

Доста по-красиво :)

  • Въпреки, че Array.new върши работа, Object#dup изглежда по-добре. Хем не трябва да достъпваш класа, хем snake.dup се чете точно както искаше да го кажеш (направи копие на змията).
  • Разрови се още малко из Array. Вярвам, че ще намериш метод за вземане на произволен елемент.
  • Не смесвай така or/||. В нашия style guide сме казали, да използвате думите. Имаше дискусия по въпроса, но в никакъв случай не би следвало да използваш различните версии в еднакви ситуации. Ако супер много настояваш на ||, сложи си скобите на snake.include?-a и го използвай и там.
  • x.pred/x.next са един магнитуд по-гъзарски от x - 1/x + 1
  • Подравнявай еднакви близки конструкции на съседни редове. Примерно =-тата на първите два реда в new_food и current_head-овете в new_head. Изглежда по-подредено.

Стоян обнови решението на 16.10.2015 11:10 (преди над 9 години)

def move(snake, direction)
snake.drop(1).push new_head(snake.last, direction)
end
def grow(snake, direction)
- Array.new(snake).push new_head(snake.last, direction)
+ snake.dup.push new_head(snake.last, direction)
end
def new_food(food, snake, dimensions)
- max_width = dimensions[:width] - 1
- max_height = dimensions[:height] - 1
+ max_width = dimensions[:width].pred
+ max_height = dimensions[:height].pred
all_positions = (0..max_width).to_a.product((0..max_height).to_a)
- available_positions = all_positions - (food + snake)
- available_positions[Random.new.rand(available_positions.size)]
+ (all_positions - (food + snake)).sample
end
def obstacle_ahead?(snake, direction, dimensions)
new_position = new_head(snake.last, direction)
snake.include? new_position or wall_collision?(new_position, dimensions)
end
def danger?(snake, direction, dimensions)
- obstacle_ahead?(snake, direction, dimensions) ||
- obstacle_ahead?(move(snake, direction), direction, dimensions)
+ obstacle_ahead?(snake, direction, dimensions) or
+ obstacle_ahead?(move(snake, direction), direction, dimensions)
end
#helper methods
def new_head(current_head, direction)
- [current_head[0] + direction[0],
- current_head[1] + direction[1]]
+ [current_head[0] + direction[0], current_head[1] + direction[1]]
end
def wall_collision?(position, dimensions)
- position[0] < 0 || position[0] >= dimensions[:width] ||
- position[1] < 0 || position[1] >= dimensions[:height]
+ position[0] < 0 or position[0] >= dimensions[:width] or
+ position[1] < 0 or position[1] >= dimensions[:height]
end