回文の素数


8

私はタスクを解決しています、ここで:

入力:

整数としての数値。

出力:

整数として最も近い大きい回文素数。

私は感謝のヒントを私の解決策を短くする方法。または、アプローチの変更が有益であるかどうかの指示。

golf=lambda l,r=range:next(x for x in r(10**6)if(x==int(`x`[::-1]))&all(x%d for d in r(2,x))and x>l)

回文:

x==int(`x`[::-1])

プライム:

all(x%d for d in r(2,x))

3
これは挑戦ではないので、人々がこれに投票する前に、このようなことが話題になっています。私が疑問に思う唯一のことは、これが「パリンドローム数のチェックをより短くするにはどうすればよいですか?」という2つの別々の質問として適していなかったかどうかです。そして、「素数のチェックをより短くするにはどうすればよいですか?」(@Martin、ただし、これを確認するフィードバックが増えるまでは、そうしないでください。)
Martin Ender

@ m.buettner、ありがとう。
Martin Rajnoha 14

回答:


7

今、いくつかの本当に大きな改善のために。元のプログラムは97文字でした。

n=lambda l,r=range:next(x for x in r(10**6)if(x==int(`x`[::-1]))&all(x%d for d in r(2,x))and x>l)

以下の改善により、90文字まで取得できます。

n=lambda l,r=range:min(x for x in r(l+1,10**6)if(`x`==`x`[::-1])&all(x%d for d in r(2,x)))

回文チェックステートメントの周りのかっこを削除するトリックを使用すると、87に到達できます。

n=lambda l,r=range:min(x for x in r(l+1,10**4)if`x`==`x`[::-1]*all(x%d for d in r(2,x)))

ただし、80文字で解決策があります。それを実現するには、個々のコンポーネントではなく、全体像の変更に焦点を当てます。この時点に到達するための最も基本的な選択を再考してください。なぜラムダ?なぜフィルタリングされた範囲の最小値ですか?もっと良い方法があるかもしれません。


int()回文比較で使用することは多くの特徴です-回転するより短い方法を見ることができますか

x

そして

`x`[::-1]

同じタイプに?

また、and x>l最後のビットはたくさんのキャラクターです。短くする方法はありますか?他の何かを変更することでそれの必要性を排除しますか?

あるnext仕事のための適切な機能は?これはコードゴルフであり、ランタイムは無関係です。

しかし、素数検査機能はその場しのぎのように見えます。

また、これは見た目の美しさであり、この場合のように文字を保存しない場合の範囲の操作方法であるエイリアス関数は好きではありません。


x== x[::-1]のint 、次にインデックス[0]の... ...およびx> lについてまだ考えている
Martin Rajnoha 14

@MartinRajnohaヒント:range関数をさらに詳しく見てみましょう。
BeetDemGuise 2014

Thx、私はそれを見つけた人:)現在の状態-10chars。すごい!
Martin Rajnoha 14

@MartinRajnohaクイックリファレンスポイントとして、(短い時間でコードを調べて)12文字を削除することができました。
BeetDemGuise 14

@BeetDemGuiseあなたは私をからかっています:) OK、あなたはどうやってそれを管理しましたか?
Martin Rajnoha 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.