最大相互共素因数分解


14

定義

  • 唯一の正の公約数がの場合、2つの数値は互いに素です1
  • 数字のリストは、そのリスト内の数字のすべてのペアが互いに素である場合、相互に素です。
  • 数の因数分解 n、積がである数値のリストですn

仕事

正の数nを指定するnと、次を含まない最大長の相互に素な因数分解を出力します1

の場合n=60、答えは[3,4,5]3*4*5=60あり、それ以外の互いに素な因数分解1は長さが以上であるため3素因数分解は、分解の長です。

ルールと自由

  • 適切な入出力形式を使用できます。
  • 出力リストのエントリをソートする必要はありません。

テストケース

n   output
1   []
2   [2]
3   [3]
4   [4]
5   [5]
6   [2, 3]
7   [7]
8   [8]
9   [9]
10  [2, 5]
11  [11]
12  [3, 4]
13  [13]
14  [2, 7]
15  [3, 5]
16  [16]
17  [17]
18  [2, 9]
19  [19]
20  [4, 5]
21  [3, 7]
22  [2, 11]
23  [23]
24  [3, 8]
25  [25]
26  [2, 13]
27  [27]
28  [4, 7]
29  [29]
30  [2, 3, 5]
31  [31]
32  [32]
33  [3, 11]
34  [2, 17]
35  [5, 7]
36  [4, 9]
37  [37]
38  [2, 19]
39  [3, 13]
40  [5, 8]
41  [41]
42  [2, 3, 7]
43  [43]
44  [4, 11]
45  [5, 9]
46  [2, 23]
47  [47]
48  [3, 16]
49  [49]
50  [2, 25]
51  [3, 17]
52  [4, 13]
53  [53]
54  [2, 27]
55  [5, 11]
56  [7, 8]
57  [3, 19]
58  [2, 29]
59  [59]
60  [3, 4, 5]
61  [61]
62  [2, 31]
63  [7, 9]
64  [64]
65  [5, 13]
66  [2, 3, 11]
67  [67]
68  [4, 17]
69  [3, 23]
70  [2, 5, 7]
71  [71]
72  [8, 9]
73  [73]
74  [2, 37]
75  [3, 25]
76  [4, 19]
77  [7, 11]
78  [2, 3, 13]
79  [79]
80  [5, 16]
81  [81]
82  [2, 41]
83  [83]
84  [3, 4, 7]
85  [5, 17]
86  [2, 43]
87  [3, 29]
88  [8, 11]
89  [89]
90  [2, 5, 9]
91  [7, 13]
92  [4, 23]
93  [3, 31]
94  [2, 47]
95  [5, 19]
96  [3, 32]
97  [97]
98  [2, 49]
99  [9, 11]

得点

これはです。バイト単位の最短回答が優先されます。




より難しいフォローアップの課題:結果リストの隣接ペアのみが互いに素である必要があります。
マーティンエンダー

4
これは単に素数のべき乗の因数分解ですか?
パエロエベルマン

1
@PaŭloEbermannはい、そうです。
リーキー修道女

回答:




5

05AB1E 3 5 バイト

+2バイトのエッジケースを修正 1。パッチを提供してくれたRileyに感謝します(そしてテストスイートのおかげで、私の05ab1eはそれほど強くありません!)

ÒγP1K

テストスイート オンライン試してみてください!

どうやって?

Ò     - prime factorisation, with duplicates
 γ    - split into chunks of consecutive equal elements
  P   - product of each list
   1  - literal one
    K - removed instances of top from previous
      - implicitly display top of stack

@Adnanは、「バイト」の最適なリンクであるか、どこかにフォーマットされたコードページがありますか?
ジョナサンアラン

ええ、すべてのバイトを表示するコードページがあります。
アドナン

1
ああ、どうして見逃したのか> _ <いつもありがとう:)
ジョナサンアラン

では機能しません1
リーキー修道女

@LeakyNunの助けを借りて修正:)
ジョナサンアラン


3

ハスケル、51バイト

(2#) 整数を受け取り、リストを返す匿名関数です。

として使用し(2#) 99ます。

m#n|m>n=[]|x<-gcd(m^n)n=[x|x>1]++(m+1)#div n x
(2#)

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

最近のスクエアフリーナンバーチャレンジで使われたパワートリックに触発された。

  • m#n次の要素を生成nしますmます。
  • の場合m>n、停止し、すべての要因がすでに見つかっていると結論付けます。
  • x=gcd(m^n)nは、nその素因数がすべてにある最大の因数ですm。小さいがためていることに注意してくださいm最初にテストされ、これがされる1場合を除きmプライム。
  • x結果のリストが1でない場合はリストに含めてから、次mで再帰し、で除算nxます。なお、x及びdiv n x共通因子を持つことができません。
  • (2#)は数を取り、その因子をから探し始め2ます。

3

MATL、7バイト

&YF^1X-

オンラインでお試しください!または、すべてのテストケースを確認します

説明

80 例として入力を検討してください。

&YF    % Implicit input. Push array of unique prime factors and array of exponents
       % STACK: [2 3 5], [4 0 1]
^      % Power, element-wise
       % STACK: [16 1 5]
1      % Push 1
       % STACK: [16 1 5], 1
X-     % Set difference, keeping order. Implicitly display
       % STACK: [16 5]

編集(2017年6月9日):リリース20.1.0YFで2つの出力が変更されました:非因子素数とそれらの(ゼロ)指数はスキップされます。これは上記のコードには影響しません1X-。変更は不要ですが、削除できます。


1X-新しいリリースでは変更手段が冗長であると思います...また、それは私には共通点ではなく、セットの違いのように見えます。
Ørjanヨハンセン

@ØrjanJohansen両方とも正しい。ありがとう!
ルイスメンドー

2

ゼリー、5 バイト

ÆF*/€

テストスイート オンライン試してみてください!

どうやって?

ÆF*/€ - Main link: n
ÆF    - prime factors as [prime, exponent] pairs
   /€ - reduce €ach with:
  *   - exponentiation

あなた(残念ながら失敗)と結ぶであろう他の方法を見つけるための試みで、代替の6バイト溶液:ÆfŒgZP。トークンの数は同じですが、2バイトのアトムが多すぎます;)
HyperNeutrino

...そして、削除された05ab1eエントリと同様1に、入力1が許可されていない(空の製品を実行した結果)場合に返されます。
ジョナサンアラン

:(まあ、あれ、それを見落とした。ダーン。:P
HyperNeutrino

2

アリス、10バイト

Ifw.n$@EOK

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

残念ながら、これは再び整数I / Oとしてコードポイントを使用します。TIOリンクでテストケースは、入力され191808に分解6481及び37。このソリューションは、最大素数から最小素数の順に素数の累乗を出力するため、outputが得られることに注意してください%Q@

便宜上、同じコアアルゴリズムを使用する10進数のI / Oを備えた16バイトのソリューションを次に示します。

/O/\K
\i>fw.n$@E

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

説明

他の答えとして、これは入力を素数のべき乗に分解します。

I      Read a code point as input.
f      Compute its prime factorisation a prime/exponent pairs and push them
       to the stack in order from smallest to largest prime.
w      Remember the current IP position on the return address stack. This
       starts a loop.
  .      Duplicate the current exponent. This will be zero once all primes
         have been processed.
  n$@    Terminate the program if this was zero.
  E      Raise the prime to its corresponding power.
  O      Output the result as a character.
K      Return to the w to run the next loop iteration.

2

数学46バイト

#[[1]]^#[[2]]&/@If[#==1,#={},FactorInteger@#]&

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


いい答えですが、一部のテストケースでは出力が少し間違っています。現在、コードは出力されます {}; {2}; {3}; {2}; {5}; {2,3}; {7}; {2}; {3}; {2,5}; {11}; {2,3}; {13}; ...が、{}; {2}; {3}; {4}; {5}; {2,3}; {7}; {8}; {9}; {2,5}; {11}; {4,3}; {13}; ...代わりに出力されるはずです。
ケビンCruijssen

私はそれを修正したと思う
-J42161217

確かにTIOで動作するようです。+1ああ、PPCGへようこそ、ここはかなり新しい人です。おそらく既に見たことがありますが、そうでない場合は、Mathematicaでのゴルフのヒントを読むのが面白いかもしれません。滞在を楽しんで!:)
ケビンクルーイッセン

1
あなたがのコンポーネントにアクセスし、自分自身を見つけた場合#より#自体、あなたが使用してバイトを大幅に節約することができますApply@@@代わりに)Map/@):#^#2&@@@If...
マーティン・エンダー

1

PHP、62バイト

素数をキーとし、素数が値として使用され、入力には何も使用されていない連想配列を出力します 1

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!++$r[$i];print_r($r);

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

の出力 60

Array
(
    [2] => 2
    [3] => 1
    [5] => 1
)

PHP、82バイト

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);print_r($r);

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

1代わりに空の配列とソートされた配列が必要な場合、入力に対して何も出力しません。

for($r=[],$i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);sort($r);print_r($r);



0

miniML、47バイト

素因数分解に関わる課題はここではひどく過剰に表現されているため、標準ライブラリでの因数分解を余儀なくされています。

fun n->map(fun p->ipow(fst p)(snd p))(factor n)

minimlの「ミニ」とは、機能セットのサイズを指し、それに書かれたソースコードのサイズではないことに注意してください。


0

Ruby、61バイト

require 'prime'
->n{(2..n).select{|e|n/e.to_f%1==0&&e.prime?}}

6-7バイトのソリューションを見た後、私は本当にがっかりしています-))


0

Mathematica、24バイト

Power@@@FactorInteger@#&

悪いこと@@@*は問題ではありません。また、私が欲しい/@*@@*と実際には、変更@@@する/@@//@@@@または何との無限の家族を追加し//@///@...

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