配列分解


13

正の整数の配列が与えられた場合、これらの整数の異なる素因数の安定した配列を出力します。言い換えると、入力の整数ごとに、その素因数を取得し、並べ替え、出力にまだない素数を出力に追加します。

テストケース

[1,2,3,4,5,6,7,8,9,10] -> [2,3,5,7]
[10,9,8,7,6,5,4,3,2,1] -> [2,5,3,7]
[100,99,98,1,2,3,4,5] -> [2,5,3,11,7]
[541,60,19,17,22] -> [541,2,3,5,19,17,11]
[1,1,2,3,5,8,13,21,34,45] -> [2,3,5,13,7,17]
[6,7,6,7,6,7,6,5] -> [2,3,7,5]
[1] -> []
[8] -> [2]
[] -> []

出力は、整数または文字列の配列またはリスト、区切られた出力、または番号の順序付きリストを出力するその他の標準手段として使用できます。

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



5
これは、「単純すぎる」と私が考える課題の1つです。ほとんどすべての答えは、次のいずれかのようになります。(b)4つの組み込みのチェーン。創造性の余地はあまりありません。答えが間違っていることを証明するかもしれませんが、私はそれを疑います。ここでは、ゴルフには素因数分解以外にほとんど何もありません。
リン

1
@Lynnはゴルフのラングではささいなことですが、他のほとんどすべてではささいなことではありません。それがここで自明性の根拠であるかどうかはわかりません:/
スティーブン

1の「異なる素因数」はどれか教えてください。
-J42161217

1
@DigitalTraumaはい。それ以外の場合は、単に「入力のすべての素因数のセットを出力する」
スティーブン

回答:



5

、3バイト

@Zgarbのおかげで1バイト節約されました。

uṁp

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


説明

uṁp完全なプログラム。

  pそれぞれの素因数。
 listリストに関数をマップし、結果を連結します。
ユニーク。 

3
Σ†することができます
-Zgarb

@Zgarbどうもありがとう。あなたが言うことができるように、それは史上初のハスクの答えです:)
Mr. Xcoder

Huskを使用している新しい人々を見るのは素晴らしいことです。:)
ズガルブ

1
:(Pそれはゼリーoutgolfs場合は特に)それは非常にいいらしい@Zgarb
氏Xcoder

5

Bash + GNUユーティリティ、37

  • @muruのおかげで21バイト節約(すごい!)
factor|tr \  \\n|awk '!/:/&&!a[$0]++'

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


1
:(前に表示されていない場合は印刷します。したがって、順序が失われることはありません)を使用して、15バイトを節約nl|sort|...できると思います。その後、少し長いコマンドを使用してコマンドを削除できます:(スペースと改行でレコードを分割し、でレコードをスキップします)、さらに4バイトを節約します。awkawk '!a[$0]++'sedawkfactor|awk '!/:/&&!a[$0]++' RS='[ \n]+':
ムル

1
私はちょうど私が使用して以前のコメントに別の2つのバイトを保存することができます実現trfactor|tr \ \\n|awk '!/:/&&!a[$0]++'(最初のバックスラッシュの後に二つのスペースです)
muru

@muru awesome-ありがとう!(これを自分の回答として投稿したとしても、私は怒っていなかったでしょう。これは私のオリジナルを大きく凌outしていました)
Digital Trauma

4

MATL、6バイト

"@Yfvu

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

説明:

"      % Loop over input
 @     % Push the array element
  Yf   % Prime factors
    v  % Concatenate entire stack vertically (does nothing the first iteration)
     u % Stably get distinct (unique, in MATLAB terminology) elements. Does so every loop but this is code golf, not fastest code.

興味深いMATLのヒント:一般に、すべての関数はベクトル(配列)に簡単に適用できます。しかし、この場合、因子の数は各入力に対して可変であり、Matlabおよび拡張によりMATLは通常正方行列のみを扱うため、forループを使用する必要がありました"

さらに、MATLには2つの主要な連結演算子があります:hおよびv、水平および垂直連結。それらの動作は大きく異なりvます。最初の反復のように要素が1つしかない場合でも、スタック全体を連結します。h正確に2つの要素を取り、1つだけが存在する場合は失敗し、このアプリケーションには不適切になります。




3

PowerShell、102バイト

param($x)$a=@();$x|%{$a+=(2..($z=$_)|?{!($z%$_)-and'1'*$_-match'^(?!(..+)\1+$)..'}|sort)};$a|select -u

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

(TessellatingHecklerの「サタン・プライムの背後にあるあなたを手に入れよう!」に関する答えからの因子分解のアイデアを借りる)

入力をリテラル配列として受け取ります$x。新しい空の配列を作成します$a。ループし$xます。各反復は2、現在の数までループし-and、それが素数であるかどうかをチェックし、次に|sortその出力であり、それをに追加し$aます。我々が通過して終わっ$xは、我々は、出力$aが、|select唯一-uそのnique番号。これは、uniqueifyが左から右に移動するという事実を利用して、問題の説明と一致する最初の出現を保持します。これらの数値はパイプラインに残り、出力は暗黙的です。


3

CJam、11バイト

{:mfe__&1-}

intの配列を受け取り、intの配列を出力する関数。

テスト版


複数の文字で出力をどのように区別しますか?少なくとも私の(オンライン)テストでは、intの配列ではなく文字列を出力します。
スティーブン

関数としては、出力データ型はintの配列です。CJamは自動的にスタックを印刷し、デリミターなしの配列を印刷します。それがあなたの目的にとって十分かどうかはわかりません。区切り記号が必要な場合はS*、閉じ括弧内に追加します。
ジオカベル

とにかく、スタックベースのlangsはToSによって出力できると信じているので、それは問題ありません。ありがとう。
スティーブン




2

Mathematica、64バイト

Select[DeleteDuplicates[First/@FactorInteger@#~Flatten~1],#>1&]&

入力

[{100、99、98、1、2、3、4、5}]


Select[#&@@@Gather[#&@@@Join@@FactorInteger@#],#>1&]&
matrix89

2

Haskell、77バイト

import Data.List
x!y|y>x=[]|x`mod`y<1=y:(x`div`y)!y|1<2=x!(y+1)
nub.((!2)=<<)

説明:

  • x!yオペレータは、すべての素因数のリストを返します。x以上になっていることをy
  • その (!2)関数は引数のすべての素因数のリストを返します。
  • 最後の行の関数は、必要な機能を実装します

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


2

Brachylog、6バイト

ḋᵐoᵐcd

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

説明

ḋᵐ         Map prime decomposition
  oᵐ       Map order
    c      Concatenate
     d     Remove duplicates

のためのFais [10,9,8,7,6,5,4,3,2,1]。それはあるべき[2, 5, 3, 7]ではない[2, 3, 5, 7]
氏Xcoder

あなたは、1バイトのためにそれを修正することができます:ḋᵐoᵐcd
氏Xcoder

@ Mr.Xcoderありがとう、修正。ただし、かなり無意味な要件です。
致命的

それは本当に無意味ではありません、それは小さくて、ささいなことです。私も自分の回答を投稿しましたが、順序の代わりに最初に逆を使用しました。なぜ素因数が逆順に生成されるのか分かりませんか?
ミスターXcoder

@Fatalize well-課題は「リストの個別の素因数をソート」するのではなく、「リストを反復処理して個別の素因数を追加する」ことです。
スティーブン


2

Japt、6バイト

mk c â

試して


説明

arrayの暗黙的な入力U。その上にマップ(m)しk、各要素の因子()を取得します。平坦化(c)、一意の要素(â)を取得し、暗黙的に出力します。


2

Pythonの3128の125 116バイト

これは純粋なPythonソリューションです。パッケージはありません。9バイトを節約してくれたHalvardに感謝します。

def f(l):y=[k for i in l for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))];print(sorted({*y},key=y.index))

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

パイソン2133の127 126バイト

def f(l):y=sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]);print sorted(set(y),key=y.index)

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

パイソン2142の138 134バイト

l=input();r=[]
for i in sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]):r+=[i]*(i not in r)
print r

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

Pythonの答えがまだなかったことに非常に驚いた。ゴルフに取り組んでいます。



@HalvardHummelおかげ
氏Xcoder

2

Deorst、16バイト

EDkE]l1FeFPkEQE_

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

Deorstチャットルームで @cairdcoinheringaahingの支援を受けて完了しました(ソリューションが異なることに注意してください)。


説明

EDkE] l1FeFPkEQE_完全なプログラム。

ED各要素の約数のリストをプッシュします。
  kスタックが並べ替えられないようにします。
   E]スタックを平らにします。
     l1Feスタックから1を削除します(cairdが急いで1プライムになったためです!)-将来の言語リリースで削除されるはずです。
         FP素数を保持します。
           kスタックが並べ替えられないようにします。
            EQ重複排除。
              E_結果を出力します。

2

Deorst、16バイト

EDkE]EQFPkl1FeE_

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

@ Mr.Xcoderの支援を受けて完了。これは、疑似ゴルフ言語には長すぎます。

使い方

EDkE]EQFPkl1FeE_ - Full program, implicit input: [1,2,3,4,5]

ED               - Get divisors. Vectorizes. STACK = [[1], [1,2], [1,3], [1,2,4], [1,5]]
  k              - Turn off sorting for the next command
   E]            - Flatten the stack. STACK = [1, 1, 2, 1, 3, 1, 2, 4, 1, 5]
     EQ          - Deduplicate stack in place. STACK = [1, 2, 3, 4, 5]
       FP        - Filter by primality 1 is considered prime. STACK = [1, 2, 3, 5]
         k       - Turn off sorting for the next command
          l1     - Push 1. STACK = [1, 2, 3, 5, 1]
            Fe   - Filter elements that are equal to the last element. STACK = [2, 3, 5]
              E_ - Output the whole stack

1

Pyke、4バイト

mPs}

ここで試してみてください!

mP   -   map(factorise, input)
  s  -  sum(^)
   } - uniquify(^)

痛い、私はあなたをひどく忍耐した-私たちは異なるアプローチを持っている良い:)
Mr Xcoder

:P 1バイトの違い。私はそれが許可されていると思うか、少なくとも最後に私が読んだコンセンサスによると
ブルー

はい、重複した回答、バイトツーバイトも許可されます
Mr. Xcoder


1

MY、17バイト

⎕Ḋḟ’⊢f(‘53ǵ'ƒf(ū←

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

どうやって?

  • 評価された入力
  • 除数(ベクトル化/ベクトル化)
  • 平らにする
  • ’⊢f(‘デクリメント、フィルター、インクリメント(削除1
  • 53ǵ''P'MYのコードページの文字列。これは素数テストです。悲しいこと0x35=53に16番目の素数であり16、スタックにプッシュするコマンドはありません> _ <。
  • ƒ 機能として
  • f( それでフィルタリング
  • ū 一意にする
  • 出力

1

C ++、118バイト

[](auto n){decltype(n)r;for(int m:n)for(int i=1,j;i++<m;){j=m%i;for(int x:r)j|=!(i%x);if(!j)r.push_back(i);}return r;}

aの入力を渡す必要があり、出力用にstd::vector<int>別の値を返しstd::vector<int>ます。




1

Pythonの2、88の 119 103バイト

さあ行こう。正しい並べ替えで。

def f(l,s=[]):[s.append(x) for x in sum([list(primefac(i)) for i in l],[]) if x not in s];print s
from primefac import*

パッケージがサポートされていないため、どうやらTIOで動作させることができません。私のマシンでも実行されます。テスト出力は次のとおりです。

f([1,2,3,4,5,6,7,8,9,10],[])     #[2, 3, 5, 7]
f([10,9,8,7,6,5,4,3,2,1],[])     #[2, 5, 3, 7]
f([100,99,98,1,2,3,4,5],[])      #[2, 5, 3, 11, 7]
f([541,60,19,17,22],[])          #[541, 2, 3, 5, 19, 17, 11]
f([1,1,2,3,5,8,13,21,34,45],[])  #[2, 3, 5, 13, 7, 17]
f([6,7,6,7,6,7,6,5],[])          #[2, 3, 7, 5]
f([1],[])                        #[]
f([8],[])                        #[2]
f([],[])                         #[]

どういうわけか、関数をラムダ関数として作成できませんでした。リストの包括性を返そうとするたびに、[なし、なし、...]が返されます。私が何かを見落としている場合、誰かがその間違いを指摘できますか?フィードバックをお寄せいただきありがとうございます!


編集:

Mr. Xcodersソートアルゴリズムを使用して、コードを16バイト削減できました。その部分をありがとう。

from primefac import*
def f(l):a=sum([list(primefac(i))for i in l],[]);print sorted(set(a),key=a.index)

これは正しいようには見えません。2番目のテストケースが出力されます[2, 5, 3, 7]。出力の順序が重要です。
Mego

sorted(set().union(*map(primefac,l)))
アレックスホール

出力の順序は重要です。説明を読み直すか、他の答えを見てください-他にどのように説明するのか本当にわかりません。
スティーブン

@スティーブン。正しい出力で更新されたルーチン。各行の違いに気付くまで、しばらく時間がかかりました。読書中に集中することは大いに役立ちます。
サイモン

@Simonは括弧の後にスペースを取り除くことで3バイトを節約しますs.append(x) for--> s.append(x)forprimefac(i)) for-> primefac(i))for[]) if->[])if
スティーブン

1

Braingolf、7バイト

&(p)u=;

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

ああ、それは基本的に4つのビルトインのチェーンです

説明

&(p)u=;  Implicit input from commandline args
 (.)     Sandbox loop, sandboxes each item in a separate stack and runs the
         code within the loop.
&        Append the entire sandboxed stack when loop ends, rather than only the
         top of stack after each iteration
  p      Prime factors
    u    Unique
     =   Print stack
      ;  Suppress implicit output

失敗し[10,9,8,7,6,5,4,3,2,1]ます。-順序が重要です:の[2, 5, 3, 7]代わりに戻る必要があり[2, 3, 5, 7]ます。
ミスターXcoder

ただし、-1バイトで修正できますKここでしか害を及ぼさないので。
ミスターXcoder

@ Mr.Xcoderそうそう、昇順ではなく、発生順になっていることに気づかなかった。修正済み
Skidsdev

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