右およびtfeL切り捨て可能素数


11

右切り捨てプライムは、すべてのプレフィックスが(ベース10)素数である素数です。Aは左切り捨てプライムは正確にすべての接尾辞が素数である反対、である(0で始まる素数が許可されていません)。これらのシーケンスは両方とも有限です(83個の右トランケータブルがあり、4260個の左トランケータブルがあります)。

入力として単一の数値を受け入れ、n番目の右切り捨て可能な素数を生成するプログラムを作成する必要があります。ただし、プログラムが逆方向配置されて読み取られるとn番目の左切り捨て可能な素数が生成されます。

プログラムを後方に配置するには、プログラムを単語に分割し、単語の順序を逆にします。単語は、任意の数の文字で構成できます。

たとえば、次がプログラムの場合:

hello world
1234567890

以下は、可能な限り逆方向の配置として許可されます。

各文字で分割:

0987654321
dlrow olleh

空白での分割:

1234567890
world hello

任意の分割(わかりやすくするためにパイプを追加):

hel|lo w|orld
1|23456|7|8|90

908723456orld
1lo whel

プログラムを逆方向に配置する場合、他の文字と同様に、すべての空白を考慮して逆にする必要があります。

フォワードテスト入力:

1:  2
2:  3
21: 379
60: 239933
83: 73939133

後方テスト入力:

1:    2
2:    3
39:   647
187:  29173
4260: 357686312646216567629137

プログラムは妥当な時間(1分未満)で実行できる必要があります

これはので、バイト数が最も少ないプログラムが勝ちです!


番号。後のアトムlo world\n1です。改行はアトムを終了しません
ネイサンメリル

ああ、ありがとう。今手に入れた。混乱を避けるために以前の2つのコメントを削除しました
ルイスメンドー

回答:


6

ゼリー26 23 バイト

進む

Ѷp9¶7ÆR2ĿV€$ÆPÐf$ÐĿFị@

オンラインでお試しください!

言葉

Ñ p 9 7ÆR2ĿV€$ÆPÐf$ÐĿFị@

後方

7ÆR2ĿV€$ÆPÐf$ÐĿFị@¶9p¶Ñ

オンラインでお試しください!

言葉

7ÆR2ĿV€$ÆPÐf$ÐĿFị@ 9 p Ñ

使い方

すべてのJellyプログラムはリンク(Jellyが機能を引き受ける)で構成されており、ラインフィードまたはピルクロー()で区切られています。それらの最後はメインリンクです。プログラムの実行時に自動的に呼び出されます。

フォワードプログラムは次のように機能します。

Ñ                   Helper link. Unused.


p9                  Helper link. Take the Cartesian product with [1, ..., 9].


7ÆR2ĿV€$ÆPÐf$ÐĿFị@  Main link. Argument: n

7ÆR                 Yield all primes up to 7.
             ÐĿ     
            $ÐĿ     Combine the two quicklinks to the left into a monadic chain,
                    and call it repeatedly until the results are no longer unique.
                    Return the array of all intermediate results.
       $              Combine the two links to the left into a monadic chain.
   2Ŀ               Call the helper link on line 2.
     Ṿ€                 Eval each array in the product. This casts to string
                        before evaluating, thus concatenating both numbers.
        ÆPÐf        Filter by primality; keep only primes.
               F    Flatten the resulting array.
                ị@  Retrieve the element at index n.

後方プログラムはほぼ同じことを行います。違いは2つだけです。

  • メインリンクはになりÑ、その下のリンク(ラップアラウンド)、つまり、フォワードプログラムのメインリンクを呼び出します。

  • 9pp9逆デカルト積を返す代わりに。


4

Python 2、 143 139バイト

I=1
a={2}
def f(s):
 for d in'123456789':u=d[I:]+s+d*I;z=int(u);z+=z<3;z%91>0<2==pow(2,z,z)>a.add(z)<f(u)
f('')
lambda n:sorted(a)[~-n]
I=0

5つの部分で構成されます。

  1. I=1
  2. 改行
  3. a={2}…[~-n]
  4. 改行
  5. I=0

したがって、反転は単にの値を反転させることですI

説明

この関数fは、globalの値に応じて、左切り捨て可能な素数(LTP)または右切り捨て可能な素数(RTP)のいずれかで再帰検索を実行しますI。これらの値はセットに追加されaます。次に、-thをlambda n:sorted(a)[~-n]返しますn

リーフを、LTP、RTP、ゼロ以外の数字+ LTP、またはRTP +ゼロ以外の数字のいずれかとして定義しましょう。これらはすべて、f素数性をチェックしたい値です。

すべての葉で機能するFermat擬似プライムテストを設計しました。

      

(63973はCarmichael番号です。)

このテストがtrueを返す場合、zセットに追加する必要があり、a再帰的に実行する必要がありstr(z)ます。コードの責任ビットは次のとおりです。

z+=z<3;z%91>0<2==pow(2,z,z)>a.add(z)<f(u)

まず、ケースに対処したいと思いz == 2ます。ここで単純に回避し、2最初に定義するときにハードコーディングすることでこれを行いますa!(編集:そして、私たちもキャッチしても有害なことは何も起こりませんz == 1。)それで、z ≥ 3今それを仮定することができます。

いくつかの「および」を短絡連鎖比較に変換しました。最初の3つの比較は、前に成功しa.add(z)f(u)評価される必要があります。すべての役割は次のとおりです。

  1. z%91>0最初の条件をエンコードします。(63973は91で割り切れますが、91はリーフ自体ではないため、認識します。)
  2. 0<2は常に真ですが、連鎖は未満andです。
  3. 2==pow(2,z,z) 2番目の条件をエンコードします。
  4. pow(2,z,z)>a.add(z)トリガに加えて、以来、常に真でset.add戻りNone、そして整数が常によりも大きいですNone
  5. a.add(z)<f(u)再帰をトリガーします。その真理値は重要ではありません。

謝辞

  • デニスは4バイトを節約しました(u=[d+s,s+d][I]u=d[I:]+s+d*I; z==2z<3およびmod 91トリック)。ありがとう!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.