Підсумовуйте непарні квадратні числа менше 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
Жодна з близьких причин цього не є поважними причинами, щоб закрити виклик ...
Мего,

Відповіді:


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 такі, що (2k - 1) ² <n . Ігноруючи паритет на мить, ми можемо обчислити найвищий m такий, що (m - 1) ² <n як m = ceil (srqt (n)) . Щоб умовно збільшувати m, якщо воно парне, просто обчисліть m | 1 (біт АБО з 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)

31 байт, якщо f(1)потрібно повернути нуль замість хибного:

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

6

05AB1E , 10 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 Ви можете запустити свою програму за допомогою Ctrl + F5 в VS, і в цьому випадку вікно залишатиметься відкритим після завершення програми.
Мартін Ендер

4

Желе, 7

’½R²m2S

Спробуйте в Інтернеті або спробуйте модифіковану версію для кількох значень

Шш ... Денніс спить ...

Дякуємо 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у список аргументів, щоб зберегти фігурні дужки. Класна ідея!

Безумовно

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!
Мартін Ендер

Цей сайт приголомшливий, дякую!
Майкл М

Ви повинні мати можливість зберегти два байти, перемістившись xв аргумент функції за замовчуванням, а потім ви зможете видалити дужки.
Джузеппе

3

C, 51, 50 48 байт

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

Бо чому б не гольф однією з найбільш багатослівних мов? (Гей, принаймні це не Java!)

Спробуйте в Інтернеті!

Повна програма без вогків, з тестовим введенням / виводом:

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, C #, LISP, Forth і т. Д., C насправді досить хороший для гольфу
кішка

@cat Я не думаю, що це більш гофро, ніж пітон. Це, безумовно, краще, ніж java, іржа та C #, але кожна відповідь пітона на цей виклик є < 50 bytes. Крім того , є відповідний мета пост тут .
DJMcMayhem


3

Октава, 23 байти

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

Тестування:

[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 байт

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

Спробуйте в Інтернеті!

Твердокодовані 10000 рішень:

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 "байт"

enter image description here

Зауважте, що Mathcad використовує комбінації клавіш для введення декількох операторів, включаючи визначення та всіх операторів програмування. Наприклад, ctl-] вводить цикл у той час - він не може бути введений і його можна ввести лише за допомогою комбінації клавіш або з панелі інструментів програмування. "Байти" приймаються як кількість операцій на клавіатурі, необхідних для введення елемента Mathcad (наприклад, ім'я змінної або оператора).

Оскільки у мене немає шансів перемогти в цьому конкурсі, я подумав, що додаю трохи різноманітності з прямою версією формули.


Як забивається MathCAD? Де я можу його взяти?
кіт

Пояснення балів, які ви даєте, є своєрідним… химерним, IMO
кіт

1
Потрібно скласти мета-запитання для оцінювання цієї мови.
Мего

Мета питання звучить добре. Спроба дати необґрунтоване пояснення за рахунок швидко перетвориться на Війну та мир.
Стюарт Брюф


2

MATL , 10 байт

qX^:9L)2^s

EDIT (30 липня 2016 р.): Пов'язаний код замінюється 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

Пітон, 39 байт

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

Якщо, наприклад n=1, це правильне виведення, Falseа не 0тоді, ми можемо уникнути перетворення базового випадку, щоб отримати 37 байт

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)

boolє підкласом intPython, що означає Falseприйнятне значення для 0.
кіт

Можливий дублікат відповіді orlp
Mego


1

Python 2, 38 байт

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

Спираючись на формулу Денніса , с s==-2*k. Виводить поплавок. Фактично, вхід вводиться у квадрат, укорочується, потім округляється до наступного парного числа.


1

PARI / GP , 33 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)

Ще одне рішення, не особливо конкурентне (40 байт), використовуючи норму L 2 . Це було б краще, якби була підтримка векторів із ступінчастими показниками. (Можна було б уявити синтаксис, 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 зберег байт із розумним розумінням списку. Спасибі!


Це байт коротший, щоб обдурити охорону: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 та масив квадратів цілих чисел у цьому діапазоні, а потім обчислює суму цілих чисел в обох ітерабелях.

Спробуйте в Інтернеті!


1

Reng v.3.3, 36 байт

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

Спробуйте тут!

Пояснення

1: ініціалізація

 0#ci#m1ø

Набори cдля 0(лічильника) і входу Iв mAx.переходить до наступного рядка.

2: петля

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

:дублює поточне значення (непарне число в квадраті) і [я mвідкладає mсокиру вниз. Я використовував менш витівку в іншій відповіді , яку я тут використовую. %:1,eперевіряє, чи STOS <TOS. Якщо є, q^піднімається вгору і виривається з петлі. Інакше:

         c2*1+²c1+#c

cопускає лічильник, 2*подвоює його, 1+додає один і розміщує його в ²квадраті. c1+#Cприростиc , і петля знову йде.

3: фінал

        >$a+¡n~

$скидає останнє значення (більше, ніж бажане), a+¡додає, поки довжина стека не дорівнює 1, n~виводить і не припиняється.



1

Mathematica 30 байт

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

Ця неназвана функція квадратує всі непарні числа менше вхідних ( Range[1,Sqrt[#-1],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циклу вона додаватиме 2 до k і перевіряє, чи k 2 менше, ніж $iякщо вона додає k 2 до $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}

Діє точно так, як описано в виклику, включаючи повернення 0 для n = 1 випадку. Degolfed, ';' являє собою розрив рядка в 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

Java 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 байт

Це в кінцевому підсумку було коротше, ніж lambda.

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

Спробуйте в Інтернеті

Мій найкоротший lambda, 53 байти :

lambda x:sum((n-~n)**2for n in range(x)if(n-~n)**2<x)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.