因数分解ゲーム


13

入力

単一の整数1x1015

出力

xを持つ明確な正の整数の最大数。

入力:1099511627776。出力:9.考えられる最適な要因のリスト:(1、2、4、8、16、32、64、128、4096)。

入力:127381。出力4.考えられる最適な因子のリストの1つは、(1、17、59、127)です。

この古い質問に関連しています。


9
さらにいくつかのテストケースを追加できますか?(できれば妥当なサイズです。)
Arnauld

8
ほとんどの回答に対するコメントを考えると、代わりに効率的なコードを探している場合は、これをとしてタグ付けしないでくださいcode-golf。いずれか、fastest-codeまたはfastest-algorithm今後の課題を検討してください。指定した範囲内の限られた時間内にすべての回答が本当に機能するようにしたい場合は、明示的に言及する必要があります。(そして、それがcode-golf完全に競合しないように、より小さな範囲をお勧めします。)
アーナルド

@Arnauldいいえ私はそれをコードゴルフにすることに注意しており、誰もそのために判断されません。指定された入力範囲に対してコードを実行できれば、それは素晴らしいことです。
アヌーシュ


1
以下のためのx=1, 2, ...IのGET f(x)=1, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 3, 4, 2, 3私はOEISで見つけることはありません。階乗数のレコードが表示されることは十分に明らかxです。たとえば、のxような最小のものf(x)=13はになります13!f素因数分解の指数のみに依存すると思います。ですから、見つけるためf(13^4*19^7*29^2)に単純化するかもしれませんf(2^7*3^4*5^2)
ジェッペスティグニールセン

回答:


5

Wolfram言語(Mathematica)、52バイト

Max[Length/@Cases[Subsets@Divisors@#,{a__}/;1a==#]]&

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

@attinatのおかげで4バイト節約

また、計算と計算を行う153バイトバージョンもあります。109951162777610^15

Max[Length/@Table[s=RandomSample@Flatten[Table@@@FactorInteger[#]];Last@Select[Times@@@TakeList[s,#]&/@IntegerPartitions@Length@s,DuplicateFreeQ],5!]]+1&      

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

の結果10^1512です

{1、2、4、5、10、16、25、40、50、100、125、250}


1099511627776でクラッシュ
Anush

7
@Anushクラッシュしません。メモリが必要です。メモリの制限については何も言わなかった。これはコードゴルフです
-J42161217

はい、わかりました。質問で指定された入力範囲で実際にコードを実行できればいいと思います。
アヌーシュ

6
@Anushこれはコードゴルフです。いい答えじゃない。条件を指定してください。答えは有効か無効かのどちらかです。ここでの問題は問題だと思います...たぶん、あなたはそれを「最も十分なアルゴリズム」に変更すべきでしょう
-J42161217

3
@Anush私は私の答えを編集し、あなたがそれをチェックしたい場合に本当に速くて効率的なもう1つのバージョンを追加しました
-J42161217


3

05AB1E、9バイト

非常に非効率的です。除数が多い数値の場合、TIOでタイムアウトします。

ÑæʒPQ}€gZ

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

説明

Ñ          # push a list of divisors of the input
 æ         # push the powerset of that list
  ʒPQ}     # filter, keep only the lists whose product is the input
      €g   # get the length of each
        Z  # take the maximum

TIOコードは9ではなく3を出力するようです
Anush

@Anush:これはあなたの例とは異なる数値です(多くの要因により1回タイムアウトになるため)。もっと明確な例を使用する必要があります。
エミグナ

€gZéθg同じバイト数よりも少し効率的です。
グリムミー

@Grimy:はい。ここでは大きな悪人であるフィルターなので、それほど違いはありませんが、それはもう少し効率的であることを傷つけません:)
エミグナ

2

Perl 6、38バイト

{$!=$_;+grep {$!%%$_&&($!/=$_)},1..$_}

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

除数の選択に貪欲なアプローチを取ります。


1099511627776で終了しない
アヌーシュ

6
@Anushまあ、それは最終的に終了します。一般に、プログラムのアルゴリズムが任意の入力で機能する場合、必要なだけのメモリと時間が与えられた場合、答えは有効です。これがあるので、コードゴルフ、私はアルゴリズムの複雑さ、コードの長さのためにそれを最適化していない
ジョー・キング

2

Javascript(ES6)、39バイト

f=(n,i=0)=>n%++i?n>i&&f(n,i):1+f(n/i,i)

おそらく、あちこちに保存できる数バイトがあります。因子には貪欲アルゴリズムを使用します。


2

ゼリー、9バイト

ŒPP=³ƊƇẈṀ

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

誰かのおかげで-1バイト

-2バイト、ErikTheOutgolferのおかげ


OEISのsuperseekerの入力を準備している間、私は(別のアプローチを使用しています)11バイトの可能性が高いgolfableゼリープログラムを作成し、そして私はあなたのソリューションからバイトをgolfedふりますのでゼリーの答えを投稿しそうだ。ÆE×8‘½’:2S‘(それA003056のOEIS "式"セクションの力で動作します)。免責事項:間違っている可能性がありますが、テストケースでは機能します。
私の代名詞は19年

1099511627776
Anush

@someoneは36では機能しませんが、ありがとう
-HyperNeutrino

@Anushええ、私はそれをコードゴルフしたので本当に遅いです、効率のために最適化されていません
-HyperNeutrino

1
ÆDx21


2

Brachylog、8バイト

f;?⟨⊇×⟩l

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

(単純なアプローチ、は{~×≠l}ᶠ⌉、余分な1を含む無限の数の解を生成してから、それらを除去しますます。したがって、実際に終了できません。ただし、同じバイトカウントのためです!)

入力変数を介して入力を受け取り、出力変数を介して出力します。TIOのヘッダーには、要因リストが何であるかを示すために、ほとんどのコードのコピーが含まれていますが、これはそれがなくても完全に機能します。最初に大きなサブリストを与えるため、この述語は基本的に他のほとんどの回答と同じことを行いますが、バックトラッキングのおかげで、因子の完全なパワーセットを明示的に生成およびフィルタリングすることはありません。

            The output
       l    is the length of
    ⊇       a sublist (the largest satisfying these constraints)
f           of the factors of
            the input
 ; ⟨  ⟩     which
     ×      with its elements multiplied together
  ?         is the input.


1

ガイア10 9バイト

Π=
dz↑⁇(l

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

他の場所で見られるのと同じ「アルゴリズム」に従います。数に等しい積で最長の除数パワーセットをフィルタリングし、その長さを返します。

	| helper function
Π=	| is prod(list)==n (implicit)?
	|
	| main function; implicitly takes n
dz	| divisor powerset (in decreasing order of size)
  ↑⁇	| filter by helper function
    (l	| take the first element and take the length (implicitly output)

0

ハマグリ、15バイト

p}_`nq#:;qQ@s~Q

TIOリンクはすぐに来ます(デニスがプルするとき)

基本的に@Emignaの05AB1Eソリューションの移植版。

説明

                - Implicit Q = first input
p               - Print...
 }              - The last element of...
  _             - Sorted...
   `nq          - Lengths of... (map q => q.len)
           @s   - Items in powerset of
             ~Q - Proper divisors of Q
      #         - Where... (filter)
        ;q      - Product of subset
       :        - Equals...
          Q     - Q

0

C#(Visual C#Interactive Compiler)、54バイト

int f(int n,int i=0)=>n%++i<1?1+f(n/i,i):n>i?f(n,i):0;

@vrugtehagelおよび@JoKingの回答と同じアプローチを使用します。

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


ロジックを正しく実装したと仮定すると、53バイトのソリューション(「return」キーワードを取り除くことができませんでした):オンラインで試してみてください。
私の代名詞は

1
@someoneありがとう。ただし、メタによると、関数は再利用可能でなければなりません。また、関数の外側の宣言でセミコロンを省略しても問題ないかどうかはわかりませんが、メタポストを作成することもできます。
無知の

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