Я работаю над проблемой в CodeWars для развлечения, и у меня возникают проблемы с парой вещей:
Понимание того, где мне нужно изменить код для того, чтобыправильно управляйте «точкой поворота» m и n, чтобы они начинали уменьшаться, а не увеличиваться.
Рефакторинг этого кода соответствующим образом.
Целью алгоритма является обход 2D-списка, подобного «улитке», например,
[[1,2,3],
[4,5,6],
[7,8,9]]
должен возвращать
[1,2,3,6,9,8,7,4,5]
для любого списка размером n * n
У меня нет сильного опыта в математике или CS, но я действительно люблю оба и пытаюсь понять эти проблемы с глубиной.
Я знаю, например, что если n
представляет строки, а m
представляет столбцы 2D-списка, мне нужно увеличить минимум n
на 1 для каждой "цепи"Улитка, и уменьшите максимум m
для каждого контура, но у меня возникают проблемы с пониманием, где это должно произойти.
Я кратко рассмотрел некоторые рекурсивные решения, но прежде чем я начал углубляться в них, янадеялся, что кто-нибудь сможет взглянуть на это и помочь мне понять, где мое мышление полностью неправильно .
def snail(array):
new_snail = []
n,m = 0,0
j = 1
while j <= len(array):
print(n,m)
if n == 0 and m == 0:
while m < len(array)-j:
new_snail.append(array[n][m])
m += 1
while n < len(array)-j:
new_snail.append(array[n][m])
n += 1
else:
while m > 0:
new_snail.append(array[n][m])
m -= 1
while n > 0:
new_snail.append(array[n][m])
n -= 1
m += 1
n += 1
j+=1
return new_snail
Результат этого алгоритма в списке 3x3 2D в настоящее время [1, 2, 3, 6, 9, 8, 7, 4, 5, 4]
Это означает, что я двигаюсь назад после достижения конца.
В большом 2-мерном списке 4x4
array = [[1,2,3,4],
[4,5,6,7],
[8,9,10,11],
[12,13,14,15]]
вывод равен [1, 2, 3, 4, 7, 11, 15, 14, 13, 12, 8, 4, 5, 4, 5, 4]
, поэтому я возвращаюсь назад и вперед по1-й ряд.
Спасибо, что заглянули, и я надеюсь, что это соответствует рекомендациям для SO вопроса.Меня меньше заботит получение баллов за упражнение / правильное понимание, а также понимание того, почему мой код неправильный / плохая практика.
Обновление
Я понимаюЯ считаю, что проблема лучше, и я добился определенного прогресса, но то, что убивает меня, все еще остается в списке.Я чувствую, что я действительно слаб в этом.В конечном итоге я зашёл слишком далеко в одном направлении, и все мои решения для этого действительно сложны.
def snail(array):
new_snail = []
visited = "*"
i,j = 0,0
current_dir = "right"
def change_dir(direction):
if direction == "right":
return "down"
elif direction == "down":
return "left"
elif direction == "left":
return "up"
elif direction == "up":
return "right"
def move(ipos,jpos,direction):
i,j = ipos,jpos
if i == -1:
i += 1
elif i == len(array):
i -= 1
elif j == -1:
j +=1
elif j == len(array):
j -= 1
if direction == "right":
return i, j+1
elif direction == "down":
return i+1, j
elif direction == "left":
return i, j-1
elif direction == "up":
return i-1, j
new_snail.append(array[0][0])
array[0][0] = "*"
while len(new_snail) < len(array)**2:
i,j = move(i,j,current_dir)
if 0 <= i <= len(array)-1 and 0 <= j <= len(array)-1:
if array[i][j] != visited:
new_snail.append(array[i][j])
array[i][j] = "*"
else:
current_dir = change_dir(current_dir)
else:
current_dir = change_dir(current_dir)
return new_snail