私が取り組んでいるゴルフコードパズルについてこれまでに見つけた最良の解決策には、2つのかなり太っているような呼び出しがありrange
ます。私はコードゴルフ、特にPythonが初めてなので、いくつかのヒントを使うことができます。
関連フラグメントはこれです
[x for x in range(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in range(2,x))]
最初の上限はrange
鋭いものではありません。それは少なくとも98690である必要があり、他のすべてが等しい場合(ゴルフの場合、つまり)、この上限と98690の差が小さいほど、パフォーマンスの点で優れています1。私が7 6(= 117649)を使用しているの7**6
は、私が思いつくことができる最も短いPython式であり、それが法案に合うからです。
対照的に、range
1つ目の下限と2つ目の下限はどちらもしっかりしています。IOW、これらの制限が変更されると、プログラム(現在の形式)は誤った結果を生成します。
式の一方または両方を短くする方法はありますか
range(n+1,7**6)
range(2,x)
?
ところで、この場合range
、たとえばへのエイリアスr
は何も得ません:
r=range;rr
rangerange
編集:FWIW、完全なプログラムはこれです:
p=lambda n:[x for x in range(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in range(2,x))][0]
p(n)
より大きい最小の回文素数である必要がありn
ます。また、p
再帰的であってはなりません。警告:すでに卑猥に遅いです!
1はい、わかっています。コードゴルフではパフォーマンスは重要ではありませんが、それが私が「他のすべてが等しい(ゴルフに関しては)」と書いた理由です。たとえば、私が選択したのは7**6
、すぐにはわかりませんが、パフォーマンスが低く、「ゴルフと同等の」代替手段9**9
です。私は実際にコードゴルフの試行を実行するのが好きです。つまり、コードを実行するのに何年もかかるほどパフォーマンスが低下しないようにします。もちろん、私がそれを助けることができれば。
p=lambda n:(x for x in xrange(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in xrange(2,x))).next()
。もちろん、その間、テストをに変更xrange(2,x)
しxrange(2,int(x**.5+1))
てテストを非常に高速にすることもできます。明らかに、このコードはあなたのものと同等ですが、より長く、より高速です。