from collections import* c=Counter g='_ I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX XXI XXXII XXXIII XXXIV XXXV XXXVI XXXVII XXXVIII XXXIX XL'.split() def n(a,k): if a: for i in range(max(i.count(a[0])for i in{v:k for k,v in enumerate(g)})*26+1):yield from n(a[1:],{**k,**{a:k[a]+b for a,b in c(g[i+k[a[0]]]).items()}}) else:yield k def f(q,w): for i in n(e:='ABCDEFGHIJKLMNOPQRSTUVWXYZ',c((s:=(q+w).replace(S:=' ',''))+e)): for x in range(len(k:=[j for j in i if(j in s)^1==i[j]])): r={a:b for a,b in i.items()if(a in k[:x])^1} if(all((s+''.join(g[b]+a for a,b in r.items())).count(i)==r[i]for i in r)):return q+S+', '.join(g[r[v]]+S+v for v in[*r][:-1])+S+w+S+g[r[[*r][-1]]]+S+[*r][-1] print(f('IN HAC SENTENTIA SVNT','ET')) print(f('THIS IS A TEST','A NEW TEST')) print(f('THIS SENTENCE CONTAINS','AND'))
Standard input is empty
IN HAC SENTENTIA SVNT XXXII I, V N, II H, III A, II C, III S, IV E, V T, VII V, I G, I J, I K, I L, I M, I O, I P, I Q, I R, I U, I W, IV X, I Y ET I Z THIS IS A TEST VI T, II H, XXXII I, V S, III A, IV E, II N, II W, I D, I F, I G, I J, I K, I L, I M, I O, I P, I Q, I R, I U, VI V, IV X, I Y A NEW TEST I Z THIS SENTENCE CONTAINS IV T, II H, XXXVII I, IV S, IV E, VI N, III C, II O, III A, II D, I G, I J, I K, I L, I M, I P, I Q, I R, I U, VIII V, I W, IV X, I Y AND I Z