この Julia 式で配列を作成しないようにする方法はありますか:
max((filter(n -> string(n) == reverse(string(n)), [x*y for x = 1:N, y = 1:N])))
そして、この Python ジェネレータ式と同様に動作するようにします。
max(x*y for x in range(N+1) for y in range(x, N+1) if str(x*y) == str(x*y)[::-1])
Julia バージョンは、Python の N*N/2 に対して、配列の割り当てと N*N 回の反復により、Python よりも 2.3 倍遅くなります。
編集
Julia でいくつかの実装を試した後、私が入手した最速のループ スタイル バージョンは次のとおりです。
function f(N) # 320ms for N=1000 Julia 0.2.0 i686-w64-mingw32
nMax = NaN
for x = 1:N, y = x:N
n = x*y
s = string(n)
s == reverse(s) || continue
nMax < n && (nMax = n)
end
nMax
end
しかし、改善された機能バージョンはそれほど遅れていません (2 倍のドメインを考慮した場合、わずか 14% 遅くなるか、大幅に速くなります):
function e(N) # 366ms for N=1000 Julia 0.2.0 i686-w64-mingw32
isPalindrome(n) = string(n) == reverse(string(n))
max(filter(isPalindrome, [x*y for x = 1:N, y = 1:N]))
end
isPalindrome
このページの上部にあるオリジナル バージョンと比較して、関数を定義することにより、2.6 倍の予期しないパフォーマンスの向上があります。