Как стать автором
Обновить

Комментарии 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 на мой взгляд не очень явное условие, если предполагается что range может принимать переменную или другое число. Мое условие излишне для этого примера, соглашусь, но глобально оно мне кажется более универсальным

Тригонометрия с округлением в помощь и не нужно никаких выкалываний точек.

А потом мы кэшируем результаты и получаем решение как у автора

Если можете, напишите код в ответ на комментарий, что бы понимать о чем вы говорите. Я например на данный момент не понимаю тригонометрию. Буду благодарен за практический совет.

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]

Возможно я еще не опытен, поэтому выбрал более наглядный вариант. Но вообще реализация интересная. Получается если нам нужно увеличить радиус, мы просто расширяем кортеж r

Я, помню, в свое время битовой маской описывал направления соседей, и у меня она сразу же отвечала за границы (условно в углу там маска была только в противоположные стороны), и по биту в маске у меня была простая функция, что индексы определяла, куда можно. Также битовая маска помогала обрабатывать простые "дырки" на карте, если там были какие-то объекты

Привет, а есть какой то пример для визуального восприятия?)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории