2因子分解


14

自然数が与えられると、nプログラムまたは関数を記述して、達成に使用できるすべての可能な2つの因子乗算のリストを取得しますn。ふりの内容をよりよく理解するには、http://factornumber.com/?page = 16777216にアクセスして、次のリストnがいつ16777216取得されるかを確認します。

   2 × 8388608  
   4 × 4194304  
   8 × 2097152  
  16 × 1048576  
  32 ×  524288  
  64 ×  262144  
 128 ×  131072  
 256 ×   65536  
 512 ×   32768  
1024 ×   16384
2048 ×    8192
4096 ×    4096

ここのようなものをきれいに印刷する必要はありません。要件は、各エントリ(因子のペア)が互いに十分に区別され、各ペアの内側で、最初の因子も他から明確に区別されることです。リスト/配列を返すことを選択した場合、内部要素は、2つの要素を持つリスト/配列、またはC ++などのペアをサポートする言語の構造になりますstd::pair

1つのエントリによる乗算を出力したり、1番目の係数を2番目の係数で置き換えてエントリを繰り返したりしないでください。

勝者なし; それは言語ごとの基本コードのゴルフになります。


2
次のような小さなテストケースを追加できます30か?
コイナーリンガーをケア

1
あなたが使用することができます@cairdcoinheringaahing factornumber.comをより多くのテストケースを生成します。
ジョナサン

1
私はこの「言語ごとの」競争を見てきました。ポイントは何ですか?ほとんどのQは、言語ごとに1または2を超えることはありませんが、正しいAを1つだけ選択できます。
フェデ

5
@fedes。通常、言語間で比較する意味がないためです(つまり、JavaとJelly)。
完全に人間の

1
@totallyhumanええ、知っています。私の答えのほとんどは、FactorまたはSmalltalkにあります。ゴルフ言語に反対するチャンスはありません。多分、冗長性や定型

回答:


6

Java(OpenJDK 8)81 66 65バイト

  • オリビエグレゴワールのおかげで-15バイト。
  • -1バイト:++j<=i/j-> j++<i/j
i->{for(int j=1;j++<i/j;)if(i%j<1)System.out.println(j+" "+i/j);}

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


古いもの(参照用)

Java(OpenJDK 8)、126バイト

i->{java.util.stream.IntStream.range(2,i).filter(d->d<=i/d&&i%d==0).forEach(e->System.out.println(""+e+"x"+i/e));return null;}

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

最初のcodegolfの送信と最初のラムダの使用。将来の自己、コードを許してください。


1
素敵な最初のエントリー!PPCGへようこそ!ここでは、余分なものをすべて削除することで、66バイトまでゴルフをしました。しかし、アルゴリズムをゴルフできませんでした。
オリビエグレゴワール



5

Python 2、51バイト

f=lambda n,k=2:n/k/k*[f]and[(k,n/k)][n%k:]+f(n,k+1)

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


51バイト(1バイトはLuis Mendoに感謝)

lambda n:[(n/k,k)for k in range(1,n)if(k*k<=n)>n%k]

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


51バイト

lambda n:[(n/k,k)for k in range(1,n)if n/k/k>n%k*n]

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


の使用が好きです[f]
ジョナサンフレッチ

1
あなたが番目のバージョンで1つのバイトを保存することができますlambda n:[(n/k,k)for k in range(1,n)if(k*k<=n)>n%k]
ルイスMendo

1512518520のすべてのアプローチでのMemoryError
sergiol




3

Brachylog、8バイト

{~×≜Ċo}ᵘ

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

説明

{~×≜Ċo}ᵘ
{     }ᵘ  List the unique outputs of this predicate.
 ~×       Pick a list of integers whose product is the input.
   ≜      Force concrete values for its elements.
    Ċ     Force its length to be 2.
     o    Sort it and output the result.

一部ので、入力のために、その出力に1Sを含まないNは、それが得られる[N]の代わりに[1、N]後により間引かれます、Ċ。なぜ必要なのかよくわかりません...


1
そうでない場合には選択のポイントはありませんので、必要とされている製品の入力であるあなたが実際にリストの値を求めるない場合は、唯一の答えである長さ-2リスト:。
17

2

Japt、9バイト

â¬Å£[XZo]

オンラインでテストしてください!配列の配列を返します。最後にいくつかのヌルがあります。-R出力をより明確に表示するためにフラグが追加されました。


1
私は`-R`が...バイト数を考慮すべきだと思うので
sergiol

3
@sergiol、いいえ、この場合は、読みやすくするために出力をフォーマットするためだけのものです。
シャギー

null最後にs を除外したことを除いて、まさに私が持っていた解決策。
シャギー

2

ゼリー、8 バイト

½ḊpP⁼¥Ðf

数字を受け取り、数字のリスト(ペア)のリストを返すモナドリンク。

オンラインでお試しください!(この16777216例ではTIOでタイムアウトが発生します。これは、687億ペアのリストを作成し、正しい製品のリストにフィルターダウンするためです!)

どうやって?

½ḊpP⁼¥Ðf - Link: number, n     e.g. 144
½        - square root of n          12
 Ḋ       - dequeue*                 [2,3,4,5,6,7,8,9,10,11,12]
  p      - Cartesian product**      [[2,1],[2,2],...[2,144],[3,1],...,[3,144],...,[12,144]
      Ðf - filter keep if:
     ¥   -   last two links as a dyad (n is on the right):
   P     -     product
    ⁼    -     equals
         -                          [[2,72],[3,48],[4,36],[6,24],[8,18],[9,16],[12,12]]

* 、デキューは、暗黙的に前に演技への数値入力の範囲、およびレンジ機能暗黙的に床の入力を行うので、言うと、n=24結果が½あります4.898...。範囲は次のようになり[1,2,3,4]ます。そして、デキューされた結果は[2,3,4]

**上記と同様にp、デカルト積は、数値入力の範囲を作成します。ここで、正しい引数は、実際のデカルト積nが発生する[1,2,3,...,n]前に正しい引数になります。


2

、8バイト

tüOSze↔Ḋ

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

説明

tüOSze↔Ḋ  Implicit input, say n=30.
       Ḋ  List of divisors: [1,2,3,5,6,10,15,30]
      ↔   Reverse: [30,15,10,6,5,3,2,1]
   Sze    Zip with original: [[1,30],[2,15],[3,10],[5,6],[6,5],[10,3],[15,2],[30,1]]
 üO       Deduplicate by sort: [[1,30],[2,15],[3,10],[5,6]]
t         Drop first pair: [[2,15],[3,10],[5,6]]

2

JavaScript(ES6)、55バイト

n=>eval('for(k=1,a=[];k*++k<n;n%k||a.push([k,n/k]));a')

デモ

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


それは私6ですか、これは失敗しますか?
ニール

@Neil 「修正できます。」(報告してくれてありがとう!)
Arnauld

テストする番号を指定するにはどうすればよいですか?
sergiol


1

Python 2、59バイト

lambda N:{(n,N/n,n)[n>N/n:][:2]for n in range(2,N)if N%n<1}

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



@sergiolはい、MemoryError。Python range(2,N)はリストとして評価して保存しようとしますが、割り当てられたメモリでは不十分です。一つは、置き換える試みることができるrangexrange、これが最大のランタイムのTIOの1分を超えても、(Pythonの2の範囲ジェネレータ)。十分なメモリと時間があるマシンでは、このプログラムは終了し、正しい答えを返すはずです。
ジョナサンフレッチ



1

PHP、70バイト

文字列として(70バイト):

$i++;while($i++<sqrt($a=$argv[1])){echo !($a%$i)?" {$i}x".($a/$i):'';}

配列ダンプとして(71バイト):

$i++;while($i++<sqrt($a=$argv[1]))!($a%$i)?$b[$i]=$a/$i:'';print_r($b);

(配列を出力しなくなったため、print_rの代わりにreturn $ bを使用できるかどうかはわかりませんが、そうでない場合はここで2バイト節約できます。)

配列は次のような結果を返します。

Array
(
    [2] => 8388608
    [4] => 4194304
    [8] => 2097152
    [16] => 1048576

「リスト/配列を返すことを選択した場合」私にとって、それはあなたが適切だと思うように印刷したり返したりできることを意味します。
フェデ

考え直して、関数に対しては戻り値が有効であり、プログラムに対しては出力が有効であるべきです。関数ではなくスニペット/プログラムがあるようですので、この場合は印刷する必要があります。
フェデ

1

ゼリー、12バイト

ÆDµżUḣLHĊ$$Ḋ

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

使い方

ÆDµżUḣLHĊ$$Ḋ - Main monadic link;
             - Argument: n (integer) e.g. 30
ÆD           - Divisors                   [1, 2, 3, 5, 6, 10, 15, 30]
    U        - Reverse                    [30, 15, 10, 6, 5, 3, 2, 1]
   ż         - Interleave                 [[1, 30], [2, 15], [3, 10], [5, 6], [6, 5], [10, 3], [15, 2], [30, 1]]
         $$  - Last 3 links as a monad
      L      -   Length                   8
       H     -   Halve                    4
        Ċ    -   Ceiling                  4
     ḣ       - Take first elements        [[1, 30], [2, 15], [3, 10], [5, 6]]
           Ḋ - Dequeue                    [[2, 15], [3, 10], [5, 6]]


1

ファクター、58

さて、この質問には何らかの要因が必要です!

[ divisors dup reverse zip dup length 1 + 2 /i head rest ]

それは引用です。callスタック上の番号を使用して、スタックにassoc(ペアの配列)を残します。

すべてのインポートが言語の一部であるため、すべてのインポートがカウントされるかどうかはわかりません。これは以下を使用します:

USING: math.prime.factors sequences assocs math ;

(数えるなら、インポートが短くて長いソリューションを探す必要がありますが、これはばかげています)

一言で:

: 2-factors ( x -- a ) divisors dup reverse zip dup length 1 + 2 /i head rest ;

50 2-factors .
 --> { { 2 25 } { 5 10 } }

1

Ruby、43バイト

->n{(2..n**0.5).map{|x|[[x,n/x]][n%x]}-[p]}

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

使い方:

sqrt(n)までのすべての数について、ペアを生成し、この配列のth要素を[[x, n/x]]取得しn%xます。n%x==0これがの場合[x, n/x]、そうでない場合はnilです。完了したらnil、リストからすべて削除します。


1

パリ/ GP49 34 38バイト

n->[[d,n/d]|d<-divisors(n),d>1&d<=n/d]

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

すべてのペアに設定されたビルダー表記[d, n/d]場所dすべての約数を通るdn対象d > 1d <= n/d

alephalphaによる大幅な改善。



@alephalpha良いもの。しかし、で因数分解も出力するため、少し変更する必要がありました1
ジェッペスティグニールセン

0

ハスク14 12バイト

tumoOSe`/⁰Ḋ⁰

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

説明

tum(OSe`/⁰)Ḋ⁰  -- input ⁰, eg. 30
           Ḋ⁰  -- divisors [1..⁰]: [1,2,3,5,6,10,15,30]
  m(      )    -- map the following function (example on 10):
     Se        --   create list with 10 and ..
       `/⁰     --   .. flipped division by ⁰ (30/10): [10,3]
    O          --   sort: [3,10]
               -- [[1,30],[2,15],[3,10],[5,6],[5,6],[3,10],[2,15],[1,30]]
 u             -- remove duplicates: [[1,30],[2,15],[3,10],[5,6]]
t              -- tail: [[2,15],[3,10],[5,6]]

0

APL + WIN、32バイト

m,[.1]n÷m←(0=m|n)/m←1↓⍳⌊(n←⎕)*.5

説明:

(n←⎕) Prompts for screen input

m←(0=m|n)/m←1↓⍳⌊(n←⎕)*.5 Calculates the factors dropping the first

m,[.1]n÷ Identifies the pairs and concatenates into a list.

0

Add ++18 15バイト

L,F@pB]dBRBcE#S

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

使い方

L,   - Create a lambda function
     - Example argument:     30
  F  - Factors;     STACK = [1 2 3 5 6 10 15]
  @  - Reverse;     STACK = [15 10 6 5 3 2 1]
  p  - Pop;         STACK = [15 10 6 5 3 2]
  B] - Wrap;        STACK = [[15 10 6 5 3 2]]
  d  - Duplicate;   STACK = [[15 10 6 5 3 2] [15 10 6 5 3 2]]
  BR - Reverse;     STACK = [[15 10 6 5 3 2] [2 3 5 6 10 15]]
  Bc - Zip;         STACK = [[15 2] [10 3] [6 5] [5 6] [3 10] [2 15]]
  E# - Sort each;   STACK = [[2 15] [3 10] [5 6] [5 6] [3 10] [2 15]]
  S  - Deduplicate; STACK = [[[2 15] [3 10] [5 6]]]



0

ジュリア0.6、41バイト

~x=[(y,div(x,y))for y=2:x if x%y<1>y^2-x]

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

inbuild単項演算子~を再定義し、配列内包表記を使用して出力を構築します。

  • div(x,y) 整数の除算に必要です。 x/y5バイトを節約しますが、出力は~4=(2,2.0)です。
  • Juliaでは、比較を連鎖させて1バイト節約できます。
  • xに至るまでループすることは避けInt(floor(√x))ます。

0

APL NARS 99文字

r←f w;i;h
r←⍬⋄i←1⋄→0×⍳0≠⍴⍴w⋄→0×⍳''≡0↑w⋄→0×⍳w≠⌊w⋄→0×⍳w≠+w
A:i+←1⋄→A×⍳∼0=i∣w⋄→0×⍳i>h←w÷i⋄r←r,⊂i h⋄→A

9 + 46 + 41 + 3 = 99テスト:(何も印刷しない場合、返すものを返します⍬リストnullは「解決策なし」と見なす必要があります)

  f 101    

  f 1 2 3

  f '1'

  f '123'

  f 33 1.23

  f 1.23

  ⎕←⊃f 16777216      
   2 8388608
   4 4194304
   8 2097152
  16 1048576
  32  524288
  64  262144
 128  131072
 256   65536
 512   32768
1024   16384
2048    8192
4096    4096
  f 123
3 41 

0

Pyt67 65バイト

←ĐðĐ0↔/⅟ƖŽĐŁ₂20`ŕ3ȘĐ05Ș↔ŕ↔Đ4Ș⇹3Ș⦋ƥ⇹⁺Ɩ3ȘĐ05Ș↔ŕ↔Đ4Ș⇹3Ș⦋ƤĐ3Ș⁺ƖĐ3Ș<łĉ

これはゴルフができると確信しています。

基本的に、アルゴリズムは、入力のすべての約数のリストを生成し(nと呼びましょう)、同じリストを作成しますが、反転し、2つをインターリーブします(たとえば、n = 24の、この時点で、 1,24,2,12,3,8,4,6,6,4,8,3,12,2,24,1])、およびインデックス2から要素を配列長の半分まで印刷し、それぞれを印刷します新しい行に番号を付け、各ペアの間に余分な新しい行を入れます。

ほとんどの作業は、実際にスタックを管理することで行われます。


インクリメント機能を使用して2バイトを保存しました。


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