Zsumuj nieparzyste liczby kwadratowe mniejsze niż N.


19

Napisz program lub funkcję do wyjścia sumę liczb nieparzystych kwadratowych (OEIS # A016754) mniej niż wejście n .

Pierwsze 44 liczby w sekwencji to:

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

Wzór na sekwencję to a(n) = ( 2n + 1 ) ^ 2.

Notatki

  • Zachowanie programu może być niezdefiniowane n < 1(tzn. Wszystkie prawidłowe dane wejściowe są >= 1.)

Przypadki testowe

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

1
Żaden z bliskich powodów tego nie jest ważnym powodem zamknięcia wyzwania ...
— Mego

Odpowiedzi:


22

Galaretka, 6 bajtów

½Ċ|1c3

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

tło

Dla wszystkich dodatnich liczb całkowitych k mamy 1² + 3² + ⋯ + (2k - 1) ² = k (2k - 1) (2k +1) ÷ 3 .

Ponieważ są m C r = m! ÷ ((mr)! R!) R - kombinacje zbioru m elementów, powyższe można obliczyć jako (2k + 1) C 3 = (2k + 1) 2k (2k - 1) ÷ 6 = k (2k - 1) (2k + 1) ÷ 3.

Aby zastosować formułę, musimy znaleźć najwyższe 2k + 1 takie, że (2k - 1) ² <n . Ignorując przez chwilę parzystość, możemy obliczyć najwyższą m taką, że (m - 1) ² <n jako m = ceil (srqt (n)) . Aby warunkowo zwiększyć wartość m, jeśli jest równa, wystarczy obliczyć wartość m | 1 (bitowe LUB z 1 ).

Jak to działa

½Ċ|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 bajtów

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

31 bajtów, jeśli f(1)trzeba zwrócić zero zamiast false:

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

6

05AB1E , 10 8 bajtów

Kod:

<tLDÉÏnO

Wyjaśnienie:

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

Może się przydać: t;L·<nO.

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .


6

Haskell, 30 bajtów

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

Zaskakująco normalnie wyglądający.


4

C #, 126 131 bajtów

Zmodyfikowana wersja zgodna z nowym pytaniem:

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

Korzystanie z ustalonego limitu:

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
Witamy w Programowaniu zagadek i Code Golf! Uzgodnionym formatem nagłówków odpowiedzi jest tutaj # Language name, number bytesspójność.
— kot

2
Dlaczego ty Console.Readna końcu?
— Martin Ender

1
namespaceNie są wymagane dla pojedynczych plików.
— Tylko ASCII

1
Powinieneś także być w stanie zaoszczędzić kilka bajtów, robiąc, System.Console.Write(s);jeśli to działa, a jeśli nie potrzebujesz Console.Read.
— Tylko ASCII

2
@ Thomas Możesz uruchomić swój program za pomocą Ctrl + F5 w VS, w którym to przypadku okno pozostanie otwarte po zakończeniu programu.
— Martin Ender

4

Galaretka, 7

’½R²m2S

Wypróbuj online lub wypróbuj zmodyfikowaną wersję dla wielu wartości

Ćśś ... Dennis śpi ...

Dzięki Sp3000 na czacie za pomoc!

Wyjaśnienie:

’½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 właściwie nie śpi.
— Dennis

@Dennis Ahh! I czujny też, najwyraźniej ...
— FryAmTheEggman 21.04.16


4

R, 38 36 bajtów

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

@Giuseppe zapisał dwa bajty, przechodząc xdo listy argumentów, aby zapisać nawiasy klamrowe. Fajny pomysł!

Nie golfił

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

Wypróbuj online!


2
Witamy w PPCG!
— Martin Ender

Ta strona jest niesamowita, dzięki!
— Michael M

Powinieneś być w stanie zapisać dwa bajty, przechodząc xdo domyślnego argumentu funkcji, a następnie możesz usunąć nawiasy klamrowe.
— Giuseppe

3

C, 51, 50 48 bajtów

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

Bo dlaczego nie golf w jednym z najbardziej pełnych języków? (Hej, przynajmniej nie jest to Java!)

Wypróbuj online!

Pełny program bez golfa, z testowym wejściem / wyjściem:

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 languagesBardziej golfowy niż Python, C #, LISP, Forth itp., C jest naprawdę całkiem dobry do gry w golfa
— kot

@cat Nie sądzę, że jest bardziej golfowy niż python. Jest zdecydowanie lepszy niż Java, rdza i C #, ale każda odpowiedź na to pytanie jest w Pythonie < 50 bytes. Ponadto, nie jest istotne meta post tutaj .
— DJMcMayhem

3

Właściwie 7 bajtów

√K1|3@█

Wypróbuj online!

Również dla 7 bajtów:

3,√K1|█

Wypróbuj online!

Wykorzystuje to tę samą formułę, co w odpowiedzi Jelly'ego na Jelly.

Wyjaśnienie:

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

Czy zadzwoni następny Literally?
— kot

3

Oktawa, 23 bajty

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

Testowanie:

[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 bajtów

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

Wypróbuj online!

Zakodowane 10000 rozwiązań:

12 bajtowe rozwiązanie Martina:

99,2%:)2f#1b

Moje oryginalne 13-bajtowe rozwiązanie:

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

Wypróbuj online!


Twój kod ma 14 bajtów (w linku miałeś końcowy przesuw linii), ale myślę, że nie jest poprawny dla wejścia 9801, ponieważ wyzwanie wymaga kwadratów mniejszych niż wejście.
— Martin Ender

@MartinButtner Tak, masz rację. Zobaczę, czy uda mi się znaleźć elegancką naprawę
— A Simmons

2

Pyth, 10 bajtów

s<#Qm^hyd2

Zestaw testowy

Wyjaśnienie:

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

Alternatywa (10 bajtów):s<#Q%2t^R2
— Leaky Nun

2

Mathcad, 31 „bajtów”

wprowadź opis zdjęcia tutaj

Zauważ, że Mathcad używa skrótów klawiaturowych do wprowadzania kilku operatorów, w tym definicji i wszystkich operatorów programowania. Na przykład ctl-] wchodzi w pętlę while - nie można jej wpisać i można ją wprowadzić tylko za pomocą skrótu klawiaturowego lub z paska narzędzi Programowanie. „Bajty” to liczba operacji na klawiaturze potrzebnych do wprowadzenia elementu Mathcad (np. Nazwa zmiennej lub operator).

Ponieważ nie mam szans na wygraną w tym konkursie, pomyślałem, że dodam trochę urozmaicenia dzięki bezpośredniej wersji formuły.


Jak ocenia się MathCAD? Gdzie mogę to dostać?
— kot

Wyjaśnienie, które podajesz, jest trochę ... kiepskie, IMO
— kot

1
Musisz napisać meta pytanie do oceny tego języka.
— Mego,

Pytanie meta brzmi dobrze. Próba podania nieskromnego wyjaśnienia dla punktacji szybko przerodziłaby się w Wojnę i Pokój.
— Stuart Bruff

2

Rakieta, 57 bajtów

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

2

MATL , 10 bajtów

qX^:9L)2^s

EDYCJA (30 lipca 2016 r.): Połączony kod zastępuje się 9Lprzez, 1Laby dostosować się do ostatnich zmian w języku.

Wypróbuj 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 bajtów

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

Jeśli, na n=1, to ważny do wyjścia Falsezamiast 0, to możemy uniknąć konwersji przypadku bazowego, aby uzyskać 37 bajtów

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

To dziwne, że nie znalazłem krótszą drogę do zdobycia 0dla i*i>=ni niezerowe inaczej. W Pythonie 2 wciąż dostaje się 39 bajtów

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

booljest podklasą języka intPython, co oznacza, że Falsejest akceptowalną wartością dla 0.
— kot

Możliwy duplikat odpowiedzi orlp
— Mego,

1

Python, 42 38 bajtów

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

1

Python 2, 38 bajtów

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

Na podstawie wzoru Dennisa , z s==-2*k. Wysyła liczbę zmiennoprzecinkową. W efekcie dane wejściowe są pierwiastkowane, zmniejszane, a następnie zaokrąglane w górę do następnej liczby parzystej.


1

PARI / GP , 33 32 26 bajtów

Zaadaptowano z kodu Dennisa :

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

Mój pierwszy pomysł (30 bajtów), używając prostej formuły wielomianowej:

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

Jest to wydajna implementacja, właściwie nie bardzo różna od wersji bez golfisty, którą napisałbym:

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

Alternatywna implementacja (37 bajtów), która zapętla się nad każdym z kwadratów:

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

Inne alternatywne rozwiązanie (35 bajtów) demonstrujące sumowanie bez zmiennej tymczasowej:

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

Jeszcze inne rozwiązanie, niezbyt konkurencyjne (40 bajtów), wykorzystujące normę L 2 . Byłoby lepiej, gdyby istniało wsparcie dla wektorów ze wskaźnikami wielkości kroku. (Można sobie wyobrazić składnię, n->norml2([1..((n-1)^.5+1)\2..2])która zrzuci 8 bajtów).

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

1

Haskell, 32 31 bajtów

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

Przykład użycia: (#1) 9802-> 166650.

Edycja: @xnor zapisał bajt ze sprytnym zrozumieniem listy. Dzięki!


Jest o bajt krótszy, aby oszukać strażnika:n#x=sum[x^2+n#(x+2)|x^2<n]
— lub

1

Julia, 29 bajtów

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

Jest to funkcja rekurencyjna, która przyjmuje liczbę całkowitą i zwraca liczbę całkowitą.

Indeks rozpoczynamy od 1, a jeśli jego kwadrat jest mniejszy niż wartość wejściowa, bierzemy kwadrat i dodajemy wynik ponownego użycia do indeksu + 2, co zapewnia pomijanie liczb parzystych, w przeciwnym razie zwracamy 0.


1

Oracle SQL 11.2, 97 bajtów

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 bajtów

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

To konstruuje zakres wszystkich nieparzystych, dodatnich liczb całkowitych poniżej n i tablicę kwadratów liczb całkowitych w tym zakresie, a następnie oblicza sumę liczb całkowitych w obu iterowalnych.

Wypróbuj online!


1

Reng v.3.3, 36 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie

1: inicjalizacja

 0#ci#m1ø

Ustawia cna 0(licznik) i dane wejściowe Ido msiekiery. 1øprzechodzi do następnej linii.

2: pętla

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

:powiela bieżącą wartość (kwadratową liczbę nieparzystą) i [I mkładzie msiekierę w dół. Użyłem mniej niż lewy w innej odpowiedzi , której tu używam. %:1,esprawdza, czy STOS <TOS. Jeśli tak, q^idzie w górę i wychodzi z pętli. Inaczej:

         c2*1+²c1+#c

codkłada licznik, 2*podwaja go, 1+dodaje jeden i podnosi ²go do kwadratu. c1+#Czwiększa się c, a pętla znów się uruchamia.

3: końcowy

        >$a+¡n~

$upuszcza ostatnią wartość (większą niż pożądana), a+¡dodaje, aż długość stosu wynosi 1, n~wysyła i kończy.



1

Mathematica 30 bajtów

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

Ta nienazwana funkcja Range[1,Sqrt[#-1],2]podnosi do kwadratu wszystkie liczby nieparzyste mniejsze niż input ( ) i dodaje je.


1

PHP, 64 bajty

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

Rozszerzony:

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

Na każdej iteracji forpętli, doda 2 k i sprawdzić czy k 2 jest mniejsza niż $i, jeśli jest to dodatek k 2 do $a.


1

R, 60 bajtów

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

Robi dokładnie tak, jak opisano w pytaniu, w tym zwraca 0 dla przypadku n = 1. Degolfed, ”;” reprezentuje podział linii w R, zignorowany poniżej:

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 bajtów

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

Na podstawie rozwiązania C # @Thomas .

Wyjaśnienie:

Wypróbuj 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 bajtów

To skończyło się na krótszym niż a lambda.

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

Wypróbuj online

Moi najkrótsze lambda, 53 bajtów :

lambda x:sum((n-~n)**2for n in range(x)if(n-~n)**2<x)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.