Комментарии 14
Извиняюсь, как-то прям очень много внимания уделено подробному расписыванию направлений :)
[(-1, 0), (1, 0), (0, -1), (0, 1), (-1, -1), (-1, 1), (1, -1), (1, 1)]
Любопытная задачка для новичка - попробовать сгенерить все эти числа в одном простом цикле / итераторе. Если бы не требовалось выколоть центральную клетку это было бы просто:
for i in range(9):
print(i%3-1, i//3-1)
А вот как сделать чтобы было только восемь итераций и выводились нужные 8 пар координат? Возможно тут больше одного решения :)
Это больше для наглядности, потому что я изначально без подробной демонстрации не мог понять)
Но по идее в ваш цикл можно добавить условие:
for i in range(9):
if i%3-1 == 0 and i//3-1 == 0:
continue
print(i%3-1, i//3-1)
Спасибо за комментарий, я об этом не задумывался)
зачем такое сложное условие? i == 4 достаточно
Тригонометрия с округлением в помощь и не нужно никаких выкалываний точек.
А потом мы кэшируем результаты и получаем решение как у автора
Если можете, напишите код в ответ на комментарий, что бы понимать о чем вы говорите. Я например на данный момент не понимаю тригонометрию. Буду благодарен за практический совет.
n_points = 8
step = 2.0 * math.pi / n_points
alpha = 0
for _ in range(n_points):
print(round(cos(alpha)), round(sin(alpha)))
alpha += step
например
P.S. так не стоит делать, если мы гонимся за производительностью
P.P.S. зато легко регулировать. Например, если хотим только ортогональных соседей - ставим n_point = 4. Или можно ввести радиус и смотреть не только ближайших соседей
Еще так можно:
r = (-1, 0, 1)
[(i, j) for i in r for j in r if i or j]
Я, помню, в свое время битовой маской описывал направления соседей, и у меня она сразу же отвечала за границы (условно в углу там маска была только в противоположные стороны), и по биту в маске у меня была простая функция, что индексы определяла, куда можно. Также битовая маска помогала обрабатывать простые "дырки" на карте, если там были какие-то объекты
Спасибо большое!
Благодарю, познавательно!
Поиск соседей в двумерном массиве