Суммируйте нечетные квадратные числа меньше чем 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) (2к + 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)необходимо вернуть ноль вместо false:

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
Добро пожаловать в Программирование Пазлов и Code Golf! Согласованный формат заголовков ответов здесь # 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
Деннис на самом деле не спит.
Деннис

@ Денис Ааа! И, видимо, тоже настороже ...
FryAmTheEggman


4

R, 38 36 байт

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

@Giuseppe сохранил два байта, перейдя xв список аргументов, чтобы сохранить фигурные скобки. Классная идея!

Ungolfed

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, Rust и C #, но каждый ответ Python на этот вызов таков < 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

Mathcad, 31 "байт"

введите описание изображения здесь

Обратите внимание, что Mathcad использует сочетания клавиш для ввода нескольких операторов, включая определение и все операторы программирования. Например, ctl-] входит в цикл while - он не может быть набран и может быть введен только с помощью сочетания клавиш или с панели инструментов программирования. «Байт» - это количество операций клавиатуры, необходимых для ввода элемента Mathcad (например, имя переменной или оператора).

Поскольку у меня нет шансов на победу в этом конкурсе, я подумал, что добавлю немного разнообразия в версию с прямой формулой.


Как оценивается MathCAD? Где я могу получить это?
кот

Объяснение подсчета очков, которое вы даете, довольно ... хлипкое, IMO
кошка,

1
Вам нужно задать мета вопрос для оценки этого языка.
Мего

Мета вопрос звучит хорошо. Попытка дать легкое объяснение выигрыша быстро обернулась бы войной и миром.
Стюарт Бруфф

2

Ракетка, 57 байт

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

2

MATL , 10 байт

qX^:9L)2^s

РЕДАКТИРОВАТЬ (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

Python, 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является подклассом intв Python, что означает 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

Юлия, 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в mтопор. переходит на следующую строку.

2: петля

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

:дублирует текущее значение (нечетное число в квадрате) и [I mкладет mтопор вниз. Я использовал менее чем трюк в другом ответе , который я использую здесь. %:1,eпроверяет, если STOS <TOS. Если это так, q^идет вверх и выходит из цикла. В противном случае:

         c2*1+²c1+#c

cкладет счетчик вниз, 2*удваивает его, 1+добавляет один и ²возводит в квадрат. c1+#Cувеличивается c, и цикл повторяется.

3: финал

        >$a+¡n~

$сбрасывает последнее значение (больше желаемого), a+¡добавляет, пока длина стека не станет n~равной 1, выводит и завершает работу.



1

Mathematica 30 байтов

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

Эта безымянная функция возводит в квадрат все нечетные числа меньше, чем input ( 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;}

Expanded:

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

На каждой итерации forцикла, он добавит 2 к и проверить , если к 2 меньше $i, если добавить к 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. Дегольфед, ';' представляет разрыв строки в 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;}

На основе решения C # @Thomas .

Объяснение:

Попробуйте онлайн.

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.