N'den küçük olan tek kare sayıları toplayın


19

Bir yaz programı veya fonksiyonu için çıkış toplamını tek kare sayılar (OEIS # A016754) bir daha az girdi n .

Dizideki ilk 44 sayı şunlardır:

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

Dizi için formül a(n) = ( 2n + 1 ) ^ 2.

notlar

  • Programınızın davranışı tanımsız olabilir n < 1(yani, tüm geçerli girdilerdir >= 1.)

Test senaryoları

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

1
Bunun yakın nedenlerinden biri, bir mücadeleyi kapatmak için geçerli nedenler değildir ...
Mego

Yanıtlar:


22

Jöle, 6 bayt

½Ċ|1c3

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Arka fon

Tüm pozitif k tamsayıları için 1² + 3² + ⋯ + (2k - 1) ² = k (2k - 1) (2k +1) ÷ 3 var .

Olduğundan mC r = m! ÷ ((mr)! R!) R -bir dizi m elemanının kombinasyonları , yukarıdaki (2k + 1) C3 = (2k + 1) 2k (2k - 1) ÷ 6 = k (2k - 1) (2k + 1) ÷ 3.

Formülü uygulamak için, en yüksek bulmalıyız 2k + 1 , öyle ki ² <n - (1 2k) . Bir an için parite dikkate alınmadığında, en yüksek hesaplayabilir m şekilde ² <n - (1 m) olarak , m = ceil (srqt (n)) . Koşullu olarak m eşitse arttırmak için, m | 1 (bitlerle VEYA 1 ile ).

Nasıl çalışır

½Ċ|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 bayt

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

f(1)False yerine sıfır döndürmesi gerekirse 31 bayt :

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

6

05AB1E , 10 8 bayt

Kod:

<tLDÉÏnO

Açıklama:

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

Kullanışlı olabilir: t;L·<nO.

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .


6

Haskell, 30 bayt

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

Şaşırtıcı derecede normal görünüyor.


4

C # 126 131 bayt

Yeni soruya uyacak şekilde düzenlenmiş sürüm:

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

Sabit kodlanmış limit kullanma:

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
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Burada cevap üstbilgileri için kararlaştırılan biçim # Language name, number bytestutarlılık içindir.
kedi

2
Neden Console.Readsonundasın?
Martin Ender

1
namespacetek dosyalar için gerekli değildir.
Sadece ASCII

1
Ayrıca System.Console.Write(s);çalışıp çalışmadığını ve ihtiyacınız yoksa birkaç bayt kaydedebilmeniz gerekir Console.Read.
Sadece ASCII

2
@Thomas Programınızı VS'de Ctrl + F5 ile çalıştırabilirsiniz, bu durumda program sona erdikten sonra pencere açık kalır.
Martin Ender

4

Jöle, 7

’½R²m2S

Çevrimiçi deneyin veya değiştirilmiş bir sürümü deneyin birden çok değer için

Şşş ... Dennis uyuyor ...

Yardımları için sohbet eden Sp3000'e teşekkürler!

Açıklama:

’½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 aslında uyanık.
Dennis

@Dennis Ahh! Ve alarm da, görünüşe göre ...
FryAmTheEggman


4

R, 38 36 bayt

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

@Giuseppe xkıvırcık parantezleri kaydetmek için argümanlar listesine geçerek iki bayt kurtardı . İyi fikir!

Ungolfed

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

Çevrimiçi deneyin!


2
PPCG'ye Hoşgeldiniz!
Martin Ender

Bu site harika, teşekkürler!
Michael M

xVarsayılan bir işlev bağımsız değişkenine geçerek iki bayt kaydedebilmeli ve sonra parantezleri kaldırabilirsiniz.
Giuseppe

3

C, 51, 50 48 bayt

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

Çünkü neden en ayrıntılı dillerden birinde golf oynamıyorsunuz? (Hey, en azından Java değil!)

Çevrimiçi deneyin!

Test I / O ile tam çözülmemiş program:

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 languagesPython, C #, LISP, Forth, vb.'den daha golfçü C aslında golf için oldukça iyidir
kedi

@cat Python'dan daha golfik olduğunu sanmıyorum. Java, pas ve C # 'dan kesinlikle daha iyi, ancak bu meydan okumadaki her python cevabı < 50 bytes. Ayrıca, burada alakalı bir meta yayın var .
DJMcMayhem

3

Aslında 7 bayt

√K1|3@█

Çevrimiçi deneyin!

Ayrıca 7 bayt için:

3,√K1|█

Çevrimiçi deneyin!

Bu Dennis'in Jelly cevabı ile aynı formülü kullanır.

Açıklama:

√K1|3@█
√K       push ceil(sqrt(n))
  1|     bitwise-OR with 1
    3@█  x C 3

Bir sonrakine çağrılacak Literallymı?
kedi

3

Oktav, 23 bayt

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

Test yapmak:

[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 Bayt

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

Çevrimiçi deneyin!

Sabit kodlanmış 10000 çözüm:

Martin'in 12 bayt çözümü:

99,2%:)2f#1b

Orijinal 13 baytlık çözümüm:

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

Çevrimiçi deneyin!


Kodunuz 14 bayt (bağlantıda sondaki bir satır besleme vardı), ancak sorun girişten daha küçük kareler istediğinden, giriş 9801 için doğru olmadığını düşünüyorum .
Martin Ender

@MartinButtner Evet, haklısın. Zarif bir düzeltme bulabilir miyim bakalım
A Simmons

2

Pyth, 10 bayt

s<#Qm^hyd2

Test odası

Açıklama:

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 "bayt"

enter image description here

Mathcad'ın tanım ve tüm programlama operatörleri de dahil olmak üzere çeşitli operatörler girmek için klavye kısayollarını kullandığını unutmayın. Örneğin, ctl-] bir while döngüsüne girer - yazılamaz ve yalnızca klavye kısayolu kullanılarak veya Programlama araç çubuğundan girilebilir. "Bayt", bir Mathcad öğesi girmek için gereken klavye işlemlerinin sayısı olarak alınır (örneğin, değişken adı veya işleç).

Bu yarışmayı kazanma şansım olmadığından, doğrudan formül versiyonuyla biraz çeşitlilik ekleyeceğimi düşündüm.


MathCAD nasıl puanlanır? Nereden temin edebilirim?
kedi

Verdiğiniz puanlamanın açıklaması tür ... çürük, IMO
kedi

1
Bu dilin puanlanması için bir meta soru sormalısınız.
Mego

Meta soru kulağa hoş geliyor. Puanlama için dayanıksız bir açıklama yapmaya çalışmak hızla Savaş ve Barışa dönüşecektir.
Stuart Bruff

2

Raket, 57 bayt

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

2

Matl , 10 bayt

qX^:9L)2^s

DÜZENLEME (2016 30 Temmuz): bağlantılı kod cümledeki 9Ltarafından 1Ldilinde son değişikliklere uyum sağlamak.

Çevrimiçi deneyin!

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 bayt

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

İçin, Eğer n=1bu çıkışa geçerli olduğundan, Falseyerine 0, o zaman 37 bayt almak için temel durum dönüştürme önleyebilirsiniz

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

Ben almak için daha kısa bir yol bulmuş değil bu garip 0için i*i>=nve sıfırdan farklı aksi. Python 2'de, biri hala 39 bayt alır

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

boolintPython'da bir alt sınıftır, yani Falsekabul edilebilir bir değerdir 0.
kedi


1

Python, 42 38 bayt

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

1

Python 2, 38 bayt

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

Dennis'in formülüne dayanarak , ile s==-2*k. Bir şamandıra çıktılar. Aslında, girdi kare köklüdür, azaltılır, ardından bir sonraki çift sayıya yuvarlanır.


1

PARI / GP , 33 32 26 bayt

Dennis'in kodundan uyarlandı :

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

Basit bir polinom formülü kullanarak ilk fikrim (30 bayt):

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

Bu etkili bir uygulama, aslında yazdığım ungolfed sürümünden çok farklı değil:

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

Her bir karenin üzerinden geçen alternatif bir uygulama (37 bayt):

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

Geçici bir değişken olmadan toplamı gösteren başka bir alternatif çözüm (35 bayt):

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

Yine bir başka çözüm kullanılarak değil, özellikle de rekabetçi (40 bayt), L 2 normuna . Adım boyutu indeksleri olan vektörler için destek olsaydı bu daha iyi olurdu. ( n->norml2([1..((n-1)^.5+1)\2..2])8 bayt düşecek sözdizimi düşünülebilir .)

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

1

Haskell, 32 31 bayt

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

Kullanım örneği: (#1) 9802 -> 166650.

Düzenleme: @xnor akıllı bir liste anlama ile bir bayt kaydetti. Teşekkürler!


Muhafızı aldatmak için bir bayt daha kısa:n#x=sum[x^2+n#(x+2)|x^2<n]
xnor

1

Julia, 29 bayt

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

Bu, bir tamsayıyı kabul eden ve bir tam sayı döndüren özyinelemeli bir işlevdir.

1'de bir indeks başlatırız ve karesi girişten küçükse kareyi alırız ve endeks + 2'ye tekrar basmanın sonucunu ekleriz, bu da sayıların bile atlanmasını sağlar, aksi takdirde 0 döndürür.


1

Oracle SQL 11.2, 97 bayt

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 bayt

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

Bu, n'nin altındaki tüm tek, pozitif tamsayıların aralığını oluşturur aralığını ve bu aralıktaki tamsayıların karelerinin dizisini oluşturur, ardından her iki yinelenebilirdeki tamsayıların toplamını hesaplar.

Çevrimiçi deneyin!


1

Reng v.3.3, 36 bayt

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

Burada deneyin!

açıklama

1: başlatma

 0#ci#m1ø

Set ciçin 0(sayaç) ve giriş Iiçinm balta.sonraki satıra gider.

2: döngü

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

:geçerli değeri (kare tek sayı) çoğaltır ve [ mBaltayı mindiririm. Burada kullandığım başka bir cevapta daha az numara kullandım. %:1,eSTOS <TOS'un olup olmadığını kontrol eder. Eğer öyleyse, q^yukarı çıkar ve döngüden çıkar. Aksi takdirde:

         c2*1+²c1+#c

csayacı kapatır, 2*iki katına çıkarır, 1+ekler ve ²kareler.c1+#Cartışlarlac ve döngü tekrar gider.

3: final

        >$a+¡n~

$son değeri (istenenden daha büyük) düşürür, a+¡yığının uzunluğu 1 olana kadar ekler, n~çıktılar ve sonlandırılır.



1

Mathematica 30 bayt

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

Bu adlandırılmamış işlev, input ( Range[1,Sqrt[#-1],2]) öğesinden daha küçük olan tüm tek sayıları kareler ve ekler.


1

PHP, 64 bayt

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

Expanded:

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

Her yineleme üzerinde fork ise döngü, bu k ve kontrol etmek 2 katacak 2 den az olduğu $ibu eklenti k ise, 2 için $a.


1

R, 60 bayt

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

N = 1 durumu için 0 döndürülmesi de dahil olmak üzere, tam olarak tehditte açıklandığı gibi. Degolfed, ';' "R", aşağıda göz ardı edilen linebreak'i temsil eder:

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 bayt

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

Göre @Thomas ', C # çözeltisi .

Açıklama:

Çevrimiçi deneyin.

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 bayt

Bu, a lambda.

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

Çevrimiçi deneyin

En kısa lambda, 53 bayt :

lambda x:sum((n-~n)**2for n in range(x)if(n-~n)**2<x)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.