Jumlahkan bilangan kuadrat ganjil kurang dari N

19

Tulis program atau fungsi untuk menampilkan jumlah angka kuadrat ganjil (OEIS # A016754) kurang dari satu input n .

44 angka pertama dalam urutan adalah:

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

Rumus untuk urutan adalah a(n) = ( 2n + 1 ) ^ 2.

Catatan

  • Perilaku program Anda mungkin tidak ditentukan untuk n < 1(yaitu, semua input yang valid adalah>= 1 .)

Uji kasus

1 => 0
2 => 1
9 => 1
10 => 10
9801 => 156849
9802 => 166650
10000 => 166650
Thomas
sumber
1
Tak satu pun dari alasan dekat tentang ini adalah alasan yang sah untuk menutup tantangan ...
Mego

Jawaban:

22

Jelly, 6 byte

½Ċ|1c3

Cobalah online! atau verifikasi semua kasus uji .

Latar Belakang

Untuk semua bilangan bulat positif k , kita memiliki 1² + 3² + ⋯ + (2k - 1) ² = k (2k - 1) (2k +1) ÷ 3 .

Karena ada mC r = m! ÷ ((mr)! R!) R - kombinasi dari set elemen m , di atas dapat dihitung sebagai (2k + 1) C3 = (2k + 1) 2k (2k - 1) ÷ 6 = k (2k - 1) (2k + 1) ÷ 3.

Untuk menerapkan rumus, kita harus menemukan 2k + 1 tertinggi sehingga (2k - 1) ² <n . Mengabaikan paritas untuk sesaat, kita dapat menghitung m tertinggi sehingga (m - 1) ² <n sebagai m = ceil (srqt (n)) . Untuk menambahkan secara kondisional m jika genap, hitung saja m | 1 (bitwise ATAU dengan 1 ).

Bagaimana itu bekerja

½Ċ|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).
Dennis
sumber
6

JavaScript (ES6), 30 byte

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

31 byte jika f(1)perlu mengembalikan nol, bukan salah:

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

05AB1E , 10 8 byte

Kode:

<tLDÉÏnO

Penjelasan:

<         # 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.

Mungkin berguna: t;L·<nO .

Menggunakan pengodean CP-1252 . Cobalah online! .

Adnan
sumber
6

Haskell, 30 byte

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

Tampak sangat normal.

Tidak
sumber
4

C #, 126 131 byte

Versi yang diedit agar sesuai dengan pertanyaan baru:

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);}}

Menggunakan batas hardcoded:

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();}}}
Thomas
sumber
4
Selamat Datang di Programming Puzzles dan Code Golf! Format yang disepakati untuk header jawaban di sini adalah # Language name, number bytesuntuk konsistensi.
kucing
2
Mengapa Anda Console.Readpada akhirnya?
Martin Ender
1
namespaces tidak diperlukan untuk file tunggal.
ASCII
1
Anda juga harus dapat menyimpan beberapa byte dengan melakukan System.Console.Write(s);jika berhasil, dan jika Anda tidak memerlukannya Console.Read.
ASCII
2
@ Thomas Anda dapat menjalankan program Anda dengan Ctrl + F5 di VS dalam hal ini jendela akan tetap terbuka setelah program berakhir.
Martin Ender
4

Jelly, 7

’½R²m2S

Cobalah online atau coba versi modifikasi untuk beberapa nilai

Ssst ... Dennis sedang tidur ...

Terima kasih kepada Sp3000 dalam obrolan untuk bantuan mereka!

Penjelasan:

’½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
FryAmTheEggman
sumber
9
Dennis sebenarnya sudah bangun.
Dennis
@Dennis Ahh! Dan waspada juga, rupanya ...
FryAmTheEggman
4

R, 38 36 byte

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

@ Giuseppe menyimpan dua byte dengan berpindah xke daftar argumen untuk menyimpan kurung kurawal. Ide keren!

Tidak disatukan

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

Cobalah online!

Michael M.
sumber
2
Selamat datang di PPCG!
Martin Ender
Situs ini luar biasa, terima kasih!
Michael M
Anda harus dapat menyimpan dua byte dengan berpindah xke argumen fungsi default dan kemudian Anda dapat menghapus kawat gigi.
Giuseppe
3

C, 51, 50 48 byte

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

Karena mengapa tidak bermain golf di salah satu bahasa yang paling bertele-tele? (Hei, setidaknya itu bukan Jawa!)

Cobalah online!

Program ungolfed penuh, dengan tes 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;}
DJMcMayhem
sumber
most verbose languagesLebih golf daripada Python, C #, LISP, Forth, dll, C sebenarnya cukup bagus untuk golf
cat
@ kucing saya tidak berpikir itu lebih golf daripada python. Ini jelas lebih baik daripada java, rust dan C #, tetapi setiap jawaban python pada tantangan ini adalah < 50 bytes. Juga, ada pos meta yang relevan di sini .
DJMcMayhem
3

Sebenarnya, 7 byte

√K1|3@█

Cobalah online!

Juga untuk 7 byte:

3,√K1|█

Cobalah online!

Ini menggunakan rumus yang sama seperti pada jawaban Dennis's Jelly.

Penjelasan:

√K1|3@█
√K       push ceil(sqrt(n))
  1|     bitwise-OR with 1
    3@█  x C 3
Mego
sumber
Akankah yang berikutnya dipanggil Literally?
kucing
3

Oktaf, 23 byte

@(x)(x=1:2:(x-1)^.5)*x'

Pengujian:

[f(1); f(2); f(3); f(10); f(9801); f(9802); f(10000)]
ans =    
        0
        1
        1
       10
   156849
   166650
   166650
Stewie Griffin
sumber
3

CJam, 15 Bytes

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

Cobalah online!

Solusi Hardcoded 10000:

Solusi 12 byte Martin:

99,2%:)2f#1b

Solusi 13 byte asli saya:

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

Cobalah online!

A Simmons
sumber
Kode Anda adalah 14 byte (Anda memiliki linefeed jejak di tautan), tetapi saya pikir itu tidak benar untuk input 9801, karena tantangannya meminta kotak lebih kecil dari input.
Martin Ender
@ MartinButtner Ya, Anda benar. Saya akan melihat apakah saya dapat menemukan perbaikan yang elegan
A Simmons
2

Pyth, 10 byte

s<#Qm^hyd2

Suite uji

Penjelasan:

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
isaacg
sumber
Alternatif (10 byte):s<#Q%2t^R2
Leaky Nun
2

Mathcad, 31 "byte"

masukkan deskripsi gambar di sini

Perhatikan bahwa Mathcad menggunakan pintasan keyboard untuk memasukkan beberapa operator, termasuk definisi dan semua operator pemrograman. Sebagai contoh, ctl-] memasuki loop sementara - itu tidak dapat diketik dan hanya dapat dimasukkan menggunakan pintasan keyboard atau dari toolbar Programming. "Bytes" dianggap jumlah operasi keyboard yang diperlukan untuk memasukkan item Mathcad (misalnya, nama variabel atau operator).

Karena saya tidak memiliki peluang untuk memenangkan kompetisi ini, saya pikir saya akan menambahkan sedikit variasi dengan versi formula langsung.

Stuart Bruff
sumber
Bagaimana skor MathCAD? Di mana saya bisa mendapatkannya?
kucing
Penjelasan tentang skor yang Anda berikan agak ... tipis, IMO
cat
1
Anda perlu membuat pertanyaan meta untuk penilaian bahasa ini.
Mego
Pertanyaan meta terdengar bagus. Mencoba memberikan penjelajahan tanpa cacat untuk skor akan dengan cepat berubah menjadi Perang dan Perdamaian.
Stuart Bruff
2

Racket, 57 byte

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

MATL , 10 byte

qX^:9L)2^s

EDIT (30 Juli 2016): kode tertaut menggantikan 9Ldengan 1Luntuk beradaptasi dengan perubahan terbaru dalam bahasa.

Cobalah online!

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
Luis Mendo
sumber
1

Python, 39 byte

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

Jika, untuk n=1, lebih valid untuk keluaran Falsedaripada 0, maka kita dapat menghindari konversi kasus dasar untuk mendapatkan 37 byte

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

Ini aneh bahwa saya belum menemukan cara yang lebih pendek untuk mendapatkan 0untuk i*i>=ndan nol sebaliknya. Dalam Python 2, kita masih mendapat 39 byte

f=lambda n,i=1:~-n/i/i and i*i+f(n,i+2)
Tidak
sumber
booladalah subclass dari intdalam Python, yang artinya Falseadalah nilai yang dapat diterima untuk 0.
kucing
Kemungkinan duplikat jawaban orlp
Mego
1

Python, 42 38 byte

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

Python 2, 38 byte

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

Didasarkan pada formula Dennis , dengan s==-2*k. Output mengapung. Efeknya, input berakar persegi, dikurangi, kemudian dibulatkan ke angka genap berikutnya.

Tidak
sumber
1

PARI / GP , 33 32 26 byte

Diadaptasi dari kode Dennis :

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

Ide pertama saya (30 byte), menggunakan rumus polinomial sederhana:

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

Ini adalah implementasi yang efisien, sebenarnya tidak jauh berbeda dari versi yang tidak diklik yang akan saya tulis:

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

Implementasi alternatif (37 byte) yang melingkari setiap kotak:

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

Solusi alternatif lain (35 byte) yang menunjukkan penjumlahan tanpa variabel sementara:

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

Namun solusi lain, tidak terlalu kompetitif (40 byte), menggunakan norma L 2 . Ini akan lebih baik jika ada dukungan untuk vektor dengan indeks ukuran langkah. (Orang bisa membayangkan sintaks n->norml2([1..((n-1)^.5+1)\2..2])yang akan turun 8 byte.)

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

Haskell, 32 31 byte

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

Contoh penggunaan: (#1) 9802->166650 .

Sunting: @xnatau menyimpan satu byte, dengan pemahaman daftar yang cerdas. Terima kasih!

nimi
sumber
Ini satu byte lebih pendek untuk menipu penjaga:n#x=sum[x^2+n#(x+2)|x^2<n]
xnor
1

Julia, 29 byte

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

Ini adalah fungsi rekursif yang menerima integer dan mengembalikan integer.

Kami memulai indeks pada 1 dan jika kuadratnya kurang dari input, kami mengambil kuadrat dan menambahkan hasil pengunduran diri pada indeks + 2, yang memastikan bahwa bilangan genap dilewati, jika tidak kita mengembalikan 0.

Alex A.
sumber
1

Oracle SQL 11.2, 97 byte

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

Julia, 26 byte

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

Ini membangun kisaran semua bilangan bulat ganjil dan positif di bawah ini n dan array kuadrat dari bilangan bulat dalam kisaran itu, kemudian menghitung jumlah bilangan bulat di kedua iterables.

Cobalah online!

Dennis
sumber
1

Reng v.3.3, 36 byte

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

Coba di sini!

Penjelasan

1: inisialisasi

 0#ci#m1ø

Atur cke 0(penghitung) dan input Ike mkapak.pergi ke baris berikutnya.

2: lingkaran

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

:menduplikasi nilai saat ini (angka ganjil kuadrat) dan [saya mmeletakkan mkapak ke bawah. Saya menggunakan trik yang kurang dari pada jawaban lain , yang saya gunakan di sini. %:1,ememeriksa apakah STOS <TOS. Jika ya, q^naik dan keluar dari loop. Jika tidak:

         c2*1+²c1+#c

cmenempatkan penghitung turun, 2*menggandakannya, 1+menambahkan satu, dan ²kuadratkan. c1+#Ckenaikanc , dan loop berjalan lagi.

3: final

        >$a+¡n~

$menjatuhkan nilai terakhir (lebih besar dari yang diinginkan), a+¡menambahkan sampai panjang tumpukan adalah 1, n~output dan berakhir.

Conor O'Brien
sumber
1

Mathematica 30 byte

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

Fungsi yang tidak disebutkan namanya ini mengkuadratkan semua angka ganjil kurang dari input ( Range[1,Sqrt[#-1],2]) dan menambahkannya.

DavidC
sumber
1

PHP, 64 byte

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

Diperluas:

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

Pada setiap iterasi dari forloop, itu akan menambah 2 ke k dan memeriksa apakah k 2 kurang dari $i, jika itu menambahkan k 2 ke $a.

Kucing Bisnis
sumber
1

R, 60 byte

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

Apakah persis seperti yang dijelaskan dalam tantangan, termasuk mengembalikan 0 untuk n = 1 kasus. Merosot, ';' mewakili linebreak di R, diabaikan di bawah:

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
Forgottenscience
sumber
1

Java 8, 128 119 117 111 49 byte

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

Berdasarkan @Thomas C # solusi ' .

Penjelasan:

Cobalah online.

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
Kevin Cruijssen
sumber
0

Python 2, 49 byte

Ini akhirnya lebih pendek dari a lambda.

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

Cobalah online

Terpendek saya lambda, 53 byte :

lambda x:sum((n-~n)**2for n in range(x)if(n-~n)**2<x)
mbomb007
sumber