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

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

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

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


6

Haskell, 30 byte

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

Tampak sangat normal.


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

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

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!


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

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

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

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!


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

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.


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

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

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)

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)

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.


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

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!


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.


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;

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!


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.



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.


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.


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

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

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.