素数のマッピング


19

最近、正の整数から有限のネストされたシーケンスへの全単射写像fを見つけました。この課題の目的は、選択した言語で実装することです。

マッピング

数考えるN因子とどこ。次に:

例えば:

ルール

  • このタスクを実行するための完全なプログラムまたは関数を作成できます。
  • 出力は、シーケンスとして認識可能な任意の形式にすることができます。
  • 素因数分解、素数テストなどの組み込みが許可されています。
  • 標準の抜け穴は許可されていません。
  • プログラムは、私のマシンで10分以内に最後のテストケースを完了する必要があります。
  • これはコードゴルフなので、最短のコードが勝ちです!

テストケース

  • 10{{},{{}},{}}
  • 21{{{}},{},{{}}}
  • 42{{{}},{},{{}},{}}
  • 30030{{{}},{{}},{{}},{{}},{{}},{}}
  • 44100{{{{}}},{{{}}},{{{}}},{},{}}
  • 16777215{{{{}}},{{}},{{}},{},{{}},{{}},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{{}}}
  • 16777213ペーストビン

同じ出力は、コンマなしで、シーケンスとしてまだ認識可能ですか?
デニス

@Dennisはい、括弧でわかります。
LegionMammal978

番号1はどうですか
Akangka

ああ、それは{}です。
アカンカ

1
、これは許容可能な出力フォーマットでありますか?CJamは空のリストと空の文字列を区別しないため、これはネストされた配列を表す自然な方法です。
デニス

回答:


1

Pyth、29バイト

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

デモンストレーション

これにより'、目的のマッピングを実行する関数が定義されます。

ヘルパー関数、yは、素分解を指定して再帰的にマッピングを実行します。基本ケースと素数分解はで実行され'ます。


5

CJam、51 48 44 42 41 39 34 33 31バイト

{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J

CJamインタープリターでオンラインで試してください。

3バイトのゴルフをしてくれた@MartinBüttnerに感謝します!

@PeterTaylorに3バイトのゴルフをしてくれて、さらに1枚の道を開いてくれてありがとう!

少なくとも私のコンピューターでは、プログラムの実行よりもファイルのダウンロードに時間がかかります...

I / O

これは、STDINから整数をポップして、配列をプッシュする名前付き関数です。

CJamは空の配列と空の文字列を区別しないため(文字列は単なる文字のみを含むリストです)、文字列表現は次のようになります。

[[""] "" [""] ""]

次のネストされた配列を参照

[[[]] [] [[]] []]

検証

$ wget -q pastebin.com/raw.php?i=28MmezyT -O test.ver
$ cat prime-mapping.cjam
ri
  {mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
~`
$ time cjam prime-mapping.cjam <<< 16777213 > test.out

real    0m25.116s
user    0m23.217s
sys     0m4.922s
$ diff -s <(sed 's/ //g;s/""/{}/g;y/[]/{}/' < test.out) <(tr -d , < test.ver)
Files /dev/fd/63 and /dev/fd/62 are identical

使い方

{                           }:J  Define a function (named block) J.
 mf                              Push the array of prime factors, with repeats.
   _W=                           Push a copy and extract the last, highest prime.
      )1|                        Increment and OR with 1.
         {mp},                   Push the array of primes below that integer.

                                 If 1 is the highest prime factor, this pushes
                                 [2], since (1 + 1) | 1 = 2 | 1 = 3.
                                 If 2 is the highest prime factor, this pushes
                                 [2], since (2 + 1) | 1 = 3 | 1 = 3.
                                 If p > 2 is the highest prime factor, it pushes
                                 [2 ... p], since (p + 1) | 1 = p + 2, where p + 1
                                 is even and, therefor, not a prime.

              \fe=               Count the number of occurrences of each prime
                                 in the factorization.

                                 This pushes [0] for input 1.

                  (              Shift out the first count.
                   0a*           Push a array of that many 0's.
                      +          Append it to the exponents.

                                 This pushes [] for input 1.

                       {  }%     Map; for each element in the resulting array:
                                   Increment and call J.

非難の
ペーストビン

mf e=より良い質問がサンドボックス内であった間、私は正気のテストをノックしたときに私が見つけたものよりもですが、私はあなたが使用していないが見つかっ1点の改善がよう補数のマッピングを行うことである(0a*+-すなわちri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}j。そして、私は上であなたにいくつかの時間のヘッドスタートをあげるだけでなく、はるかに大きな改善が...あります
ピーター・テイラー

@PeterTaylorゴルフとヒントをありがとう。
デニス

確かに、出力表現の変更は、実際に大きな改善でした。私はあなたのアイデアのうちの2つを使用する必要があり、あまりにも基本ケースを処理するより良い方法は、私はちょうど見つけたこれ、ですが、あなたのソリューションを打つために:{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
ピーター・テイラー

@PeterTaylorその魔法の1つ1|。再度、感謝します!
デニス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.