세 개의 삼각형 숫자 [닫힘]


19

기술

이전에는이 ​​숫자들에 관해 다른 도전이 있었으며, 나는이 숫자가 그들 사이에 있지 않기를 바랍니다.

N 삼각수 일 최대 모든 자연수의 합과 동일 N , 간단한 물건을. OEIS 에는 Wikipedia 페이지항목이 있습니다 더 자신을 통보하고자하는 사람들은.

가우스는 모든 자연수는 3 개의 삼각형 숫자의 합으로 표현 될 수 있으며 (이것은 포함 0), 하나 이상의 숫자를 두 번 이상 갖는 것이 좋습니다.0 + 1 + 1 = 2 .

도전

당신의 임무는 자연수 ()를 포함하여 프로그램이나 함수를 작성하는 것 0입니다. 공백, 배열 또는 원하는 다른 방법으로 구분 된 숫자를 인쇄 할 수 있습니다. 그러나 내장 함수를 사용하여 배열, 범위 또는 삼각 숫자 목록을 포함하는 다른 형태의 컬렉션 (예 : 범위를 생성하는 단일 원자)을 직접 얻는 것은 금지 되어 있습니다.

테스트 사례

9 -> 6 + 3 + 0 or 3 + 3 + 3
12 -> 6 + 6 + 0 or 6 + 3 + 3 or 10 + 1 + 1
13 -> 6 + 6 + 1
1 -> 1 + 0 + 0
0 -> 0 + 0 + 0

참고 : 가능한 조합이 둘 이상인 경우 일부 또는 전부를 인쇄 할 수 있지만 다른 조합을 재배 열한 결과로 모든 조합을 제거하여 조합을 한 번만 인쇄해야합니다. 나는 try-it 링크와 설명을 정말로 고맙게 생각합니다. 나는 당신이 어떻게 문제를 해결하는지 알고 싶습니다.)

이것은 이므로 표준 허점이 적용됩니다. 바이트 단위의 최단 답변이 이길 수 있습니다!


1
12의 경우 1 + 1 + 10을 수행 할 수도 있습니다.
Outgolfer Erik

1
@steenbergh a가 항상 삼각형 숫자는 아닙니다
Felipe Nardi Batista

3
" 내장 함수를 구문 분석 하여 배열, 범위 또는 삼각 숫자 목록을 포함하는 다른 형식의 컬렉션 을 두 가지 방법 으로 직접 얻을 수 있지만 둘 중 어느 것도 의미가 없습니다. 첫 번째는 배열을 직접 얻는 모든 내장을 금지하지만, 내가 아는 모든 언어에서 배열의 모든 사용을 금지하는 것 같습니다. 다른 사람은 내장이 " 삼각 숫자 목록을 포함하는 ... 범위를 직접 얻는 "것을 금지 하지만, 그 의미가 무엇인지 모르겠습니다.
피터 테일러

2
따라서 인수를 취하고 n첫 번째 n삼각형 숫자 목록을 반환하는 내장 함수 허용됩니까? 어느 언어를 모르더라도 특정 언어를 대상으로하는 느낌이 듭니다.
피터 테일러

4
이 제한을 해제 할 것을 촉구합니다. 나는 그것이 당신이 생각하는 방식으로 언어 간 응답 품질이나 공정성을 향상시키지 않을 것이라고 약속합니다.
Lynn

답변:


8

05AB1E , 10 바이트

암호:

ÝηO3ãʒOQ}¬

설명:

Ý             # Compute the range [0 .. input]
 η            # Get the prefixes
  O           # Sum each prefix to get the triangle numbers
   3ã         # Cartesian repeat 3 times
     ʒ  }     # Keep elements that
      OQ      #   have the same sum as the input
         ¬    # Retrieve the first element

05AB1E 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


아아 ... 응; 그렇게 할 것입니다.
매직 문어 Urn

7

파이썬 2 , 99 바이트

from random import*
n=input()
while 1:b=sample([a*-~a/2for a in range(n+1)]*3,3);n-sum(b)or exit(b)

온라인으로 사용해보십시오!

나는 이것이 짧 itertools거나 삼중 목록 이해력 보다 짧다는 것에 놀랐습니다 ! 그것은 (결과적으로) 그것을 실행할 때마다 임의의 대답을 내뱉습니다.

102 대 :

n=input();r=[a*-~a/2for a in range(n+1)];print[(a,b,c)for a in r for b in r for c in r if a+b+c==n][0]
def f(n):r=[a*-~a/2for a in range(n+1)];return[(a,b,c)for a in r for b in r for c in r if a+b+c==n][0]

itertools는 106 인 것으로 보입니다.

from itertools import*;lambda n:[x for x in product([a*-~a/2for a in range(n+1)],repeat=3)if sum(x)==n][0]

랜덤 출력의 경우 +1 :) 또한 가장 짧은 솔루션을 제공한다는 사실에 놀랐습니다 (지금까지).
Kevin Cruijssen

그 방법에 대해 대단히 감사합니다. 해당 Ruby 코드 에는 57 바이트가 있습니다.
Eric Duminil


3

Brachylog , 13 바이트

⟦⟦ᵐ+ᵐj₃⊇Ṫ.+?∧

온라인으로 사용해보십시오!

작동 원리

⟦⟦ᵐ+ᵐj₃⊇Ṫ.+?∧  input: n
⟦              [0 1 ... n]
 ⟦ᵐ            [[0] [0 1] [0 1 2] ... [0 1 ... n]]
   +ᵐ          [0 1 3 ... n(n+1)/2]
     j₃        [0 1 3 ... n(n+1)/2 0 1 3 ... n(n+1)/2 0 1 3 ... n(n+1)/2]
       ⊇       is a superset of
        Ṫ      a list of three elements 
         .     which is the output
          +?   which sums up to be the input

2

MATL , 18 바이트

Q:qYs3Z^t!sG=fX<Y)

첫 번째 결과를 사전 순서대로 출력합니다.

MATL Online 에서 사용해보십시오 !

설명

Q     % Implicitly input n. Add 1
:     % Range (inclusive, 1-based): gives [1 2 ... n+1]
q     % Subtract 1 (element-wise): gives [0 1 ... n]
Ys    % Cumulative sum
3Z^   % Cartesian power with exponent 3. Gives a matrix where each row is a
      % Cartesian tuple
t     % Duplicate
!s    % Sum of each row
G=    % Does each entry equal the input?
f     % Find indices that satisfy that condition
X<    % Minimum
Y)    % Use as row index into the Cartesian power matrix. Implicitly display

2

하스켈, 66 59 바이트

모든 솔루션을 출력 할 수있게 해주셔서 감사합니다. 나는 하나의 솔루션을 추출 할 필요가없고 치환 된 솔루션을 피함으로써 발생하는 비용을 알지 못하는 모든 것을 줄 수있어서 너무 기뻤습니다. @Lynn의 발언은 저에게 7 바이트를 절약하도록 설명했습니다.

f n|l<-scanl(+)0[1..n]=[(a,b,c)|c<-l,b<-l,a<-l,a+b+c==n]!!0

이것은 충분한 삼각형 숫자 이상을 바인딩합니다. l 하고 모든 조합을 확인합니다.


a>=b,b>=c조건을 삭제하지 않고 !!0코드 접미사 도 유효한 답변입니까? 모든 솔루션을 출력한다고해서 실제로 도움이되는 것은 아닙니다.
Lynn

@Lynn 물론입니다. 산만합니다. 감사!
Christian Sievers

2

망막 , 63 59 바이트

.+
$*
^((^1|1\2)*)((1(?(4)\4))*)((1(?(6)\6))*)$
$.1 $.3 $.5

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. (1(?(1)\1))*는 일반 삼각 숫자 매처이지만 첫 번째 삼각 숫자의 ^경우 초기 일치 에 사용하여 몇 바이트를 절약 할 수 있습니다 .


1

PHP , 351 바이트

$r=[];function f($a=[],$c=0){global$argn,$t,$r;if($c<3){$n=$argn-array_sum($a);$z=array_filter($t,$f=function($v)use($n,$c){return$v>=$n/(3-$c)&&$v<=$n;});foreach($z as$v){$u=array_merge($a,[$v]);if(($w=$n-$v)<1){if(!$w){$u=array_pad($u,3,0);sort($u);if(!in_array($u,$r)){$r[]=$u;}}}else f($u,$c+1);}}}for($t=[0];$argn>$t[]=$e+=++$i;);f();print_r($r);

온라인으로 사용해보십시오!


1

파이썬 3 , 119 바이트

lambda n:[l for l in combinations_with_replacement([(t**2+t)/2for t in range(n)],3)if sum(l)==n]
from itertools import*

온라인으로 사용해보십시오!

12 바이트를 절약 한 @WheatWizard에게 감사합니다!


당신의 map(그리고 아마도 당신의 필터)는 목록 이해력으로 짧아 질 수 있습니다.
밀 마법사


아이디어에 대한 @WheatWizard 감사합니다, 나는map
Chase Vogeli

필터 객체는 완벽하게 유효한 출력 이지만 리스트를 출력하려면 다음과 같이 표시를 사용할 수 있습니다.[*filter(...)]
Wheat Wizard

1
내가 시도한 것은 그 차이를 설명하는 것 (x,y,z) for x,y,z in...보다 길다는 것 l for l in...입니다.
체이스 보글 리

1

C / C ++-197 바이트

#include<stdio.h>
#define f(i,l,u) for(int i=l;i<=u;i++)
int t(int n){return n>1?n+t(n-1):n;}
int c(int n){f(a,0,n)f(b,a,n)f(c,b,n)if(t(a)+t(b)+t(c)==n)return printf("%d %d %d\n",t(a),t(b),t(c));}

타격으로 타격 :

#include<stdio.h>

printf에 필요합니다. 특정 버전의 C에 대해 제거 될 수 있음

#define f(i,l,u) for(int i=l;i<=u;i++)

루프를위한 공간 절약.

int t(int n){return n>1?n+t(n-1):n;}

재귀 삼각형 평가 기.

int c(int n){f(a,0,n)f(b,a,n)f(c,b,n)if(t(a)+t(b)+t(c)==n)return printf("%d %d %d\n",t(a),t(b),t(c));}

이 사람은 무거운 짐을지고 있습니다. 3 개의 중첩 된 for 루프는 0에서 n까지 a, b, c를 반복합니다. b와 c는 각각 이전 값에서 n까지 반복됩니다. 그 이후로 반복을 다듬을 필요는 없습니다.return1 분 만에 "중복"문제가 해결 .

내부 레벨에서 세 개의 삼각형 숫자의 합이 == 원하는 값을 표시하면 삼각형을 인쇄하고 반환하십시오.

합법적으로 return키워드를 제거하고 반환 유형 c를 void로 변환하여 몇 바이트를 더 절약하고 가능한 모든 솔루션을 인쇄 할 수 있습니다. 그것은 모든 루프에서 실행 한 경우 반복이 제한됩니다 이러한 이유입니다 0n중복 원인이 그것.


1

수학, 63 바이트

(t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&]‌​)&

중위 구문과지고의 구타 방법으로 First그 무려 저장 2 바이트 , (t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&])&62 바이트입니다.
numbermaniac

좋아요, 편집하겠습니다
J42161217


0

R , 66 바이트

n=scan();b=expand.grid(rep(list(cumsum(0:n)),3));b[rowSums(b)==n,]

무차별 대입 알고리즘; nstdin에서 읽고 각 행이 3 개의 삼각형 숫자의 조합 인 데이터 프레임을 반환합니다.n . 필요한 경우 +4 바이트의 첫 번째 행만 반환 할 수 있습니다.

온라인으로 사용해보십시오!


0

자바 8, 164 바이트

n->{int t[]=new int[n+1],i=0,j=0;for(;i<=n;)if(Math.sqrt(8*i+++1)%1==0)t[j++]=i-1;for(int a:t)for(int b:t)for(int c:t)if(a+b+c==n)return new int[]{c,b,a};return t;}

설명:

여기에서 시도하십시오.

n->{                     // Method with int parameter and int-array return-type
  int t[]=new int[n+1],  //  Create an int-array to store triangular numbers
      i=0,j=0;           //  Two index-integers
  for(;i<=n;)            //  Loop (1) from 0 to `n` (inclusive)
    if(Math.sqrt(8*i+++1)%1==0) 
                         //   If `i` is a triangular number
      t[j++]=i-1;        //    Add it to array `t`
                         //  End of for-loop (1) (implicit / single-line body)
  for(int a:t)           //  Loop (2) over the triangular numbers
    for(int b:t)         //   Inner loop (3) over the triangular numbers
      for(int c:t)       //    Inner loop (4) over the triangular numbers
        if(a+b+c==n)     //     If the three triangular numbers sum equal the input
          return new int[]{c,b,a};
                         //      Return these three triangular numbers as int-array
                         //    End of loop (4) (implicit / single-line body)
                         //   End of loop (3) (implicit / single-line body)
                         //  End of loop (2) (implicit / single-line body)
  return t;              //  Return `t` if no sum is found (Java methods always need a
                         //  return-type, and `t` is shorter than `null`;
                         //  since we can assume the test cases will always have an answer,
                         //  this part can be interpret as dead code)
}                        // End of method

0

자바 스크립트, 108 바이트

r=[],i=a=b=0
while(a<=x)r.push(a=i++*i/2)
for(a=0;a<3;){
b=r[i]
if(b<=x){
x-=b
a++
console.log(b)}
else i--}

설명

x 입력을 나타냅니다

while(a<=x)r.push(a=i++*i/2) 최대 x까지 모든 삼각형 숫자의 배열을 만듭니다.

for루프는 가장 높은 삼각수 미만 인쇄 x다음에서 해당 번호를 뺀 x세 반복를 들어,. (기본적으로 탐욕스러운 알고리즘)


각 단계에서 가장 큰 삼각형 숫자 <= x를 취하여 3 위를 차지하는 삼각형 숫자를 보장 할 수는 없습니다. 출력을 확인하십시오 x = 103:91 + 10 + 1 = 102
asgallant

0

Pyth, 19 바이트

나는 그래서 , 그것은 사실입니다 Pyth 연습에서 : /

hfqQsT.C*3+0msSdSQ3

여기서 사용해보십시오 .

hfqQsT.C*3+0msSdSQ3  Implicit: Q=input()

                SQ   Range 1-n
            m        Map the above over d:
              Sd       Range 1-d
             s         Sum the above
                     Yields [1,3,6,10,...]
          +0         Prepend 0 to the above
        *3           Triplicate the above
      .C          3  All combinations of 3 of the above
 f                   Filter the above over T:
    sT                 Where sum of T
  qQ                   Is equal to input
h                    Take the first element of that list

가능한 모든 솔루션도 인쇄 할 수 있으므로 첫 번째 목록 요소의 선택기를 생략하여 바이트를 저장할 수 있습니다.
racer290

@ racer290 더 나은 결과는 [[a, b, c], [d, e, f]] 형식이지만, 괜찮을까요?
Sok

@ racer290 사실, 중복을 필터링하는 것은 사물에 의해 자유로울 수 없으므로 더 짧지 않을 것입니다 : c
Sok


0

루비 61 57 55 바이트

Lynn의 Python answer 에서 영감을 얻었습니다 . 원하는 합계를 얻을 때까지 임의의 트리플렛을 생성합니다.

->n{x=Array.new 3{(0..rand(n+1)).sum}until x&.sum==n;x}

Ruby 2.4가 필요합니다. Ruby 2.3 및 이전 버전에서는 구문 오류이며 Range#sum정의되지 않았습니다. Ruby 2.3에는이 더 긴 버전 (64 바이트)이 필요합니다.

->n{x=Array.new(3){(a=rand(n+1))*-~a/2}until x&.inject(:+)==n;x}

다음은 작은 테스트입니다.

f=->n{x=Array.new 3{(0..rand(n+1)).sum}until x&.sum==n;x}
# => #<Proc:0x000000018aa5d8@(pry):6 (lambda)>
f[0]
# => [0, 0, 0]
f[13]
# => [0, 3, 10]
f[5]
# => [3, 1, 1]
f[27]
# => [21, 3, 3]
f[27]
# => [0, 21, 6]
f[300]
# => [3, 21, 276]

Ruby 2.3으로 온라인에서 사용해보십시오!


0

자바 스크립트 (ES6), 108 바이트-고정

정수를 입력으로 취하고 [a, b, c]정렬 된 삼각형 숫자 목록을 포함 하는 배열 을 출력합니다 a + b + c = x. 여기서 a가장 큰 삼각형 숫자는 입력보다 작거나 같습니다 b. 가장 큰 삼각형 숫자는 입력 빼기보다 작거나 같습니다 a.

x=>{t=[0],t.f=t.forEach,i=j=k=0;for(;j<x;t[i]=j+=i++);t.f(a=>t.f(b=>t.f(c=>a+b+c==x?k=[a,b,c]:0)));return k}

설명

x=>{
    t=[0],                               // initialize an array of triangle numbers
    t.f=t.forEach,                       // copy forEach method into t.f,
                                         // saves a net of 4 bytes
    i=j=k=0;
    for(;j<x;t[i]=j+=i++);               // populate t with all triangle numbers that
                                         // we could possibly need
    t.f(                                 // loop over all t
        a=>t.f(                          // loop over all t
            b=>t.f(                      // loop over all t
                c=>a+b+c==x?k=[a,b,c]:0  // if a+b+c = x, set k = [a,b,c], else noop
                                         // using a ternary here saves 1 byte vs
                                         // if statement
                                         // iterating over t like this will find all
                                         // permutations of [a,b,c] that match, but
                                         // we will only return the last one found,
                                         // which happens to be sorted in descending order
            )
        )
    );
    return k
}


가장 흥미로운 부분을 설명하지는 않습니다. 왜 x-m-n삼각형 숫자입니까, 즉 왜 작동합니까?
Christian Sievers

글쎄, 단장, 그것이 보장되지 않는다는 것이 밝혀졌다. 내가 사용한 모든 테스트 사례는 유효한 삼각형 숫자의 삼중 항을 생성하기 위해 발생했습니다. 드로잉 보드로 돌아갑니다.
asgallant

이 솔루션에 만족하지 않는 문제 수정 : <; o (적어도 작동합니다.
asgallant
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.