パイソン3.5、194 181 169 152 149 146バイト。
(2バイトの@ Sherlock9に感謝!)
def r(o,c=0):
y=[[j%i for i in range(2,100)]for j in range(o+1)]
while 1:
c+=1;z=y[-1][:c]
if z not in[f[:c]for f in y[:-1]]:break
print(z)
完全に機能し、非常に高速です。100000
出力の最小剰余シーケンスの計算には[0, 1, 0, 0, 4, 5, 0, 1, 0, 10, 4, 4]
約3秒しかかかりませんでした。入力1000000
(100万)、出力のシーケンスを計算することもでき[0, 1, 0, 0, 4, 1, 0, 1, 0, 1, 4, 1, 8, 10, 0, 9]
、約60秒かかりました。
説明
基本的にこの関数は、最初にリストを作成している何を、y
すべてでj mod i
場合j
範囲内のすべての整数である0=>7
(7を含む)は、およびi
範囲内のすべての整数です0=>100
。次に、プログラムは無限while
ループに入り、y
(y[:-1:]
)の最初から2番目のサブリスト内の各サブリストの同じ数のコンテンツをy[-1]
、listの最後のサブリスト()の同じ数のアイテムと比較しますy
。サブリストy[-1]
が他のサブリストと異なる場合、ループは中断され、正しい最小剰余シーケンスが返されます。
たとえば、入力が3の場合、次のようにy
なります。
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]]
次に、whileループに入ると、listの各サブリストをsublist y[:-1:]
の同じ数のアイテムと比較しますy[-1]
。たとえば、最初にとを比較[[0],[1],[0]]
し[1]
ます。最後のサブリストが残りにあるy
ので、それは続けて、それから比較して[[0,0],[0,1],[0,2]]
、[1,0]
。以来[1,0]
の残りの部分で、今ではありませんy
、特定の順序で、それは、最小限のリマインダー配列であり、そのため、[1,0]
正しく返されます。