Как улучшить код для задачи на Python?

Решил тут одну задачу на питоне, но решение кажется громоздким для нее. Хотел бы узнать, как его можно улучшить? (можно побольше объяснений)

Пытался воспользоваться модулем itertools, но не нашел там подходящего решения.

Задание:

На вход дается 2 числа: n и m

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

Пример 1:

n = 4, m = 3

Решение:

Круговой массив: 1234. При длине обхода 3 получаем интервалы: 123, 341.

Полученный путь: 13.

Пример 2:

n = 5, m = 4

Решение:

Круговой массив: 12345. При длине обхода 4 получаем интервалы: 1234, 4512, 2345, 5123, 3451.

Полученный путь: 14253.

Параметры передаются в качестве аргументов командной строки.

Например, для последнего примера на вход подаются аргументы: 5 4.

Ожидаемый вывод в консоль: 14253.

Вот то, что я накидал, но мне не нравится:

    n = int(input())
    m = int(input())
    one_List = m * [int(i) for i in range(1, n + 1)]
    two_List = [' ']
    three_List = []
    cnt = 0
    while two_List[-1] != 1:
        two_List.clear()
        for j in range(cnt, m + cnt):
            two_List.append(one_List[j])
            cnt += 1 
        two_List_copy = two_List.copy()
        three_List.append(two_List_copy)
        cnt -= 1
    for k in range(len(three_List)):
        print(three_List[k][0], end='')

Ответы (4 шт):

Автор решения: strawdog

я бы предложил почитать про модуль collections и метод deque. С ним вариант решения мог бы быть таким:

Исходные:

from collections import deque

lst = '1234'
step = 3

решение:

arr = deque(lst)
res = list(arr[0])
arr.rotate(-(step-1))
while arr[0] != lst[0]:
    res.append(arr[0])
    arr.rotate(-(step-1))

ну и res теперь будет:

['1', '3']
→ Ссылка
Автор решения: Stanislav Volodarskiy

Если вы знаете модульную арифметику, то сможете записать функцию, которая возвращает следующую цифру в пути по текущей:

def next_i(i):
    return 1 + (i + m - 2) % n

Таблица для n = 5, m = 4:

i    next_i(i)
1         4
2         5
3         1
4         2
5         3

Имея такую функцию несложно написать программу, которая начав с единицы выводит следующие цифры пока снова не встретит единицу:

n, m = map(int, input().split())

i = 1
while True:
    print(i, end='')
    i = 1 + (i + m - 2) % n
    if i == 1:
        break
print()
→ Ссылка
Автор решения: GrAnd

Можно используя генератор.
На первой итерации он всегда возвращает 1. А дальше идёт по последовательности чисел с шагом m-1. Но так как у нас не бесконечная последовательность, а "зацикленная", чтобы это сэмулировать, надо просто брать остаток от деления на длину последовательности. Но и плюс 1, т.к. последовательность в Питоне от нуля, а в задаче от единицы.
Генератор заканчивает свою работу когда очередной член последовательности будет равен 1.

def seq(n,m):
    yield 1
    for i in range(m-1, n*m, m-1):
        v = i % n + 1
        if v == 1: return
        yield v

print(list(seq(n,m)))
→ Ссылка
Автор решения: ganz

С применением itertools

start=5
end=4
import itertools

#start to string
start_str=''.join(map(str,[it for it in range(1,start+1)]))
#get all perm
allresult=itertools.permutations(start_str, end)


def checking(sequence):
    '''
    get sequence and return true if it ok
    '''
    for it in range(0,len(sequence)-1):
        if int(sequence[it])+1!=int(sequence[it+1]) :
            if sequence[it+1]=='1' and sequence[it]==str(start):
                continue
            return False
    return True

#drop wrong result
total_result=list(filter(checking,allresult))

print(total_result)
[('1', '2', '3', '4'), ('2', '3', '4', '5'), ('3', '4', '5', '1'), ('4', '5', '1', '2'), ('5', '1', '2', '3')]
→ Ссылка