5 개의 소수 (최대)의 합


16

Terence Tao는 최근 약한 형태의 Goldbach의 추측을 증명했습니다! 그것을 활용하자!

홀수 정수가 주어지면 최대 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. 입력 방법을 결정하지만 이상한 경우 설명하십시오.

산출

오히려 개방형입니다. 리스트를 돌려줍니다. 문자열을 인쇄하십시오. 하나 또는 몇 개 또는 전부 쓰레기를 스택 (GS, Piet 등) 또는 연속적인 (접근 가능한) 메모리 블록 (BF 등)에 예측 가능한 방식으로 배치하십시오. 이러한 경우에는 출력을 설명하십시오. 모든 경우에 반환 / 인쇄 / 무엇이 n6 개 미만의 소수로 구성된 소수 부분을 간단하게 표현해야합니다 .

채점

이것은 코드 골프이며, 가장 작은 바이트 수입니다.

보너스! 'goldbach'라는 단어가 프로그램의 하위 시퀀스 (반드시 연속적 일 필요는 없습니다. 순서대로 중요하지 않습니다)로 나타나는 경우 8 점을 뺍니다. 위의 코드는 이에 대한 예입니다.


검사 할 첫 번째 숫자 인 홀수 정수> 1은 3입니다. 소수의 소수는 3을 생성합니까? 나는 분명하지 않습니까?
사용자 불명

'명백한'은 언어 적입니다. 3은 소수이므로 1의 소수입니다. Smartass 응답 : Conway는 3이 합계 7 + (-1) + (-1) + (-1) + (-1)이라고 말합니다.
boothby

단일 값은 합계가 아닙니다. 음수 값을 도입하는 대신 값> 3으로 시작하는 것이 좋습니다.
알 수없는 사용자

1
단일 값은 합계입니다. 음수 값에 대한 의견은 명시 적으로 언급 된 것처럼 현명한 말이었습니다.
boothby

2
"substring (반드시 연속적이지 않고 순서대로 ...)" 이것을 서브 시퀀스 라고합니다 .
Joey Adams

답변:


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 3 13 | 0 0 5 11 | 0 0 11 5 | 0 0 13 3 | 0 2 3 11 | 0 2 7 7 | 0 2 11 3 | 0 0 3 13 13 | 0 0 3 2 11 | 0 3 11 2 | 0 3 13 0 | 0 5 11 11 5 5 11 0 | 0 7 2 7 | 0 7 7 2 | 0 11 0 5 | 0 11 11 2 3 | 00 11 3 2 | 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 ...
+ ---------- + ---------- + ---------- ++ ---------- + ----- ----- + --------- + ---------- + ---------- + ------------ +- --------- + ---------- + ---------- + ---------- + ------- -+ --------- + ---------- + ------------ + ---------- + ---- ------ + ---------- + ---------- + ---------- + --------- + ------...

보너스 포인트를 적립 할 편지가 충분하지 않습니다.


잘 했어요! 이 도전에서 어떤 언어도 J를 이길 수 없다고 생각합니다.
Cristian Lupascu

8

수학 , 38

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

WA를 통해 방법을 찾을 수 없습니다 ...
belisarius 박사

1
Mathematica에 액세스 할 수 있으며 내가 준 모든 입력에서 작동했습니다.
boothby

IntegerPartitions기능의 이름이 Goldbach...;) 인지 상상해보십시오 .
Cristian Lupascu 8:21에

@ w0lf조차도 J> _>보다 1 이상일 것입니다.
Rixius

어떤 @Rixius, 그것은 점수 것 (21) ,이 경우 8 이하 J. 이상
Mr.Wizard

8

C, 192-8 = 184 자

연속으로 "Goldbach"(구두 제외) 및 "Tao"를 포함합니다.
합계가 5 소수보다 작 으면 (즉, 항상) 0을 인쇄합니다 (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경우 포함 ).
T변수 중 하나를 G,o,l,d,a다음 소수로 진행하는 for 루프를 빌드합니다 .
모든 for 루프 내에서 합이 일치하는지 확인하고 일치하면 인쇄 및 종료합니다.


4
G,o,l,d,*b,a;c(h)좋은 터치입니다!
Joel Cornett

n = 3
부스에서

@boothby, 당신 말이 맞아요 .5 개 소수만 찾을 수 있습니다.
ugoren

합을 위해 제로 프라임을 고려 USER_UNKNOWN이에 대한 좋은 솔루션이
boothby

@boothby가 변경되었습니다. 내 논리가 자연스럽게 1을 소수로 취급하므로 0보다 비용이 많이 들며 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와 같은 다른 하나 @ .
Outgolfer Erik

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은 보너스 충분하다 : 당신이를 얻을 수 있습니다 ach에서 .each.
Ilmari Karonen

1
'고정 출력 형식'이란 무엇입니까? 이것은 완전히 개방되어 있습니다. 원하는 경우 공간을 nix 할 수 있습니다.
부스

@IlmariKaronen 멋진 팁! 게시물을 수정했습니다. 감사!
크리스티안 루파 스쿠

@boothby 이것을 알아 주셔서 감사합니다. 샘플 출력을보고 그것이 요구 사항이라고 생각했습니다. 이제 출력 형식이 열려 있습니다. 업데이트되었습니다.
Cristian Lupascu 18시 51 분

2

PHP 143122-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

흠 ... 제출 한 코드가 작동하지 않는 것 같습니다. 당신은 ~õ;}마지막에 재미있는 것들을 얻었습니다 ...
boothby

~ õ (chr (245))는 "\ n"의 줄임말입니다. 이 경우 실제로는 필요하지 않습니다. 솔루션에서 제거하겠습니다.
primo

n = 3에 대한 코드가 실패합니다.
boothby

@boothby 나는 그것을 믿지 않는다. n = 3의 경우, 숫자 3을 출력 한 다음 종료됩니다 (다른 소수의 소수는 3이므로). 무엇을 생산할 것으로 기대 했습니까?
primo

출력이 표시되지 않습니다. 5, 7, 9, 11에서 잘 작동합니다. ideone.com/cMNR8 또한 함수를 정의하고 호출하지 않아도됩니다.
boothby

2

루비 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 세 이후부터 nitpicking 대신 내 자신을 게시 할 것입니다. 기술의 발전에는 free reduce대신에 사용하는 stabby lambda, 5의 파티션에서 멈추는 간결한 방법 및 ) 이하의 모든 소수를 반복하고을 제공합니다 . 다른 6 년 후에는을 사용하는 더 좋은 방법이있을 것 입니다.injectdPrime.each(o)oachb


1

스칼라 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)}}

boothby의 힌트 후에 : 하나의 함수 호출을 제거하고 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 <-1; c <-1; h <-1; e <-1; if (b + a + c + h + e == o)) 수율 {( 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 개의 summand를 표시합니다. 누락 된 summand의 경우 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)}
}

스칼라에 익숙하지 않습니다. 이것이 어떻게 호출됩니까? ideone.com에 실례를 게시 할 수 있습니까 ?
boothby

IDEone보다 보일러 플레이트가 덜 필요하기 때문에 단순히 스칼라 에서 실행하는 것이 좋습니다. 예 println (l(17))를 들어 호출하십시오 . 출력은 일반적으로 다음과 같 Vector((17,0,0,2,2,13), (17,0,0,2,13,2), (17,0,0,3,3,11)으며 다음을 의미합니다. 17은 합산되고 Summand는 0, 0 (0은 summand가 없음을 의미) 2 + 2 + 13입니다. 단순히 스칼라에 대한 링크는 이미 메타에 설명되어 있습니다
사용자 알 수없는

멋지다, 고마워! : 외모는 몇 문자를 저장할 수 있습니다 좋아 yield{(d,a,...> - yield{(a,...과의 정의 포장로 g로를 filterNot(...). 하나. 이것은 n = 3에 실패합니다.
boothby

수행 (2 to d)하는 대신 (2 to d-1),하지만 난 당신이 설정을 요약하면 (3) (3)의 합이 점에 동의하지 않는, 그래, 그것은 빈 세트 또는 하나 개의 숫자로 구성된 설정할 수 있습니다. 그러나 n으로 이어지는 합계를 작성하면 항의시 코드 만 변경됩니다.
사용자가 알 수 없음

당신의 대답을 단축하려는 당신의 고집스러운 거절이 고귀한 것처럼, 당신의 대의는 당신의 바로 대답에 의해 손상을받습니다. 합계가 인 목록을 반환합니다 3. 그 중 하나가되어야합니다 (0,0,0,0,3).
boothby

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

젤리 , 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해당 요소 만 유지합니다. 모든 소수 목록을 같은 수준으로 목록에
넣을 수 있습니다

이제 10 바이트 이후 Ƈ별칭으로 추가되었습니다 ЀÐf
dylnan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.