三角平方数


11

平方数とn^2、nが整数の形式を取るものです。これらは完全平方とも呼ばれます。平方根を取得すると整数が得られるためです。

最初の10個の平方数は次のとおりです:(OEIS

0, 1, 4, 9, 16, 25, 36, 49, 64, 81


三角形の番号は、正三角形を形成できる番号です。n番目の三角形の数は、1からnまでのすべての自然数の合計に等しくなります。

最初の10個の三角形の数値は次のとおりです:(OEIS

0, 1, 3, 6, 10, 15, 21, 28, 36, 45


正方形の三角形の番号は、正方形と三角形の両方の番号です。

最初の10個の正三角形の数は次のとおりです:(OEIS

0, 1, 36, 1225, 41616, 1413721, 48024900, 1631432881, 55420693056, 1882672131025, 63955431761796


無限数の平方数、三角形の数、および正方形の三角形の数があります。

入力(パラメーターまたはstdin)番号を指定してプログラムまたは名前付き関数を作成しnnth正方三角番号を計算して出力/返します(nは正の非ゼロ数)。(n = 1の場合は0を返します)

プログラム/関数が有効な提出であるためには、少なくとも2 ^ 31-1より小さいすべての正三角形の数を返すことができるはずです。

ボーナス

2 ^ 63-1未満のすべての正方三角数を出力できる場合は-4バイト

理論的に任意のサイズの正方三角数を出力できるための-4バイト。

非多項式時間を要するソリューションの場合、+ 8バイトのペナルティ。

ボーナススタック。

これはコードゴルフチャレンジなので、バイト数が最も少ない答えが勝ちです。


より高速なコードを目指す人にとってより公平にするために> O(n)時間かかるソリューションには8バイトのペナルティを追加しました。
ロドルフィト

@Rodolvertice私はあなたが線形時間を意味するとは思わない。私が持っている反復解は、nステップがあるため二次時間であり、各ステップでは、桁数がで線形に増加するため、算術は線形時間を要しますn。線形時間が可能だとは思わない。算術演算が一定時間であると言わない限り、
xnor

1
@Rodolvertice私の反復解はO(n)ではないということです。私がやるべきことは、代わりに「多項式時間」と言うことです。線形時間演算を想定すると、定数時間と呼ばれるべき乗を使用したソリューションのような奇妙なものが得られます。ここでは償却は関係ありません。
-xnor


2
「最初の10個の正三角形の数字...」確かに11個を意味していましたか?:P
アレックスA.

回答:


8

CJam、12 8バイト

XUri{_34*@-Y+}*;

ウィキペディアの記事の繰り返し関係を利用します。

コードの長さは16バイトで、両方のボーナスの対象となります。

CJamインタプリタでオンラインで試してください。

使い方

私のコードは、変数の代わりにCJamのスタックを使用することを除いて、常にあらゆる面でxnorのコードと同一であることが判明しました。

XU               e# Push 1 and 0 on the stack.
                 e# Since 34 * 0 - 1 + 2 = 1, this compensates for 1-based indexing.
  ri{        }*  e# Do int(input()) times:
     _34*        e#   Copy the topmost integer and multiply it by 34.
         @-      e#   Subtract the bottommost integer from the result.
           Y+    e#   Add 2.
               ; e# Discard the last result.

非常に大きな入力に対して即座に実行されますが、3000を超えると、オンラインインタープリターでJavascript範囲エラーが発生します。Java実装で試してみます。
ロドルフィト

@Rodolvertice:反復アプローチに切り替えました。それは実際には短く、メモリ集約的ではありません。
デニス

8

Python 2、45-4-4 = 37

a=1;b=0
exec"a,b=b,34*b-a+2;"*input()
print a

再帰を使用して反復する

f(0) = 1
f(1) = 0
f(k) = 34*f(k-1)-f(k-2)+2

理論的には、これは任意のサイズの数値をサポートしますが、指数関数的な時間で実行されるため、ボーナスの対象にはなりません。任意のサイズの数字で動作するはずです。たとえば、100の場合、

1185827220993342542557325920096705939276583904852110550753333094088280194260929920844987597980616456388639477930416411849864965254621398934978872054025

再帰的なソリューションは41文字を使用しますが、指数関数的な時間がかかるため、資格がありません。

f=lambda k:k>2and 34*f(k-1)-f(k-2)+2or~-k

それは非常に不正で、文字列の乗算による「ループ」です(笑)。
ロドルフィト

@Rodolvertice:まったくチートではありません。むしろ賢く、実際にサイト上でかなり一般的です。
アレックスA.

私はあなたの再帰的な解決策がボーナス#1に適しており、それがexec解決策と結びついていると信じています。再帰の制限を変更できる場合は、任意のサイズの正方形の三角形の数を計算して、#2に限定できます。ただし、それが適切かどうかはわかりません(@Rodolvertice)。
ケード

7

Pyth、16-4-4 = 8バイト

OEIS記事の再帰的な数式を使用します。

K1uhh-*34G~KGtQZ

それは、かなり新しくて本当にクールなように見えるpost-assignコマンドを使用しています。n-11ベースのインデックス作成のため、reducesを使用して時間を繰り返します。

K1            Set K=1
u       tQ    Reduce input()-1 times
         Z    With zero as base case
 hh            +2
  -           Subtract
   *34G       34 times iterating variable
   ~K         Assign to K and use old value
    G         Assign the iterating variable.

それはn回ループし、各反復を数学と割り当てを行うため、多項式のようですが、私はコンピュータ科学者ではありません。n = 10000をほぼ瞬時に終了します。

こちらからオンラインでお試しください


1回の反復を1,0ではなく0,1から始めると、入力から1を引くことを避けることができると思います-私のPythonの答えをご覧ください。
xnor

@xnor:彼はすでにそうしていると思う。ただし、ループによって返される結果はyour bです。
デニス

5

Oasis7-4-4 = -1(非競合)

34*c-»T

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

用途 a(0) = 0, a(1) = 1; for n >= 2, a(n) = 34 * a(n-1) - a(n-2) + 2

Oasisは任意の精度の整数をサポートしているため、スタックのオーバーフローが発生しない限り、任意の数まで上げることができます。スタックのオーバーフローのためにこれがボーナスとしてカウントされない場合はお知らせください。この特定のアルゴリズムが非多項式である可能性もあり、その場合は教えてください。

言語のポストデートが課題であるため競合しない。

説明:

34*c-»T -> 34*c-»10

a(0) = 0
a(1) = 1
a(n) = 34*c-»

34*c-»
34*    # 34*a(n-1)
   c-  # 34*a(n-1)-a(n-2)
     » # 34*a(n-1)-a(n-2)+2

代替ソリューション:

-35*d+T

代わりに使用します a(n) = 35*(a(n-1)-a(n-2)) + a(n-3)


質問にはFor n=1 return 0ありますが、これは1を返します。これは、-Oオプションを追加することで修正できます
グリムミー

4

JavaScript(ES6)、29-4 = 25バイト

n=>n>1?34*f(n-1)-f(n-2)+2:n|0

@IsmaelMiguelのおかげで5バイト節約できました

無限再帰を回避するために、0、1、およびネガをハードコードする必要がありました。

コンソール、関数に名前を付けましたf

f(1);  // 0
f(13); // 73804512832419600
f(30); // 7.885505171090779e+42 or 7885505171090779000000000000000000000000000

編集:JavaScriptは数値を16(15)桁(仕様)に丸めます。これらの数値が大きすぎてオーバーフローが発生するためです。JavaScriptコンソールに714341252076979033を入れて、自分の目で確かめてください。JavaScriptの制限の詳細


これはボーナスの対象にはならないと思います。ではなく、f(15)返す必要85170343853180456676があり85170343853180450000ます。
デニス

@Dennis JavaScriptはこれを切り捨てる必要があります。.-。うん、JavaScriptは16桁に丸め
Downgoat

これを試してください:n=>n?n<2?0:34*f(n-1)-f(n-2)+2:1(31バイト)。5番目の数字までテストしました。
イスマエルミゲル

1
ここに、29バイトの長さのソリューションがありますn=>n>1?34*f(n-1)-f(n-2)+2:!!n。それは返すfalse0true1362。あなたはそれが数を返すようにしたい場合は、交換することができます!!n+!!n
イスマエルミゲル

1
問題を修正しました。これを使用します:(n=>n>1?34*f(n-1)-f(n-2)+2:n|0同じバイトカウント、現在は常に数値を返します)
イスマエルミゲル

3

Excel VBA-90バイト

ウィキペディアのページから繰り返し関係を使用する:

n = InputBox("n")
x = 0
y = 1
For i = 1 To n
Cells(i, 1) = x
r = 34 * y - x + 2
x = y
y = r
Next i

実行すると、nの入力を求められ、nまでのシーケンスが列Aに出力されます。

出力

オーバーフローエラーが発生する前に、n = 202まで実行できます。


2

[競合しない] Pyth(14-4-4 = 6バイト)

K1u/^tG2~KGQ36

OEISからの最初の繰り返しを使用しました。0,1,36の後、A n =(A n-1 -1)2 / A n-2を見つけることができます。Aこのソリューションは36から始まるため競合しません。低くするとゼロで除​​算されます(したがって、0を入力すると36になります)。また、36をハードコーディングする必要がありました。

ここで試してみてください


2

Java、53-4 = 49バイト

もう1つの単純な再帰ですが、50未満のスコアでJavaを投稿することはあまりないので、...

long g(int n){return n<2?n<1?1:0:34*g(n-1)-g(n-2)+2;}

今、再帰的な何かのために、それはかなり長くなります。これは両方ともより長い(112-4 = 108)-と-遅いので、何かを反復する以外に投稿する理由がわかりません:

long f(int n){long a=0,b,c,d=0;for(;a<1l<<32&n>0;)if((c=(int)Math.sqrt(b=(a*a+a++)/2))*c==b){d=b;n--;}return d;}

2

ジュリア、51バイト-4-4 = 43

f(n)=(a=b=big(1);b-=1;for i=1:n a,b=b,34b-a+2end;a)

これは、ウィキペディアのページにリストされている最初の再帰関係を使用して、三角三角形の数を求めます。これは、計算のn = 1000を0.006秒であり、nは 6.93秒で100000を=。これは、数バイト長く再帰的なソリューションよりもだが、それはだ速く。

Ungolfed +説明:

function f(n)
    # Set a and b to be big integers
    a = big(1)
    b = big(0)

    # Iterate n times
    for i = 1:n
        # Use the recurrence relation, Luke
        a, b = b, 34*b - a + 2
    end

    # Return a
    a
end

例:

julia> for i = 1:4 println(f(i)) end
0
1
36
1225

julia> @time for i = 1:1000 println(f(i)) end
0
... (further printing omitted here)
elapsed time: 1.137734341 seconds (403573226 bytes allocated, 38.75% gc time)

2

PHP、65 59 56-4 = 52バイト

while($argv[1]--)while((0|$r=sqrt($s+=$f++))-$r);echo$s;

の平方根$sが∈ℤになるまで繰り返します。sum 、incrementに追加$f$sます$f
繰り返し$argv[1]ます。
出力合計。


1

プロローグ、70 74-4-4 = 66

n(X,R):-n(X,0,1,R).
n(X,A,B,R):-X=0,R=A;Z is X-1,E is 34*B-A+2,n(Z,B,E,R).

実行中のn(100,R)出力:

X = 40283218019606612026870715051828504163181534465162581625898684828251284020309760525686544840519804069618265491900426463694050293008018241080068813316496

n(10000,X)コンピューターで実行するのに約1秒かかります。

編集:66バージョンは末尾再帰です。以前の非末尾再帰バージョンは次のとおりです。

n(X,[Z|R]):-X>1,Y is X-1,n(Y,R),R=[A,B|_],Z is 34*A-B+2;X=1,Z=1,R=[0];Z=0.

バイト単位の長さは同じですが、非末尾再帰により、特定のポイント(私のコンピューターでは20500前後)を超えるスタックオーバーフローが生成されます。


1

JavascriptをES6、77の 75 71文字

// 71 chars
f=n=>{for(q=t=w=0;n;++q)for(s=q*q;t<=s;t+=++w)s==t&&--n&console.log(s)}

// No multiplication, 75 chars
f=n=>{for(s=t=w=0,q=-1;n;s+=q+=2)for(;t<=s;t+=++w)s==t&&--n&console.log(s)}

// Old, 77 chars
f=n=>{for(s=t=w=0,q=-1;n;s+=q+=2){for(;t<s;t+=++w);s==t&&--n&console.log(s)}}
  • 解決策は線形です。
  • 解決策は、数値タイプのため、2 ^ 53未満のすべての数値を出力できます。
  • アルゴリズム自体は、無制限の数に使用できます。

テスト:

f(11)

0
1
36
1225
41616
1413721
48024900
1631432881
55420693056
1882672131025
63955431761796


1

ゼリー13-8 = 5バイト

これは両方のボーナスの対象となります。

×8‘,µÆ²Ạ
0Ç#Ṫ

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

チャットコイアリンガリングと一緒に行わます

説明

×8 '、µÆ²Ạ〜ヘルパーリンク。

×8〜8倍の数。
  '〜インクリメント。
   、〜現在の番号とペアになっています。
    µ〜新しいモナド(1-arg)リンクを開始します。
     Ʋ〜ベクトル化された「Is Square?」。
       Ạ〜すべて。両方が真実である場合にのみ1を返します。



0Ç#Ṫ〜メインリンク。

0#〜0から開始し、適用された場合、最初のN個の整数を収集します。
 Ç〜モナドとしての最後のリンク。
   Ṫ〜最後の要素。暗黙的に出力します。



0

APL(NARS)、67文字、134バイト

r←f w;c;i;m
c←0⋄i←¯1⋄r←⍬
→2×⍳0≠1∣√1+8×m←i×i+←1⋄r←r,m⋄→2×⍳w>c+←1

テスト:

  f 10
0 1 36 1225 41616 1413721 48024900 1631432881 55420693056 1882672131025 

fは、三角番号でもある要素を2次シーケンスで検索するため、APLの三角チェック式に従う必要があります:0 = 1∣√1 + 8×m、番号mでチェックします。

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