Summe von (höchstens) 5 Primzahlen


16

Terence Tao hat kürzlich eine schwache Form von Goldbachs Vermutung bewiesen! Lasst es uns ausnutzen!

Bei einer ungeraden Ganzzahl n > 1schreiben Sie nals Summe von bis zu 5 Primzahlen. Nehmen Sie die Eingabe, wie Sie möchten, und geben Sie die Ausgabe, wie Sie möchten. Beispielsweise,

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

is Sage-Code, der eine Ganzzahl als Eingabe annimmt und eine Liste von Ganzzahlen als Ausgabe zurückgibt, deren Summe gleich ist n. Nach dem Satz von Tao endet dies immer!

Eingang

Eine ungerade ganze Zahl n. Sie entscheiden, wie Sie die Eingabe aufnehmen, aber wenn es komisch ist, erklären Sie es.

Ausgabe

Eher offen. Gib eine Liste zurück. Einen String drucken. Gib mir eins, ein paar oder alles. Lassen Sie Mist auf vorhersehbare Weise auf dem Stapel (GS, Piet usw.) oder in einem aufeinanderfolgenden (erreichbaren) Speicherblock (BF usw.) herumliegen. Erklären Sie für diese späteren Fälle die Ausgabe. In allen Fällen sollte das, was Sie zurückgeben / drucken / was Sie haben, eine einfache Darstellung einer Aufteilung nin Primzahlen mit weniger als 6 Teilen sein.

Wertung

Dies ist Codegolf, die kleinste Anzahl an Bytes gewinnt.

Bonus! Wenn das Wort "Goldbach" als Teilfolge (nicht unbedingt aufeinanderfolgend; nur in der richtigen Reihenfolge. Groß- und Kleinschreibung spielt keine Rolle) Ihres Programms erscheint, ziehen Sie 8 Punkte ab. Der obige Code ist ein Beispiel dafür.


Die erste zu überprüfende Zahl, ungerade ganze Zahl> 1, ist 3. Welche Summe von Primzahlen ergibt 3? Sehe ich nicht das Offensichtliche?
Benutzer unbekannt

Das 'Offensichtliche' ist sprachlich. Da 3 Primzahl ist, ist es die Summe von 1 Primzahl. Smartass-Antwort: Conway würde sagen, dass 3 die Summe 7 + (-1) + (-1) + (-1) + (-1) ist.
Stand

Ein einzelner Wert ist keine Summe. Ich würde vorschlagen, einfach mit Werten> 3 zu beginnen, anstatt negative Werte einzuführen.
Benutzer unbekannt

1
Ein einzelner Wert ist eine Summe. Der Kommentar zu negativen Werten war, wie ausdrücklich erwähnt, eine kluge Bemerkung.
Stand

2
"Teilzeichenfolge (nicht unbedingt aufeinanderfolgend; nur in der richtigen Reihenfolge ...)" Dies wird als Teilzeichenfolge bezeichnet .
Joey Adams

Antworten:


3

J , 29

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

Angenommen, die Eingabe ist in y. Der Wert des Ausdrucks ist eine Liste von Feldern mit einer Liste von 5 Primzahlen oder einer Summe von 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 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 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 13 3 0 | 0 2 0 3 11 | 0 2 0 7 7 | 0 2 0 ...
+ ---------- + ---------- + ---------- + ---------- + ----- ----- + --------- + ---------- + ---------- + ---------- + - --------- + ---------- + ---------- + ---------- + ------- - + --------- + ---------- + ---------- + ---------- + ---- ------ + ---------- + ---------- + ---------- + --------- + ------...

Nicht genug Buchstaben, um Bonuspunkte zu verdienen.


schön gemacht! Ich denke, keine Sprache kann J bei dieser Herausforderung schlagen.
Cristian Lupascu

8

Mathematica , 38

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

Ich kann keinen Weg durch WA finden ...
Dr. belisarius

1
Ich habe Zugriff auf Mathematica und es hat bei allen Eingaben funktioniert, die ich gemacht habe.
Stand

Stellen Sie sich vor, die IntegerPartitionsFunktion wurde benannt Goldbach...;)
Cristian Lupascu

@ w0lf auch so, es wäre 1 mehr als J> _>
Rixius

@Rixius nein, es würde in diesem Fall 21 Punkte bringen , 8 weniger als J.
Mr.Wizard

8

C, 192-8 = 184 Zeichen

Enthält fortlaufend "Goldbach" (ohne Satzzeichen) und "Tao".
Wenn die Summe kleiner ist als 5 Primzahlen (dh immer), druckt Nullen (16 = 0+0+0+3+13)
Lesen Sie die Nummer von der Standardeingabe: 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));
}

Alte Version (179 Zeichen), die nur Summen von genau 5 Primzahlen findet (und daher für x <10 fehlschlägt):

#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));
}

Erklärung:
cSetzt *bauf die nächste Primzahl (einschließlich sich *bselbst, wenn es sich um eine Primzahl handelt).
TErstellt eine for-Schleife, mit der eine der Variablen G,o,l,d,aauf die nächste Primzahl vorgerückt wird.
In allen for-Schleifen prüfen wir, ob die Summe übereinstimmt, und drucken und beenden, falls dies der Fall ist.


4
G,o,l,d,*b,a;c(h)ist eine nette Geste!
Joel Cornett

Dies scheitert für n = 3
Stand

@boothby, du hast recht, es werden nur einige von 5 Primzahlen gefunden, nicht weniger.
Ugoren

user_unknown hat dafür eine gute Lösung: Betrachten Sie die Null-Primzahl um der Summe willen
Stand

@boothby, geändert. Hat mich mehr gekostet, als ich wollte, weil meine Logik 1 natürlich als Primzahl behandelt, und wenn ich mit 0 beginne, muss ich es überspringen.
Ugoren

6

Brachylog , 9 Bytes

~+.ṗᵐl≤5∧

Probieren Sie es online!

~+.          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
Sie können ein Byte speichern, indem Sie die Reihenfolge ändern . Beachten Sie auch, dass die Frage besagt, dass die Eingabe ungerade ist
H.PWiz

1
@ H.PWiz Und noch einer davon .
Erik der Outgolfer

4

Ruby 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

Mit anrufen g(<number>). Beispielausgabe:

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

Test: http://ideone.com/rua7A


1
Ein #dbeinfaches Setzen der Linie 3 würde für den Bonus ausreichen: Sie erhalten die achvon .each.
Ilmari Karonen

1
Was meinst du mit "festes Ausgabeformat"? Dies ist völlig offen - Sie können die Räume nixen, wenn Sie möchten.
Stand

@IlmariKaronen Toller Tipp! Ich habe meinen Beitrag bearbeitet. Vielen Dank!
Cristian Lupascu

@boothby Vielen Dank, dass Sie dies bemerkt haben. Ich habe die Beispielausgabe gesehen und dachte, es sei eine Anforderung. Ich sehe jetzt, dass das Ausgabeformat offen ist. Aktualisiert.
Cristian Lupascu

2

PHP 143 122 - 8 = 114

BEARBEITEN: Einige Bytes bei der Ausgabe gespeichert, der explizite Funktionsaufruf entfernt.

<?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
";}

Abgerollt:

<?
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
";}

Aufruf mit @g(<number>);Beispielausgabe für 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

Hmm ... Ihr eingereichter Code scheint nicht zu funktionieren. Du hast ein paar lustige Sachen ~õ;}am Ende ...
Stand

~ õ (chr (245)) steht für "\ n". In diesem Fall ist es eigentlich nicht notwendig. Ich werde es aus der Lösung entfernen.
Primo

Code schlägt für n = 3 fehl.
Stand

@boothby Ich glaube nicht, dass es das tut. Für n = 3 gibt es die Zahl 3 aus und endet dann (da es keine anderen Summen von Primzahlen gibt, die 3 sind). Was erwarteten Sie davon?
Primo

Ich sehe keine Ausgabe. Funktioniert einwandfrei für 5, 7, 9, 11. ideone.com/cMNR8 Beachten Sie auch, dass Sie die Funktion frei definieren und nicht aufrufen können.
Stand

2

Ruby 2 -rmathn, 66 Bytes - 8 = 58

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

Stark basierend auf der Antwort von GolfWolf, aber da es 6 Jahre alt ist, werde ich meine eigenen posten, anstatt zu picken. Zu den technologischen Fortschritten gehört das Stabby-Lambda, das reduceanstelle des injectfreien deine knappe Methode zum Anhalten an Partitionen von 5 verwendet und Prime.each(o)das über alle Primzahlen iteriert, die kleiner oder gleich sind o(und eine liefern ach). Vielleicht gibt es in weiteren 6 Jahren eine bessere Möglichkeit, die b.


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)}}

Nach Boothby's Tipp: Einen Funktionsaufruf eliminieren, 3 als Summe von 3 und nichts interpretieren lassen, Eingabe von Ausgabe entfernen - weitere 20 Zeichen sparen.

Bonus mit Schwerpunkt auf:

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

Aufruf und Ergebnis:

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

Die Ausgabe wiederholt x für jede Liste, um x zu addieren, und zeigt dann die 5 Summanden an. 0 für fehlenden Summanden, dh 2 + 2 + 13.

Ungolfed:

// 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)}
}

Ich kenne Scala nicht. Wie wird das aufgerufen? Können Sie ein funktionierendes Beispiel auf ideone.com posten ?
Stand

Sie sollten es besser auf simply-scala ausführen, da es weniger Boilerplate benötigt als IDEone. Zum println (l(17))Beispiel für den Aufruf . Die Ausgabe sieht normalerweise so aus Vector((17,0,0,2,2,13), (17,0,0,2,13,2), (17,0,0,3,3,11)und bedeutet: 17 soll summiert werden, und die Summanden sind 0, 0 (Null bedeutet, dass kein Summand vorhanden ist) 2 + 2 + 13. Der Link zu simply scala ist bereits auf meta
user unknown

Cool, danke! Sieht so aus, als könnten Sie einige Zeichen speichern: yield{(d,a,...-> yield{(a,...und indem Sie die Definition von gin packen filterNot(...). Jedoch. Dies schlägt für n = 3 fehl.
Stand

Haben (2 to d)statt (2 to d-1), aber ich bin nicht einverstanden , dass 3 ist die Summe von 3. Wenn Sie eine Set zusammenzufassen, ja, es kann eine leere Menge oder ein Set, bestehend aus einer Zahl. Aber eine Summe aufbauen, die zu n führt - ich ändere meinen Code nur aus Protest.
Benutzer unbekannt

So edel Ihre hartnäckige Weigerung auch sein mag, Ihre Antwort zu verkürzen, Ihre Sache wird durch Ihre Antwort selbst untergraben. Sie geben Listen zurück, deren Summe ist 3. Eine solche sollte sein (0,0,0,0,3).
Stand

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)))))

Diese Version druckt auch alle Permutationen jeder Lösung:

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
...

Und ja, es erstellt eine viel zu lange Liste g. Wen interessiert das? :-)

Ungolfed-Version:

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

Ich habe keinen Zugang zum Mupad - kann jemand überprüfen, ob dies funktioniert?
Stand

1

Jelly , 19 Bytes (aber sehr langsam - Beratung erwünscht)

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

Probieren Sie es online!

Æ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!

Wenn Sie Ideen haben, es schneller und kürzer zu machen, lassen Sie es mich bitte wissen!


1
12 Bytes . ṗЀ5Erzeugt alle Kombinationen von Primzahlen mit den Längen eins bis fünf. S=¥prüft, ob die Summe eines der Elemente mit dem Argument der Kette übereinstimmt und Ðfbehält nur diese Elemente bei. gibt es nur, um alle Listen der Primzahlen auf den gleichen Stand in die Liste zu setzen
dylnan

Jetzt 10 Bytes seit und Ƈwurden als Aliase für ЀandÐf
dylnan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.