繰り返しのある組み合わせの合計


8

次の問題を解決できる最短のコードを記述します。

入力:

整数X 2 <= XX <= 100

出力:

合計がXに等しい2、3、および5(繰り返しが許可され、順序が重要)の合計の組み合わせ。

例:

入力: 8

出力:6、有効な組み合わせは次のとおりです。

3+5
5+3
2+2+2+2
2+3+3
3+2+3
3+3+2

入力: 11

出力:16、有効な組み合わせは

5+3+3
5+2+2+2
3+5+3
3+3+5
3+3+3+2
3+3+2+3
3+2+3+3
3+2+2+2+2
2+5+2+2
2+3+3+3
2+3+2+2+2
2+2+5+2
2+2+3+2+2
2+2+2+5
2+2+2+3+2
2+2+2+2+3

入力: 100

出力:1127972743581281、有効な組み合わせは...

入力と出力は、適切な形式にすることができます。各言語の最小バイト数が優先されます。標準の規則が適用されます。


1
PPCGへようこそ!残念ながら、ここではプログラミングに関する一般的な質問には答えません。ただし、スタックオーバーフローに関するヘルプを参照できる場合があります。質問する前に、必ずヘルプセンターをチェックしてください。:)
Erik the Outgolfer 2018

1
誰かがこれを挑戦に言い換えることはできますか?これは楽しいものになるからです。
Magic Octopus Urn、2018

1
@Shaggy Ugghhh ... sumその中の単語を使って課題をフィルタリングすることは、その質問を解決しようとする良い考えではありませんでした...
Magic Octopus Urn

2
コードゴルフに合うように、質問を少し書き直しました。入力の結果もからに変更1112ました16。もちろん、私があなたの意図を誤解した場合は、これを自由に修正してください
Ton Hospel

回答:




3

Pyth、9バイト

/sM{y*P30

ここでお試しください!

Pyth、16バイト

l{s.pMfqT@P30T./

ここで試してください

どうやって?

  1. 30の素因数、つまり[ 2、3、5 ]を生成し、そのパワーセットをN回繰り返し、重複要素を削除し、各リストを合計して、その中のNの発生をカウントします。

  2. 各整数パーティションpについて、pp∩primefac(30)に等しいかどうかをチェックします。この条件を満たすものだけを保持し、残りの各パーティションkについてkの順列のリストを取得し、結果のリストを1レベル平坦化し、重複排除して長さを取得します。


3

ゼリー、11バイト

5ÆRẋHŒPQḅ1ċ

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

使い方

5ÆRẋHŒPQḅ1ċ->完全なプログラム。引数:N、整数。
5ÆR-> 2と5の間のすべての素数を包括的にプッシュします。
   ẋH->このリストをN / 2回繰り返します。
     ŒP->パワーセットを生成します。
       Q->重複するエントリを削除します。
        ḅ1->それぞれを単項から変換します(つまり、各リストを合計します)
          ċ->このリストにNの出現回数をカウントします。

に置き換えることでスピードアップ³しますH(その後、6ではなく12でタイムアウトします)
Jonathan Allan

@JonathanAllan完了、ありがとう。
Xcoder氏2018

2

Perl、38バイト

含み+1のためにp

perl -pE '$_=1x$_;/^(...?|.{5})+$(?{$\++})\1/}{' <<< 11; echo

興味深いことに、\1バックトラックを強制するために使用する必要があります。通常、私は使用します^が、正規表現オプティマイザはそのためにスマートすぎるようで、結果が低すぎます。オプティマイザはすべてのバージョンで変更できるため、このトリックを使用するときは、おそらくperlのバージョン番号の指定を開始する必要があります。これはテストされましたperl 5.26.1

これ49は効率的で実際に処理できますX=100(ただしオーバーフローしますX=1991

perl -pe '$\=$F[@F]=$F[-2]+$F[-3]+$F[-5]for($F[5]=1)..$_}{' <<< 100;echo



2

R56 49 47バイト

ovsの回答からの再帰的アプローチ。ジュゼッペは、最後の2バイトを削って47にしました。

f=pryr::f(+`if`(x<5,x!=1,f(x-2)+f(x-3)+f(x-5)))

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



@Giuseppeとてもいい改善です!
rturnbull 2018

1
ああ、あなたは必要としない0単項として、(私は前にそれを考慮していない)+への意志を強制するnumericだけでなく。
ジュゼッペ

1

MATL、15バイト

:"5Zq@Z^!XsG=vs

非常に非効率的:必要なメモリは指数関数的です。

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

使い方

:"       % For each k in [1 2 ... n], where n is implicit input
  5Zq    %   Push primes up to 5, that is, [2 3 5]
  @      %   Push k
  Z^     %   Cartesian power. Gives a matrix where each row is a Cartesian k-tuple
  !Xs    %   Sum of each row
  G=     %   Compare with input, element-wise
  vs     %   Concatenate all stack contents vertically and sum
         % Implicit end. Implicit display





0

Pyth、12バイト

l{fqQsTy*P30

これはひどく非効率的で、5を超える入力のメモリ制限に達します。

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

説明

l{fqQsTy*P30
         P30   Get the prime factors of 30 [2, 3, 5].
        *   Q  Repeat them (implicit) input times.
       y       Take the power set...
  fqQsT        ... and filter the ones whose sum is the input.
l{             Count unique lists.


0

Wolfram言語(Mathematica)、43バイト

Tr[Multinomial@@@{2,3,5}~FrobeniusSolve~#]&

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

説明:FrobeniusSolve順序付けされていない合計のすべてのソリューションを計算し2a + 3b + 5c = nMultinomialそれらの合計を並べ替える方法をいくつ計算します。

または、同じバイト数で他の全員のソリューションをコピーすることもできます。

f@1=0;f[0|2|3|4]=1;f@n_:=Tr[f/@(n-{2,3,5})]

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