Учитывая неотрицательное число n
, выведите количество способов выразить n
как сумму двух квадратов целых чисел n == a^2 + b^2
( OEIS A004018 ). Обратите внимание, что a
и b
может быть положительным, отрицательным или нулевым, и их порядок имеет значение. Побеждает несколько байтов.
Например, n=25
дает, 12
потому что 25
может быть выражен как
(5)^2 + (0)^2
(4)^2 + (3)^2
(3)^2 + (4)^2
(0)^2 + (5)^2
(-3)^2 + (4)^2
(-4)^2 + (3)^2
(-5)^2 + (0)^2
(-4)^2 + (-3)^2
(-3)^2 + (-4)^2
(0)^2 + (-5)^2
(3)^2 + (-4)^2
(4)^2 + (-3)^2
Вот значения до n=25
. Будьте осторожны, чтобы ваш код работал n=0
.
0 1
1 4
2 4
3 0
4 4
5 8
6 0
7 0
8 4
9 4
10 8
11 0
12 0
13 8
14 0
15 0
16 4
17 8
18 4
19 0
20 8
21 0
22 0
23 0
24 0
25 12
Вот значения до n=100
списка.
[1, 4, 4, 0, 4, 8, 0, 0, 4, 4, 8, 0, 0, 8, 0, 0, 4, 8, 4, 0, 8, 0, 0, 0, 0, 12, 8, 0, 0, 8, 0, 0, 4, 0, 8, 0, 4, 8, 0, 0, 8, 8, 0, 0, 0, 8, 0, 0, 0, 4, 12, 0, 8, 8, 0, 0, 0, 0, 8, 0, 0, 8, 0, 0, 4, 16, 0, 0, 8, 0, 0, 0, 4, 8, 8, 0, 0, 0, 0, 0, 8, 4, 8, 0, 0, 16, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 8, 4, 0, 12]
Забавные факты. Последовательность содержит произвольно высокие слагаемые, а предел ее скользящего среднего равен π.
Leaderboard:
var QUESTION_ID=64812,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/64812/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
1,0,2,0,0,3,0,0,0,4,0,0,0,0,5,...
. Обрезая последовательность после любого ненулевого числа, среднее значение пока равно 1. И прогоны 0 оказывают все меньшее и меньшее влияние на последующую последовательность.Ответы:
Python (
59 5756 байт)Онлайн демо
Как и в моем ответе CJam, он использует инверсию Мёбиуса и работает в псевдоквазилинейном времени.
Спасибо Sp3000 за 2 байта экономии и feersum за 1.
источник
-1**x
всегда-1
. Я ожидал, что-1
это будет один целочисленный буквенный токен, а не унарный минус с низким приоритетом, за которым следует один.**x
.Mathematica, 13 байт
Если встроенные модули разрешены, это как сделать это в Mathematica.
Для 0 <= n <= 100
источник
Python 2, 44 байта
Это почти то же самое, что и решение xsot (которое основано на решении Питера Тейлора ), но экономит 8 байтов, упрощая способ обработки знаков.
Обратите внимание, что для полной программы мы можем сохранить 2 байта в функции без дополнительных затрат:
Два дополнительных байта для полной программы таким образом:
Для
n > 0
существует очень разборчивое 40-байтовое решение:источник
Pyth, 13 байт
Тестирование
источник
Q
.J, 16 байт
Это монадический глагол (другими словами, унарная функция). Попробуйте онлайн или посмотрите, пройдете ли вы все тесты .
объяснение
источник
Python 2,
69555352 байтаЭто рекурсивная функция, основанная на превосходном решении Питера Тейлора .
источник
f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2
. Кроме того, я полагаю, нам не важно превышать максимальную глубину рекурсии по умолчанию?/4<<2
делает его короче, чем у меня.Юлия, 40 байт
Ungolfed:
Обратите внимание, что цикл не включает в себя
i==0
, потому что когдаn
это квадрат, он уже включенi=sqrt(n)
, и есть только четыре, а не восемь, для этой формы (0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2
).источник
CJam,
2523 байтаЭто теоретическое решение, требующее O (9 н. ) и памяти для ввода n .
За счет одного дополнительного байта - всего 24 байта - мы можем уменьшить сложность до O (n 2 ) :
Попробуйте онлайн!
Как это работает
Или
или
затем
источник
CJam (
25 24 2221 байт)Онлайн демо
Это выполняется в псевдоквазилинейном времени * и использует утверждение OEIS, что
Вход
0
, очевидно, являются особым случаем (преобразования Мёбиуса и аннигиляторы не сочетаются друг с другом), но в итоге стоили всего один символ.* Псевдо - потому что оно квазилинейно по значению ввода, а не по размеру ввода; квази, потому что он выполняет
Theta(n)
операции над целыми числами порядкаn
;b
операцию -битового мода следует приниматьb lg b
время, так что в целом это занимаетTheta(n lg n lg lg n)
время.источник
Japt ,
423733 байтаJapt - это сокращенная версия Ja vaScri pt . переводчик
Как это работает
Возможно, есть лучшая техника; предложения приветствуются.
источник
Python 3,
686160 байтИспользование двух вложенных списков слишком дорого. Вместо этого он проверяет, являются ли обе координаты на окружности радиуса sqrt (n) целыми числами.
Питер Тейлор победил это с помощью подхода, основанного на инверсии Мебиуса .
источник
n=0
элегантно.Октава, 28 байт
источник
Haskell, 42 байта
Пример использования:
источник
q
в охране умная, я запомню этот трюк.Юлия,
897963 байтаЭто именованная функция,
a
которая принимает целое число и возвращает число с плавающей точкой. Вызывает вспомогательную функциюg
.Ungolfed:
Подход здесь использует упрощенную формулу Уэсли Ивана Херта, указанную в OEIS. Упрощение было найдено Гленом О, тем же человеком, который отбросил 26 байтов этого ответа!
источник
x^.5
а неsqrt(x)
сохранять 3 байта. И(n==0)
сохраняет 2 байта1÷(n+1)
. И вы можете сохранить еще 4 символа, используяcos(π*sqrt(x))^2÷1
вместоfloor(cos(π*sqrt(x))^2)
. Кроме того, используйте1:n/2
вместо1:n÷2
, потому что использование поплавка не повредит,g(x)
и вi
любом случае оно будет заблокировано целыми числами . Иsum(i->g(i)g(n-i),1:n/2)
побреет еще несколько персонажей тоже.sum
Трюк не выполняется дляn=0
, поэтому я держал массив понимания.i=0
делу случиться в сумме, вы можете включить знак4g(n)
. Итак(n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2)
, что не встретится с ошибкой. Но вы можете сделать еще лучше, отметив симметрии -(n==0)+4sum([g(i)g(n-i)for i=1:n])
Pyth,
1615 байтПопробуйте онлайн в компиляторе Pyth .
Как это работает
источник
TI-BASIC, 23 байта
Довольно просто.
Σ(
это суммирование.Странно,
sum(seq(sum(seq(
бросаетERR:ILLEGAL NEST
, и так делаетΣ(Σ(
, ноsum(seq(Σ(
это хорошо. Я решил положитьΣ(
внутрь, чтобы спасти близкого человека.источник
sum
аΣ
?X²+Y²=Ans
значения from из X между-Ans
иAns
. sum (является суммой списка , поэтому нам нужно сначала создать список, используя seq (..., Y, -Ans, AnsJavaScript (ES6),
6660 байт6 байтов сохранено благодаря @ edc65 !
объяснение
Тест
источник
n=>eval('for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n')
eval
чтобы поместитьfor
циклы в функцию стрелки без скобок. Я тоже забыл про~
оператора хаха.Python 3,
936269 байтItertools не работал, поэтому я снова использовал два диапазона, но переместил диапазон, чтобы сохранить байты.
Изменить: предыдущий код на самом деле не работал, так как я определил диапазон по n, прежде чем я определил n.
источник
APL,
232019 байтОбъяснение:
Помимо того факта, что в APL нет функции J
i:
(числа от -n до n), это работает во многом как ответ J.Мы не можем использовать поезд, потому что получение,
-\⍳2×⍵
чтобы не анализировать(-\) ⍳ (2×⍵)
, стоило бы три байта; аналогично с другой парой топов. Все эти скобки делают обычную функцию короче.Попробуй это здесь . Вывод
1
означает, что все значения совпадают.источник
Matlab 41 байт
Еще меньше, чем предыдущие ответы
По сути, ответ Agawa001 с заменой мощности и площади
источник
Candy ,
1714 байтовПервоначально вход помещен в стек
~TbAT1C(sWs+Aeh)Z
~T0C(sWs+Aeh)Z
источник
CJam, 28
Не очень короткий, но эффективный. Например, результат для 15625 мгновенно равен 28. Использует формулу на основе факторизации из OEIS.
Попробуйте онлайн
Объяснение:
Некоторые подробности о расчете:
(exponent + 1) & -1
, чтоexponent + 1
(exponent + 1) & 1
, который равен 0, если показатель степени нечетный, и 1, если четныйВсе эти значения, умноженные вместе и умноженные на 4, являются в точности формулой OEIS.
источник
Python 2, 68 байт
Определяет вызываемую функцию,
x()
которая принимает число n.Попробуйте онлайн. http://ideone.com/aRoxGF
источник
print
илиreturn
заявление.n=0
иn=1
(0 и 2 вместо 1 и 4). Может быть, ограничения диапазона требуют корректировки?n+1
.Pyth,
4135333027 байтПопробуйте онлайн.
Редактировать: Благодаря isaacg , я получил
m
и*F
на работу! ДА!Редактировать: положить побитовый и обратно для большей экономии байтов! Также я удалил все "Бывшие" вещи. Это начало становиться загроможденным.
Благодаря aditsu и его решению CJam, и maltysen и его советам (Однажды я доберусь
m*Fd
до работы. Однажды ...)Обратите внимание, что,
если простое число 1 мод 4, мы получаем
-1 & (exponent + 1)
, чтоexponent + 1
но если простое число 3 mod 4, мы получаем
1 & (exponent + 1)
, что0
если показатель степени нечетен, и1
если четныйУмножим все это вместе (4 раза в начале), и мы получим количество сумм двух квадратов, которые складываются с нашим вводом.
источник
Python, 57 байт
Хороший вызов. К сожалению, я не получаю это короче, чем это в данный момент.
источник
PARI / GP,
3428 байтИспользование генерирующих функций:
Сохранено 6 байтов благодаря Митчу Шварцу .
Используя встроенные модули, 33 байта (сэкономил 1 байт благодаря Митчу Шварцу .):
источник
matid(2)
сохраняет байт.n->sum(i=-n,n,x^i^2)^2\x^n%x
Matlab, 72 байта
источник
disp
в этом вызове, Луис! =)Matlab,
6350 байтЭто превосходит другой код с таким же названием, поэтому я поставил его: D.
Программа находит положительные целочисленные решения, затем умножают на 4, чтобы охватить отрицательные.
Он может выполнить все 25 первых тестов
источник
disp
в этом вызове ! =)format compact
=)JavaScript, 89 байт
Я знаю, что это не самый короткий ответ JavaScript, даже если бы мне пришлось удалить строки ввода / вывода, но я действительно думаю, что это самый эффективный ответ JS, дающий мне результат за миллион в течение нескольких секунд (десять миллионов заняли около минуты).
источник
PHP, 70 байт, не конкурирует
алгоритм, украденный из одного из ответов Python ... я забыл, какой из них; хотел хотя бы частично понять, что происходит, прежде чем я отправил.
источник
for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;
экономит 5 байт.$x-~$x
равно,2*$x+1
и теперь вы можете начать без назначения переменной.