私はjuliaで単純なone-linerを書いて少しの問題を解決しました:2桁の数字Aと3桁の数字Bを見つけて、 、X Bは、5桁の数字であり、0から9までのすべての数字が数Aのうち一度だけ表示され、B及びA X、Bは、例えば、julia one-linerをPythonと同じように最適化する
54 x 297 = 16,038
ここで、すべての可能な発見私のジュリア・コードであります解決策:
println(filter(l -> length(unique(reduce(vcat, (map(digits, l))))) == 10, [[x, y, x*y] for x in Range(10:99), y in Range(100:999)]))
これは問題を解決しますが、私はPythonで試して、これを思いついた:
print filter(lambda y: len(set(''.join([str(x) for x in y])))==10, [[x, y, x*y] for x in range(10, 99) for y in range(100, 999)])
タイミングを合わせると、私はPythonコードがjuliaコードの2倍以上の速さで実行されていることに驚きました。ジュリアコードの高速化のための提案(1ライナーにすることを推奨します)?別に
:私はrange(12, 98)
とrange(102, 987)
までの範囲の迅速な微調整との両方を向上させることができます知っています。ワンライナーを超えて移動する
更新
は、私が速くリストよりできるループアドバイスを撮影したので、私は次の選択肢と比較:
ans = Array{Tuple{Int32, Int32, Int32}}(0)
for x in 12:98
for y in 102:987
if length(unique(digits(x+y*100+x*y*100_000)))==10 push!(ans, (x, y, x*y) end
end
end
println(ans)
ジュリア
を
Python
ans = []
for x in range(12,98):
for y in range(102,987):
if len(set(str(x+y*100+x*y*100000)))==10:
ans.append((x, y, x*y))
print ans
Pythonコードは(たとえ私が両方のコードを単純にリストに集めるのではなくループ内に出力するように変更したとしても)はるかに高速です。私はジュリアからのより良いパフォーマンスを期待していた。
はまた、あなたが興味を持っている場合には、ソリューションの完全なリストは、このコードは元の1のおよそ3倍の速度である私のコンピュータで
39 x 402 = 15,678
27 x 594 = 16,038
54 x 297 = 16,038
36 x 495 = 17,820
45 x 396 = 17,820
52 x 367 = 19,084
78 x 345 = 26,910
46 x 715 = 32,890
63 x 927 = 58,401
私はこれらをコマンドラインで 'time'と計時していました。 Pythonのjuliaと 'timeit'に' @time'を使うと、Pythonコードは倍以上ではなく約65%高速ですが、それでも重要な違いがあります。 – seancarmody
'(x、y、x * y)'を '[x、y、x * y]'に置き換えると、30%の改善が得られます。 'Range(10:99)'を '10:99'に置き換えてコードを短縮することもできます。 –
ありがとうございます。興味深いことに、リストではなくタプルに変更すると、ジュリアの大幅な改善が得られますが、Pythonではごくわずかです。 – seancarmody