(最大)5つの素数の合計


16

テレンスタオは最近、ゴールドバッハの推測の弱い形式を証明しました!それを活用しましょう!

奇数の整数を指定すると、最大5つの素数の合計としてn > 1書き込みnます。好きなように入力して、好きなように出力してください。例えば、

def g(o):
    for l in prime_range(o+1):
        if l == o:
            return l,
        for d in prime_range(l+1):
            for b in prime_range(d+1):
                if l+d+b == o:
                    return l,d,b
                for c in prime_range(b+1):
                    for h in prime_range(c+1):
                        if l+d+b+c+h == o:
                            return l,d,b,c,h

入力として整数を取り、合計がである出力として整数のリストを返すSageコードですn。タオの定理により、これは常に終了します!

入力

奇数の整数n。入力方法を決めるのはあなたですが、それがおかしい場合は説明してください。

出力

むしろオープンエンド。リストを返します。文字列を出力します。1つ、いくつか、またはすべてをGimmeします。がらくたをスタック上(GS、Pietなど)または予測可能な方法で連続した(到達可能な)メモリブロック(BFなど)に置きます。後者の場合、出力について説明します。すべての場合において、返す/印刷する/ whathaveyouはn、6未満の部分からなる素数へのパーティションの単純な表現でなければなりません。

得点

これはコードゴルフで、最小バイト数が勝ちです。

ボーナス!プログラムの「goldbach」という単語がサブシーケンスとして表示される場合(必ずしも連続している必要はありません。順序どおりです。大文字小文字は関係ありません)、プログラムは8ポイントを引きます。上記のコードはこの例です。


チェックする最初の数、奇数の整数> 1は3です。どの素数の合計が3を生成しますか?明らかなものが見えませんか?
ユーザー不明

「明白」は言語学的です。3は素数なので、1つの素数の合計です。Smartassの応答:Conwayは、3は合計7 +(-1)+(-1)+(-1)+(-1)と言います。
ブースバイ

単一の値は合計ではありません。負の値を導入するのではなく、単純に値> 3から始めることをお勧めします。
ユーザー不明

1
単一の値は合計です。 負の値に関するコメントは、明示的に述べられているように、賢明な発言でした。
ブースビー

2
「部分文字列(必ずしも連続しているわけではありません。ただ順番に...)」 これはサブシーケンスと呼ばれます。
ジョーイアダムス

回答:


3

J、29

(#~y=+/@>),{5$<0,p:i._1 p:>:y

入力がであると仮定しますy。expressionの値は、5つの素数のリストのボックスのリストまたは0の合計yです。

   y =。16
   (#〜y = + / @>)、{5 $ <0、p:i._1 p:>:y
+ ---------- + ---------- + ---------- + ---------- + ----- ----- + --------- + ---------- + ---------- + ---------- +- --------- + ---------- + ---------- + ---------- + ------- -+ --------- + ---------- + ---------- + ---------- + ---- ------ + ---------- + ---------- + ---------- + --------- + ------...
| 0 0 0 3 13 | 0 0 0 5 11 | 0 0 0 11 5 | 0 0 0 13 3 | 0 0 2 3 11 | 0 0 2 7 7 | 0 0 2 11 3 | 0 0 3 0 13 | 0 0 3 2 11 | 0 0 3 11 2 | 0 0 3 13 0 | 0 0 5 0 11 | 0 0 5 11 0 | 0 0 7 2 7 | 0 0 7 7 2 | 0 0 11 0 5 | 0 0 11 2 3 | 0 0 11 3 2 | 0 0 11 5 0 | 0 0 13 0 3 | 0 0 13 3 0 | 0 2 0 3 11 | 0 2 0 7 7 | 0 2 0 ...
+ ---------- + ---------- + ---------- + ---------- + ----- ----- + --------- + ---------- + ---------- + ---------- +- --------- + ---------- + ---------- + ---------- + ------- -+ --------- + ---------- + ---------- + ---------- + ---- ------ + ---------- + ---------- + ---------- + --------- + ------...

ボーナスポイントを獲得するのに十分な文字がありません。


うまくできました!この挑戦でJに勝る言語はないと思います。
クリスチャンルパスク

8

Mathematica、38

IntegerPartitions[n,5,Prime~Array~n,1]

WAを介して方法を見つけることができません...
ベリサリウス博士12年

1
Mathematicaにアクセスできたので、与えたすべての入力で機能しました。
ブースビー

IntegerPartitions関数が命名された場合を想像してくださいGoldbach...;)
クリスチャン・ルパスク

@ w0lfそれでも、J> _>より1多い
リクシウス

@Rixiusいいえ、その場合21点、Jより8点少ない得点になります
。– Mr.Wizard

8

C、192-8 = 184文字

「Goldbach」(句読点を除く)が連続して含まれ、「Tao」も含まれます。
合計が5素数(つまり、常に)の場合、ゼロ(16 = 0+0+0+3+13
を出力しますecho 30 | ./prog。標準入力から数値を読み取ります。

#define T(x)for(x=0;x<=s;b=&x,c(++x))
G,o,l,d,*b,a;c(h)
{(*b-1?h<3:++*b)||c(*b%--h?h:++*b);}
main(s){
    scanf("%d",&s);
    T(G)T(o)T(l)T(d)T(a)o+G+l+d+a-s?0:exit(printf("%d+%d+%d+%d+%d\n",G,o,l,d,a));
}

旧バージョン(179文字)。正確に5つの素数の合計しか見つけることができません(したがって、x <10では失敗します)。

#define T(x)for(x=2;x<s;b=&x,c(++x))
G,o,l,d,*b,a;c(h)
{h<3||c(*b%--h?h:++*b);}
main(s){
    scanf("%d",&s);
    T(G)T(o)T(l)T(d)T(a)o+G+l+d+a-s?0:exit(printf("%d+%d+%d+%d+%d\n",G,o,l,d,a));
}

説明:次の素数に
c設定*bします(素数である*b場合は自身を含む)。
Tforループを構築し、変数の1つをG,o,l,d,a次の素数に進めます。
すべてのforループ内で、合計が一致するかどうかを確認し、一致する場合は出力して終了します。


4
G,o,l,d,*b,a;c(h)いい感じです!
ジョエルコーネット

n = 3の場合、これは失敗します
ブースバイ

@boothby、あなたは正しい、それは5つ以上の素数を見つけるだけです。
ウゴレン

user_unknownにはこれに対する優れたソリューションがあります。合計のためにゼロプライムを考慮する
-boothby

@boothby、変更されました。私のロジックは自然に1を素数として扱い、0から始めるときはスキップする必要があるため、私が望む以上にコストがかかります。
ウゴレン

6

Brachylog、9バイト

~+.ṗᵐl≤5∧

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

~+.          Output (.) should sum to the input,
   ṗᵐ        consist of all primes,
     l≤5     and have length ≤ 5.
        ∧    (Don't unify that 5 with the implicit output variable.)

1
順序を変更することでバイトを保存できます。また、質問は入力が奇数であると述べていることに注意してください
-H.PWiz

1
@ H.PWizそして、このような別のもの。
エリックアウトゴルファー

4

ルビー138 124 117から8 = 109

require'mathn'
def g(o,l=[])
p l if l.inject(:+)==o#db
(l.last||1..o).each{|d|d.prime?and g(o,l+[d])if l.count<5}
end

で呼び出しg(<number>)ます。サンプル出力:

[2, 2, 2, 2, 19]
[2, 2, 3, 3, 17]
[2, 2, 3, 7, 13]
...

テスト:http : //ideone.com/rua7A


1
#dbボーナスには3行目を置くだけで十分です:achfromを取得します.each
イルマリカロネン

1
「固定出力形式」とはどういう意味ですか?これは完全にオープンです-必要に応じてスペースをnixできます。
ブースバイ

@IlmariKaronen素晴らしいヒント!投稿を編集しました。ありがとう!
クリスチャンルパスク

@boothbyこれに気づいてくれてありがとう。サンプル出力を見て、それが要件だと思いました。現在、出力形式が開いていることがわかります。更新しました。
クリスチャンルパスク

2

PHP 143 122-8 = 114

編集:出力に数バイトを保存し、明示的な関数呼び出しを削除しました。

<?function g($o,$l,$d,$b){for(;$o>=$b=gmp_intval(gmp_nextprime(+$b));)echo$b^$o?$l<4&&g($o-$b,$l+1,"$d$b,",$b-1):"$d$b
";}

展開:

<?
function g($o,$l,$d,$b){
  for(;$o>=$b=gmp_intval(gmp_nextprime(+$b));)
    echo$b^$o?$l<4&&g($o-$b,$l+1,"$d$b,",$b-1):"$d$b
";}

次の@g(<number>);サンプル出力で呼び出しますn=27

2,2,2,2,19
2,2,3,3,17
2,2,3,7,13
2,2,5,5,13
2,2,5,7,11
2,2,23
2,3,3,19
2,3,5,17
2,3,11,11
2,5,7,13
2,7,7,11
3,3,3,5,13
3,3,3,7,11
3,3,5,5,11
3,3,7,7,7
3,5,5,7,7
3,5,19
3,7,17
3,11,13
5,5,5,5,7
5,5,17
5,11,11
7,7,13

うーん...送信されたコードは機能していないようです。~õ;}最後に面白いものがあります
...-ブースビー

〜õ(chr(245))は「\ n」の省略形です。この場合、実際には必要ありません。ソリューションから削除します。
プリモ

n = 3の場合、コードは失敗します。
ブースバイ

@boothby信じられません。n = 3の場合、数値3を出力してから終了します(3である他の素数の合計がないため)。あなたはそれが何を生み出すと期待していましたか?
プリモ

出力が表示されません。5、7、9、11のために罰金を作品 ideone.com/cMNR8は、 あなたが関数を定義し、それを呼び出すしないように自由だことに注意してください、また。
ブースビー

2

Ruby 2 -rmathn、66バイト-8 = 58

g=->o,*l{o==l.reduce(:+)?p(l):l[5]||b=Prime.each(o){|x|g[o,*l,x]}}

GolfWolfの回答に大きく基づいていますが、6歳なので、ピッキングの代わりに自分で投稿します。技術の進歩には、無料のreduce代わりに5のパーティションで停止する簡潔な方法を使用するスタビーラムダが含まれます。これは、以下のすべての素数で繰り返されます(およびを提供します)。たぶんさらに6年後には、より良い方法を使用するでしょう。injectdPrime.each(o)oachb


1

Scala 137-8 = 129

def g(o:Int)={val l=0+:(2 to o).filterNot(d=>(2 to d-1).exists(d%_==0))
for(b<-l;a<-l;c<-l;h<-l;e<-l;if(b+a+c+h+e==o))yield{(b,a,c,h,e)}}

ブースビーのヒントの後:1つの関数呼び出しを削除し、3を3とゼロの合計として解釈できるようにし、入力を出力から削除します-さらに20文字を節約します。

強調するボーナス:

def g(o:Int)= {val l = 0 + :( 2 to o).filterNot(d =>(2 to d-1).exists(d%_ == 0))for(b <-l ; a <-l; c <-l; h <-l; e <-l; if(b + a + c + h + e == o))yield {(b、a、c、h、e) }}

呼び出しと結果:

println (l(17)) 
Vector((17,0,0,2,2,13), (17,0,0,2,13,2), (17,0,0,3,3,11), ...

出力は、リストごとにxを繰り返して合計xにし、5つの加数を表示します。足りない場合は0、つまり2 + 2 + 13。

ゴルフをしていない:

// see if there is some x, such that o%x is 0.
def dividable (o:Int) = (2 to o-1).exists (x=> o % x == 0)

// +: is a kind of cons-operator for Vectors
def primelist (d: Int) = {
  val s = 0 +: (2 to d).filterNot (b => dividable (b))
  for (a <- s;
    b <- s;
    c <- s;
    h <- s;
    e <- s;
    if (a+b+c+h+e == d)) yield {(a,b,c,h,e)}
}

私はScalaに慣れていません。これはどのように呼び出されますか?ideone.comに実例を投稿できますか?
ブースバイ

IDEoneに比べて必要なボイラープレートが少ないため、単純なスカラで実行する方が適切です。たとえば、呼び出しのprintln (l(17))場合。出力は通常、次のようにVector((17,0,0,2,2,13), (17,0,0,2,13,2), (17,0,0,3,3,11)なり、17が合計され、被加数が0、0(ゼロは被加数がないことを意味する)2 + 2 + 13のようになります。単純なscalaへのリンクは既にメタに文書化されています
ユーザー不明

クール、ありがとう!いくつかの文字を保存できるように見えます:yield{(d,a,...-> yield{(a,...そしての定義をgにパックすることによりfilterNot(...)。しかしながら。n = 3の場合、これは失敗します。
ブースバイ

(2 to d)代わり(2 to d-1)に実行しますが、3が3の合計であることに同意しません。セットを合計する場合、はい、空のセット、または1つの数字で構成されるセットになります。しかし、nにつながる合計を作成する-私は抗議の下でコードを変更するだけです。
ユーザー不明

あなたの答えを短くするためのあなたの頑固な拒否が高貴であるように、あなたの原因はあなたのまさに答えによって損なわれます。合計がであるリストを返しています3。そのようなものがあります(0,0,0,0,3)
ブースバイ

1

MuPAD 113-8 = 105

g:=[0,ithprime(i)$i=1..n]:f:=_for_in:f(l,g,f(d,g,f(b,g,f(a,g,f(c,g,if l+d+b+a+c=n then print(l,d,b,a,c)end)))))

このバージョンでは、すべてのソリューションのすべての順列も出力されます。

0, 0, 0, 0, 7
0, 0, 0, 2, 5
0, 0, 0, 5, 2
0, 0, 0, 7, 0
0, 0, 2, 0, 5
...

そして、はい、それは方法が長すぎるリストを作成しますg。誰も気にしない?:-)

ゴルフされていないバージョン:

g:=[0].select([$1..n],isprime):
for l in g do
  for d in g do
    for b in g do
      for a in g do
        for c in g do
          if l+d+b+a+c=n then print(l,d,b,a,c); end;
        end
      end
    end
  end
end

mupadにアクセスできません-誰かがこれが機能することを確認できますか?
ブースバイ

1

Jelly、19バイト(ただし非常に遅い-アドバイスが必要)

ÆR;0x5Œ!ḣ€5¹©S€i³ị®

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

ÆR;0x5Œ!ḣ€5¹©€i³ị®     main link, takes one argument N
ÆR                     get all the primes less than N
  ;0x5                 add zero, and then repeat the entire list 5 times
      Œ!               get all the permutations of this huge list (takes a long time!)
        ḣ€5            for each permutation, just take the first 5 numbers
                       (this gives us all possible length-5 combinations of the primes plus zero, with some repeats)
           ¹©          save that list to register
              S€       take the sum of every permutation in the list...
                i³     and find the index of our first argument N in that list of sums
                  ị®   then recall our list of permutations, and get the correct permutation at that index!

より速く、より短くするためのアイデアがあれば、教えてください!


1
12バイトṗЀ5長さ1〜5の素数のすべての組み合わせを生成します。S=¥いずれかの要素の合計がチェーンの引数と等しいかどうかをチェックし、Ðfそれらの要素のみを保持します。プライムのすべてのリストをリスト内の同じレベルに置くためだけにあります
-dylnan

今、10バイト以降Ƈの別名として追加されているЀÐf
dylnan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.