Я тож немного на гуанокодил.
https://pastebin.com/mD7dy53a
def build_ans(N, M, Nleft, Nright, Mleft, Mright,dir=0):
~~ansNleft = [str(i) for i in range(1,Nleft+1)]
~~ansNright = [str(i) for i in range(N-Nright+1,N+1)]
~~pocket=['..']
~~if N-Nleft-Nright!=0:
~~~~pocket = ['.'+str(N-Nright)+'.']
~~if M-Mleft-Mright!=0:
~~~~pocket = ['.'+str(N+1+Mleft)+'.']
~~if dir==0:
~~~~ansMleft = [str(i) for i in range(N+1,N+Mleft+1)]
~~~~ansMright = [str(i) for i in range(N+Mleft+1,N+M+1)]
~~~~ans_list = ansNleft+ansMleft+pocket+ansMright+ansNright
~~else:
~~~~ansMleft = [str(i) for i in range(N+1,N+Mleft+1)]
~~~~ansMright = [str(i) for i in range(N+M-Mright+1,N+M+1)]
~~~~ans_list = ansMleft+ansNleft+pocket+ansNright+ansMright
~~return ' '.join(ans_list[:])
def count_roll(p, c_max):
~~per = 2*c_max+2
~~mod_per = p % (2*c_max+2)
~~if mod_per < 2:
~~~~return c_max
~~elif mod_per == per/2 or mod_per == (per/2+1):
~~~~return 0
~~elif mod_per > 1 and mod_per < per/2:
~~~~return (c_max - (p%int((2*c_max+2)/2) - 1))
~~elif mod_per > (per/2+1):
~~~~return (p%int((2*c_max+2)/2)-1)
def calc_nc(N,M,P):
~~if N<=M:
~~~~Nrp = (P+M) // (2*M+2)
~~~~Nlp = N - (P+2*M+1) // (2*M+2)
~~~~Mrp = count_roll(P, M)
~~~~Mlp = M - Mrp
~~~~d=0
~~else:
~~~~Mlp = (P+N) // (2*N+2)
~~~~Mrp = M - (P+2*N+1) // (2*N+2)
~~~~Nlp = count_roll(P,N)
~~~~Nrp = N - Nlp
~~~~d=1
~~return Nlp,Nrp,Mlp,Mrp,d
def get_position(N,M,P):
~~if N<=M:
~~~~P_max=2*N*(1+M)-M
~~else:
~~~~P_max=2*M*(1+N)-N
~~if P >= P_max:
~~~~return build_ans(N,M,0,N,M,0)
~~elif P == 0:
~~~~return build_ans(N,M,N,0,0,M)
~~else:
~~~~Nlp,Nrp,Mlp,Mrp,d = calc_nc(N, M, P)
~~return build_ans(N,M,Nlp,Nrp,Mlp,Mrp,d)
N, M, P = map(float, input('Введите кол-во машин слева (N), справа (M) и кол-во шагов (P) через пробел\n').split())
print(get_position(int(N),int(M),int(P)))
скорость выполнения не измерял, но логика также как и у элипсиса эклипса основана на вычеслении количества машин справа и слева от кармана.