Nより小さい奇数の二乗数を合計します


19

入力よりも小さい奇数の二乗(OEIS#A016754)出力するプログラムまたは関数を作成します n

シーケンスの最初の44の数字は次のとおりです。

1, 9, 25, 49, 81, 121, 169, 225, 289, 361, 441, 529, 625, 729, 841, 961, 1089, 
1225, 1369, 1521, 1681, 1849, 2025, 2209, 2401, 2601, 2809, 3025, 3249, 3481, 
3721, 3969, 4225, 4489, 4761, 5041, 5329, 5625, 5929, 6241, 6561, 6889, 7225, 7569

シーケンスの式はa(n) = ( 2n + 1 ) ^ 2です。

ノート

  • プログラムの動作は未定義の場合がありますn < 1(つまり、有効な入力はすべてです>= 1)。

テストケース

1 => 0
2 => 1
9 => 1
10 => 10
9801 => 156849
9802 => 166650
10000 => 166650

1
これに関する密接な理由のいずれも、チャレンジを閉じる正当な理由ではありません
...-Mego

回答:


22

ゼリー、6バイト

½Ċ|1c3

オンラインでお試しください!または、すべてのテストケースを確認します

バックグラウンド

すべての正の整数kに対して1²+3²+⋯+(2k-1)²= k(2k-1)(2k +1)÷3があります。

m C r = mあるので÷((mr)!r!)r - m個の要素のセットの組み合わせ、上記は(2k + 1)C 3 =(2k + 1)2k(2k-1)÷6 = k(2k -1)(2k + 1)÷3。

式を適用するには、(2k-1)²<nであるような最も高い2k + 1を見つける必要があります。パリティをしばらく無視すると、(m-1)²<nm = ceil(srqt(n))のように最高mを計算できます。偶数であればmを条件付きでインクリメントするには、単にm |を計算します 1(ビット単位のORを持つ1)。

使い方

½Ċ|1c3  Main link. Argument: n

½       Compute the square root of n.
 Ċ      Round it up to the nearest integer.
  |1    Bitwise OR with 1 to get an odd number.
    c3  Compute (2k + 1) C 3 (combinations).

6

JavaScript(ES6)、30バイト

f=(n,i=1)=>n>i*i&&i*i+f(n,i+2)

f(1)falseではなくゼロを返す必要がある場合は31バイト:

f=(n,i=1)=>n>i*i?i*i+f(n,i+2):0

6

05AB1E10 8バイト

コード:

<tLDÉÏnO

説明:

<         # Decrease by 1, giving a non-inclusive range.
 t        # Take the square root of the implicit input.
  L       # Generate a list from [1 ... sqrt(input - 1)].
   DÉÏ    # Keep the uneven integers of the list.
      n   # Square them all.
       O  # Take the sum of the list and print implicitly.

役に立つかもしれません:t;L·<nO

CP-1252エンコードを使用します。オンラインでお試しください!


6

Haskell、30バイト

f n=sum[x^2|x<-[1,3..n],x^2<n]

驚くほど普通に見える。


4

C#、126 131バイト

新しい質問に適合するように編集されたバージョン:

class P{static void Main(){int x,s=0,n=int.Parse(System.Console.ReadLine());for(x=1;x*x<n;x+=2)s+=x*x;System.Console.Write(s);}}

ハードコードされた制限の使用:

using System;namespace F{class P{static void Main(){int x,s=0;for(x=1;x<100;x+=2)s+=x*x;Console.Write(s);Console.Read();}}}

4
プログラミングパズルとコードゴルフへようこそ!ここでの回答ヘッダーの合意された形式は# Language name, number bytes、一貫性のためです。

2
Console.Read最後にどうして?
マーティンエンダー

1
namespacesは単一ファイルには必要ありません。
ASCIIのみ

1
またSystem.Console.Write(s);、機能する場合、および必要ない場合は、数バイトを節約できるはずですConsole.Read
ASCIIのみ

2
@Thomas VSでCtrl + F5を使用してプログラムを実行できます。この場合、プログラムが終了してもウィンドウは開いたままになります。
マーティンエンダー

4

ゼリー、7

’½R²m2S

オンラインで試すか、複数の値の修正版を試す

Shh ...デニスは寝ています...

彼らの助けのためにチャットでSp3000に感謝します!

説明:

’½R²m2S
’           ##  Decrement to prevent off-by-one errors
 ½R²        ##  Square root, then floor and make a 1-indexed range, then square each value
    m2      ##  Take every other value, starting with the first
      S     ##  sum the result

9
デニスは実際に起きています。
デニス

@Dennis Ahh!そしてまた、明らかに
...-FryAmTheEggman


4

R、38 36バイト

function(n,x=(2*0:n+1)^2)sum(x[x<n])

@Giuseppe xは、引数リストに移動して中括弧を保存することで2バイトを節約しました。クールなアイデア!

非ゴルフ

function(n, x = (2*(0:n) + 1)^2)  # enough odd squares (actually too many)
  sum(x[x < n])                   # subset on those small enough
}

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


2
PPCGへようこそ!
マーティンエンダー

このサイトは素晴らしいです、ありがとう!
マイケルM

xデフォルトの関数引数に移動することで2バイトを保存できるはずです。その後、中括弧を削除できます。
ジュゼッペ

3

C、51、50 48バイト

f(n,s,i)int*s;{for(*s=0,i=1;i*i<n;i+=2)*s+=i*i;}

なぜ最も冗長な言語の1つでゴルフをしないのですか?(ねえ、少なくともJavaではありません!)

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

テストI / Oを備えた完全なプログラム。

int main()
{
    int s;
    f(10, &s);
    printf("%d\n", s);
    char *foobar[1];
    gets(foobar);
}

f(n,s,i)int*s;{for(*s=0,i=1;i*i<n;i+=2)*s+=i*i;}

most verbose languagesもっとPythonのよりgolfy、C#、LISPは、フォースなど、Cはゴルフのために実際にはかなり良いです

@cat pythonよりゴルフっぽいとは思いません。java、rust、C#よりも間違いなく優れていますが、この課題に関するすべてのpythonの答えは< 50 bytesです。また、関連するメタ投稿がここにあります
DJMcMayhem



3

CJam、15バイト

qi(mq,2%:)2f#1b

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

ハードコーディングされた10000ソリューション:

Martinの12バイトソリューション:

99,2%:)2f#1b

私の元の13バイトのソリューション:

50,{2*)2#}%:+

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


コードは14バイトです(リンクに末尾の改行があります)が、チャレンジは入力より小さい正方形を要求するため、入力9801では正しくないと思います。
マーティンエンダー

@MartinButtnerはい、そうです。エレガントな修正を見つけることができるかどうかを確認します
シモンズ

2

Pyth、10バイト

s<#Qm^hyd2

テストスイート

説明:

s<#Qm^hyd2
    m          Map over the range of input (0 ... input - 1)
       yd      Double the number
      h        Add 1
     ^   2     Square it
 <#            Filter the resulting list on being less than
   Q           The input
s              Add up what's left

代替(10バイト):s<#Q%2t^R2
Leaky Nun

2

Mathcad、31「バイト」

ここに画像の説明を入力してください

Mathcadでは、キーボードショートカットを使用して、定義やすべてのプログラミング演算子など、いくつかの演算子を入力します。たとえば、ctl-]はwhileループに入ります-入力できず、キーボードショートカットまたはプログラミングツールバーからのみ入力できます。「バイト」は、Mathcad項目の入力に必要なキーボード操作の数(変数名や演算子など)と見なされます。

私はこのコンペティションに勝つチャンスがないので、直接的なフォーミュラバージョンで少しバラエティを加えると思いました。


MathCADはどのように採点されますか?どこで入手できますか?

あなたが与えるスコアリングの説明はちょっと... IMO薄っぺらな、である

1
この言語の採点のためにメタ質問をする必要があります。
メゴ

メタ質問はいいですね。得点のための薄っぺらな外植を与えようとすると、急速に戦争と平和に変わります。
スチュアートブラフ

2

ラケット、57バイト

(λ(n)(for/sum([m(map sqr(range 1 n 2))]#:when(< m n))m))

2

MATL、10バイト

qX^:9L)2^s

編集(2016年7月30日):言語の最近の変更に適応するために、リンクされたコードが置き換え9Lられ1Lます。

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

q    % Implicit input. Subtract 1
X^   % Square root
:    % Inclusive range from 1 to that
9L)  % Keep odd-indexed values only
2^   % Square
s    % Sum of array

1

Python、39バイト

f=lambda n,i=1:+(i*i<n)and i*i+f(n,i+2)

の場合、ではなくn=1出力が有効であれば、基本ケースの変換を回避して37バイトを取得できますFalse0

f=lambda n,i=1:i*i<n and i*i+f(n,i+2)

それは私が短い取得する方法発見していないことを奇妙だ0ためにi*i>=nそれ以外の場合は非ゼロを。Python 2では、まだ39バイトが得られます

f=lambda n,i=1:~-n/i/i and i*i+f(n,i+2)

boolintPythonのサブクラスFalseです0。つまり、はの許容値です。


1

Python、42 38バイト

f=lambda n,i=1:i*i<n and i*i+f(n,i+2)

1

Python 2、38バイト

s=(1-input()**.5)//2*2;print(s-s**3)/6

デニスの式に基づいていs==-2*kます。フロートを出力します。実際には、入力は平方根、減分され、次の偶数に切り上げられます。


1

PARI / GP33 32 26バイト

デニスのコードから改編:

n->t=(1-n^.5)\2*2;(t-t^3)/6

単純な多項式を使用した私の最初のアイデア(30バイト):

n->t=((n-1)^.5+1)\2;(4*t^3-t)/3

これは効率的な実装であり、実際には私が書くだろうとするバージョンではありません。

a(n)=
{
  my(t=ceil(sqrtint(n-1)/2));
  t*(4*t^2-1)/3;
}

各正方形をループする代替実装(37バイト):

n->s=0;t=1;while(t^2<n,s+=t^2;t+=2);s

一時変数を使用せずに加算を示す別の代替ソリューション(35バイト):

n->sum(k=1,((n-1)^.5+1)\2,(2*k-1)^2)

L 2ノルムを使用したさらに別のソリューション、特に競合的ではありません(40バイト)。これは、ステップサイズのインデックスを持つベクトルがサポートされている場合に適しています。(n->norml2([1..((n-1)^.5+1)\2..2])8バイトをドロップする構文を想像できます。)

n->norml2(vector(((n-1)^.5+1)\2,k,2*k-1))

1

Haskell、32 31バイト

 n#x=sum[x^2+n#(x+2)|x^2<n]
 (#1)

使用例:(#1) 9802-> 166650

編集:@xnorは、巧妙なリストの理解で、バイトを保存しました。ありがとう!


ガードをごまかすのは1バイト短くなりますn#x=sum[x^2+n#(x+2)|x^2<n]
。– xnor

1

ジュリア、29バイト

f(n,i=1)=i^2<n?i^2+f(n,i+2):0

これは、整数を受け入れて整数を返す再帰関数です。

インデックスを1から開始し、その平方が入力より小さい場合、その平方を取り、インデックス+ 2で再利用の結果を追加します。これにより偶数がスキップされます。それ以外の場合は0を返します。


1

Oracle SQL 11.2、97バイト

SELECT NVL(SUM(v),0)FROM(SELECT POWER((LEVEL-1)*2+1,2)v FROM DUAL CONNECT BY LEVEL<:1)WHERE v<:1;

1

ジュリア、26バイト

x->sum((r=1:2:x-1)∩r.^2)

これは、n未満のすべての奇数の正の整数の範囲とその範囲の整数の2乗の配列を構築し、両方の反復可能要素の整数の合計を計算します。

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


1

Reng v.3.3、36バイト

0#ci#m1ø>$a+¡n~
:m%:1,eq^c2*1+²c1+#c

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

説明

1:初期化

 0#ci#m1ø

(カウンター)およびax への入力に設定cします。次の行に進みます。0Im

2:ループ

:m%:1,eq^c2*1+²c1+#c

:現在の値(奇数の2乗)を複製し、[I mm押します。ここで使用する別の回答では、小なりトリックを使用しました。%:1,eSTOS <TOSかどうかを確認します。そうである場合、q^上昇し、ループから抜け出します。さもないと:

         c2*1+²c1+#c

cカウンターを置き、2*それを2倍にし、1+1を加え、²2乗します。c1+#Cincrements c、ループが再び実行されます。

3:最終

        >$a+¡n~

$最後の値(必要以上)をドロップしa+¡、スタックの長さが1になるまで加算してn~出力し、終了します。



1

Mathematica 30バイト

Total[Range[1,Sqrt[#-1],2]^2]&

この名前のない関数は、入力(Range[1,Sqrt[#-1],2])より小さいすべての奇数を2乗して加算します。


1

PHP、64バイト

function f($i){$a=0;for($k=-1;($k+=2)*$k<$i;$a+=$k*$k);echo $a;}

拡張:

function f($i){
    $a=0;
    for($k=-1; ($k+=2)*$k<$i; $a+=$k*$k);
    echo $a;
}

forループの各反復で、kに2を追加し、k 2がに追加されている場合、k 2が未満かどうかをチェックします。$i$a


1

R、60バイト

function(n){i=s=0;while((2*i+1)^2<n){s=s+(2*i+1)^2;i=i+1};s}

n = 1の場合に0を返すなど、チャレンジで説明したとおりに行います。デゴルフド、「;」以下で無視されるRの改行を表します。

function(n){         # Take input n
i = s = 0            # Declare integer and sum variables
while((2*i+1)^2 < n) # While the odd square is less than n
s = s + (2*i+1)^2    # Increase sum by odd square
i = i + 1            # Increase i by 1
s}                   # Return sum, end function expression

1

ジャワ8、128の 119 117 111 49バイト

n->{int s=0,i=1;for(;i*i<n;i+=2)s+=i*i;return s;}

@ThomasのC#ソリューションに基づいています

説明:

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

n->{           // Method with integer as both parameter and return-type
  int s=0,     //  Sum, starting at 0
      i=1;     //  Index-integer, starting at 1
  for(;i*i<n;  //  Loop as long as the square of `i` is smaller than the input
      i+=2)    //    After every iteration, increase `i` by 2
    s+=i*i;    //   Increase the sum by the square of `i`
  return s;}   //  Return the result-sum

0

Python 2、49バイト

これは最終的にaよりも短くなりましたlambda

x=input()
i=1;k=0
while i*i<x:k+=i*i;i+=2
print k

オンラインで試す

私の最短lambda53バイト

lambda x:sum((n-~n)**2for n in range(x)if(n-~n)**2<x)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.