Разница сумм - PullRequest
       22

Разница сумм

2 голосов
/ 21 октября 2010

Я не принимаю кредит на этот вызов вообще.Это Задача проекта Эйлера 6 :

Сумма квадратов первых десяти натуральных чисел равна 1 2 + 2 2 + ... + 10 2 = 385

Квадрат суммы первых десяти натуральных чисел равен (1 + 2 + ... + 10) 2 = 55 2 = 3025

Следовательно, разница между суммой квадратов первых десяти натуральных чисел и квадратом суммы составляет 3025 - 385 = 2640.

Найдите разницу между суммой квадратов первых ста натуральных чисел и квадратом суммы.

Я заинтересовался некоторыми играми в коде, когда заметил свое решение (в Python) было очень и очень коротким.Я хочу посмотреть, как некоторые другие языки (perl, я смотрю на вас!) Могут привести к этой простой проблеме.

Итак, каков кратчайший путь решения этой проблемы?Кратчайший означает наименьшее количество символов в исходном коде.

ПРИМЕЧАНИЕ: бонусные баллы за решение для первых n натуральных чисел.

Ответы [ 20 ]

14 голосов
/ 21 октября 2010

Почти любой язык: 20 символов.

(n*n-1)*(3*n+2)*n/12
8 голосов
/ 21 октября 2010

40 / 49 43 символа;должен работать на большинстве языков

n=100;(n*(n+1)/2)**2-n*(n+1)*(2*n+1)/6;

Должен работать на некоторых языках;

n=100;n*(n+1)*n*(n+1)/4-n*(n+1)*(2*n+1)/6;

Это должно работать на большинстве языков.

Обратите внимание, что 1^2 + 2^2 + ... + n^2 = n(n+1)(2n+1)/6 и1 + 2 + ... + n = n(n+1)/2

РЕДАКТИРОВАТЬ : о, и для бонуса вы просто удалите первые 6 символов.

5 голосов
/ 21 октября 2010

Поскольку @Gabi Purcaru уже опубликовало «интеллектуальное» решение (которое основано на двух простых математических доказательствах), и краткие решения для такой задачи просты, вместо этого я опубликую решение long на основев шаблонном метапрограммировании я не думаю, что это так просто сделать дольше без добавления ненужного мусора / пробелов /....

C ++ - 648 659 символов

#include <iostream>

template<int Num>
struct Square
{
    static const int Value = Num*Num;
};

template<int Num>
struct NatSum
{
    static const int Value=Num+NatSum<Num-1>::Value;
};

template<>
struct NatSum<0>
{
    static const int Value = 0;
};

template<int Num>
struct SquaresSum
{
    static const int Value=Square<Num>::Value+SquaresSum<Num-1>::Value;
};

template<>
struct SquaresSum<0>
{
    static const int Value = 0;
};

template<int Num>
struct DifferenceOfSums
{
    static const int Value = Square<NatSum<Num>::Value>::Value - SquaresSum<Num>::Value;
};

int main()
{
    std::cout<<DifferenceOfSums<100>::Value<<std::endl;
    return 0;
}

Теперь наслаждайтесь результатом вашего задания, рассчитанным во время компиляции и помещенным непосредственно в исполняемый файл.:)

4 голосов
/ 21 октября 2010

Октава: 28 символов

v=1:100;sum(v)**2-sum(v.*v)
4 голосов
/ 21 октября 2010

Perl 15 символов:

 print 25164150;
3 голосов
/ 22 октября 2010

Mathematica «Угадай ответ»

Mathematica может «угадать» функцию, которая генерирует некоторые последовательности.

Итак, если вы вычислите первые шесть слагаемых для этой задачи, результат будет следующим:

 {0, 4, 22, 70, 170, 350}  

Теперь мы можем ввести эту последовательность в «последовательность оракулов» и получить функцию:

FindSequenceFunction[{0, 4, 22, 70, 170, 350}]

Mathematica отвечает:

1/12 (#-1) (2 # + 5 #^2 + 3 #^3) &  

- это формула, размещенная где-то в других ответах.

Таким образом, мы можем вычислить сотый член, используя первые шесть членов... не зная, как их генерировать!

In> FindSequenceFunction[{0, 4, 22, 70, 170, 350}][100]
Out> 25164150    
2 голосов
/ 21 октября 2010

J, 19 символов

(12%~]*<:@*:*2+3*])

Это просто вычисляет n (n ^ 2-1) (3n + 2) /12.

J, 21символы

(([:*:+/)-[:+/*:)i.>:

Фактически генерируется список натуральных чисел до N (i.>:), затем вычисляется сумма квадратов [:*:+/ и квадрата сумм [:+/*:,затем вычитает их.

2 голосов
/ 21 октября 2010

Mathematica 17 символов: После применения FullSimplify

n(n^2-1)(3n+2)/12

Mathematica 27 символов: Поскольку для этого не нужны эти надоедливые символы умножения ...

(n(n+1))^2/4-n(n+1)(2n+1)/6

Или в векторной форме, Mathematica 28 25 символов: после рассмотрения другого Ответ Mathematica , мне удалось сбрить еще 3 символа

Plus@@#^2-#.#&@Range[100]
2 голосов
/ 21 октября 2010

17 или 18 символов

(3n/2+1)(n^3-n)/6
(3n/2+1)(n**3-n)/6

в зависимости от того, как ваш язык экспонент

Редактировать: ну, 20 символов (3*n/2+1)*(n**3-n)/6, если ваш язык не понимает неявного умножения ... но Mathematica знает.

1 голос
/ 21 октября 2010

Golfscript - 17 символов

~:).*(3)*2+*)*12/

Считывает число из stdin \

23 символа для генерации первых 100

100,{:).*(3)*2+*)*12/}%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...