3つの三角形の数字[閉じた]


19

説明

これらの数値に関しては、以前にもかなり多くの課題がありましたが、このうちの1つでもないことを願っています。

nは三角数回目には、最大のすべての自然数の和と等しいnは、簡単なものを。ウィキペディアのページOEISには、さらに情報を提供したい人のためのエントリーがあります。

さて、ガウスは、すべての自然数が3つの三角形の数(これらを含む0)として表現できることを発見しました0 + 1 + 1 = 2

チャレンジ

あなたの仕事は、自然数(を含む0)が与えられたプログラムまたは関数を書くことで、引数に合計される3つの三角形の数を出力します。スペースで区切られた数字を配列として、または好きな方法で印刷できます。ただし、組み込み関数を使用して、配列、範囲、または三角形の数のリストを含むコレクションの他の形式(範囲を生成する単一のアトムなど)を直接取得することは禁止されています。

テストケース

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

注:可能な組み合わせが複数ある場合は、いずれかまたはすべてを印刷できますが、任意の組み合わせを1回だけ印刷し、他の組み合わせを再配置した結果であるすべての組み合わせを削除する必要があります。試してみてくださいリンクと説明を本当に感謝します、私は本当にあなたが問題を解決する方法を見るのが大好きです;)

これはなので、標準の抜け穴が適用されます。バイト単位の最短回答が勝ちますように!


1
12のために、あなたも行うことができます1 + 1 + 10
エリックOutgolfer

1
@steenbergh aは常に三角の数字になるとは限らない
フェリペナルディバティスタ

3
私は「組み込み関数を解析して、配列、範囲、または三角形の数のリストを含むその他の形式のコレクションを直接取得する」ことができますが、どちらも意味がありません。1つ目は、配列を直接取得するすべてのビルトインを禁止していますが、それは私が知っているすべての言語での配列の使用をすべて禁止しているようです。もう1つは、ビルトインが「直接取得...範囲...三角形のリストを含む」ことを禁止していますが、それが何を意味するのかわかりません。
ピーターテイラー

2
したがって、引数を取りn、最初のn三角形の番号のリストを返す組み込み関数許可されますか?特定の言語をターゲットにしているように感じますが、どの言語かはわかりません。
ピーターテイラー

4
この制限を解除することをお勧めします。あなたが考えるように、言語間の回答の質や公平性を改善しないことをお約束します。
リン

回答:


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エンコードを使用します。オンラインでお試しください!


ああ...うん; それをやる。
魔法のタコUr

7

Python 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リストのトリプル理解より短いか、トリプルリストの理解に驚いています!それは(最終的に)実行するたびにランダムな答えを吐き出します。

2つの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。:)また、最短のソリューション(これまでのところ)を提供することに驚いています。
ケビンCruijssen

方法をありがとうございました。対応するRubyコードは57バイトです。
エリックドゥミニル


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

Haskell、66 59バイト

すべてのソリューションを出力できるようにしてくれてありがとう、それは魅力的な気晴らしでした!1つのソリューションを抽出する必要がなく、それらすべてを提供できるだけで良かったので、置換されたソリューションを回避することによるコストに気付かなかった。@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あなたはもちろん正しい、私は気を取られました。ありがとう!
クリスチャンシーバーズ

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

Python 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
チェイスヴォーゲリ

Filterオブジェクトは、完全に有効な出力され、しかし、あなたは出力にリストをしたい場合、あなたはそうのようなスプラットを使用することができます[*filter(...)]
小麦ウィザード

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ループは、a、b、cを0からnまで反復します。bとcはそれぞれ、以前の値からnまで反復することに注意してください。return1分以内に「重複」問題が解決されるため、このような反復を厳密に調整する必要はありません。

内側のレベルで、3つの三角形の合計が==目的の値になっている場合、三角形を出力して戻ります。

returnキーワードを合法的に削除し、cの戻り値の型をvoidに変換して、さらに数バイトを節約し、可能な解決策をすべて印刷できます。すべてのループが実行さ0nて重複が発生する場合、反復が制限されるのはこのためです。


1

Mathematica、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

Java 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

JavaScript、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、その後にその数を減算し、x3回の反復のために、。(基本的に貪欲なアルゴリズム)


私と同じ問題があります。各ステップで最大の三角形番号<= xを取ることで、3位の三角形番号を持っているとは限りません。以下のためのあなたの出力を確認しますx = 10391 + 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]]の形式になりますが、大丈夫でしょうか?
ソク

@ racer290実際には、いや、重複のフィルタリングは物の見た目では自由ではないので、短くなることはありません:c
Sok


0

Ruby 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

Javascript(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三角数なのですか?つまり、なぜこれが機能するのですか?
クリスチャンシーバーズ

ダンジット、保証されていないことがわかりました。私が使用したテストケースはすべて、たまたま有効な3項の三角形の数を生成しました。ふりだしに戻る。
アスガルント

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