Учитывая ввод единственного положительного целого числа, выведите «перекрестную альтернативную сумму», которая соответствует этому целому числу.
Возьмите пример ввода n=5
. Чтобы найти перекрестную альтернативную сумму, сначала создайте квадратную сетку ширины и высоты, n
которая, читая слева направо и сверху вниз, начинается 1
с каждой позиции и увеличивается на одну позицию:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Затем возьмите суммы из сетки, которые образуют «крест» (то есть обе диагонали вместе взятые):
1 5
7 9
13
17 19
21 25
1 5 7 9 13 17 19 21 25
Наконец, возьмите переменную сумму этой последовательности:
1+5-7+9-13+17-19+21-25
-11
Другой пример для n=6
(просто чтобы показать, как выглядит крест с четными номерами n
):
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33 34 35 36
1 6
8 11
15 16
21 22
26 29
31 36
1+6-8+11-15+16-21+22-26+29-31+36
20
Поскольку это код-гольф , победит самый короткий код в байтах.
Вот правильные выходные данные для n=1
to n=100
, которые вы можете использовать в качестве тестовых случаев:
1
4
-3
10
-11
20
-23
34
-39
52
-59
74
-83
100
-111
130
-143
164
-179
202
-219
244
-263
290
-311
340
-363
394
-419
452
-479
514
-543
580
-611
650
-683
724
-759
802
-839
884
-923
970
-1011
1060
-1103
1154
-1199
1252
-1299
1354
-1403
1460
-1511
1570
-1623
1684
-1739
1802
-1859
1924
-1983
2050
-2111
2180
-2243
2314
-2379
2452
-2519
2594
-2663
2740
-2811
2890
-2963
3044
-3119
3202
-3279
3364
-3443
3530
-3611
3700
-3783
3874
-3959
4052
-4139
4234
-4323
4420
-4511
4610
-4703
4804
-4899
5002
Ответы:
Желе,
211911107 байтПопробуйте онлайн!
идея
Предположим на секунду, что первый член окончательной суммы вычтен, а не добавлен.
Пусть n будет положительным целым числом.
Даже случай
Различия между диагональными элементами в нижней половине строк представляют собой первые n ÷ 2 нечетных натуральных чисел. Поскольку 1 + 3 + 5 +… + (2k + 1) = k 2 , они составляют (n ÷ 2) 2 = n 2 ÷ 4 .
В этом примере
Таким образом, сумма составляет 2 × n 2 ÷ 4 = n 2 ÷ 2 .
Нечетный случай
Различия между диагональными элементами в соответствующих строках сверху и снизу (
1
и5
, и21
и25
;7
и9
, и17
и19
) одинаковы, поэтому они будут взаимно аннулироваться.В этом примере
Все, что осталось, - это отрицание центрального элемента, которое является средним арифметическим первого и последнего числа, поэтому его можно рассчитать как - (n 2 + 1) ÷ 2 .
Общий случай
Поскольку ~ x = - (x + 1) для двух целых чисел дополнения ( ~ обозначает поразрядно НЕ), формулу для нечетного случая можно переписать как ~ n 2 ÷ 2 .
Кроме того, поскольку первое слагаемое ( 1 ) исходной суммы добавляется вместо вычитания, вышеприведенные формулы оставляют ошибку 2 , которую необходимо исправить.
Следовательно, n- ая перекрестная альтернативная сумма равна n 2 ÷ 2 + 2, если n четное, и ~ n 2 ÷ 2 + 2, если она нечетная.
Наконец, побитовое НЕ - это инволюция, т. Е. ~~ x = x для всех x . Таким образом, ~~~ x = ~ x , ~~~~ x = x , и, как правило, ~ n x (что означает, что ~ применяется n раз) равно x, если n четное, и ~ x, если оно нечетное.
Таким образом, мы можем переписать нашу общую формулу как ~ n n 2 ÷ 2 + 2 для всех натуральных чисел n .
Код
источник
JavaScript,
403822 байтаИспользование этого новомодного, причудливого решения в закрытой форме - это все в моде!
Благодаря ThomasKwa я могу избавиться от своей дорогостоящей рекурсивной функции.
источник
(n%2?3-n*n:4+n*n)/2
Желе, 12 байт
Попробуй это здесь .
источник
CJam, 13
15байтДва байта прочь благодаря Деннису.
Попробуйте онлайн!
источник
2%{~}&
с{~}*
экономит два байта.Минколанг 0,15 ,
261513 байтИспользуя безумный алгоритм Денниса, и благодаря ему забил еще два байта. Этот парень отвечает за половину количества байтов!
Попробуй это здесь!
объяснение
См. Ответ Денниса для объяснения того, почему это работает. В комментарии к этому ответу он предложил еще одно улучшение, которое работает, потому что
:
это целочисленное деление, поэтому я могу свести на нет вершину стека и не беспокоиться о +1 при выполнении двоичного дополнения. Кроме того, n и n ^ 2 имеют одинаковую четность, что устраняет необходимость в обмене.источник
GolfScript, 12 байт
Это использует алгоритм из моего ответа желе . Попробуйте онлайн!
Как это устроено
источник
ES7, 17 байт
Простой порт ответа @ Dennis's Python 2.
Во время написания этого ответа мне удалось увеличить свой порт ES6 до 17 байт!
источник
MATL , 13
27байтИспользуя удивительные формулы Денниса:
Попробуйте онлайн!
Прямой подход ( 27 байт ):
источник
Чистый Баш, 28
Теперь, когда @Dennis показал нам всем, как это сделать, это нужно обновить:
Предыдущий ответ:
Утилиты Bash + GNU, 77
Вот начало:
N передается как параметр командной строки.
paste
здесь действительно удобно производить переменную сумму.-d
Опция позволяет список символов разделителей, которые используются циклически.источник
$[-1**$1*$1*$1+4>>1]
еще короче.Юлия,
4140251916 байтЭто анонимная функция, которая принимает целое число и возвращает целое число. Чтобы вызвать его, назначьте его переменной.
Подход, разработанный Деннисом, заключается в следующем. Сначала мы получаем четность n , т.е. n (mod 2), и отрицаем ее. Это дает нам 0 для четных входных данных и -1 для нечетных. Затем мы поразрядно XOR с n 2 . Когда n чётно, это просто n 2, потому что XOR с 0 это просто число. Когда n нечетно, XOR с -1 - то же самое, что и побитовое отрицание. Таким образом, на данный момент у нас либо n 2, либо побитовое НЕ с n 2 . Мы целое делим это на 2 и добавляем 2, чтобы получить результат.
Сэкономил байт благодаря Sp3000 в предыдущей версии, и сохранил 9 благодаря Деннису на этом!
источник
Джольф, 13 байт
Попробуй это здесь!
источник
Python 2, 24 байта
Это использует алгоритм из моего ответа Jelly , с незначительной модификацией:
Вместо применения
~
n раз мы применяем-
n раз (умножая на (-1) n ). Это эквивалентно, потому что ~ x = -x - 1 и этажи целочисленного деления в Python, поэтому ~ x / 2 = (-x - 1) / 2 = -x / 2 .источник
Pyth, 11 байт
Попробуйте онлайн в компиляторе Pyth .
Как это устроено
Это использует алгоритм из моего ответа Jelly , с незначительной модификацией:
Вместо применения
~
n раз мы применяем-
n раз (умножая на (-1) n ). Это эквивалентно, потому что ~ x = -x - 1 и этажи целочисленного деления в Pyth, поэтому ~ x / 2 = (-x - 1) / 2 = -x / 2 .источник
дк, 17
Используя ту же самую проверенную и проверенную формулу от Денниса:
Попробуйте онлайнО, почему в песочнице Ideone bash нетdc
?Тест командной строки:
источник
?2^1+2~2*1-*2+p
сохраняет два байта.GS2, 9 байт
Это использует алгоритм из моего ответа желе . Попробуйте онлайн!
одинаково короткий, но особенно не содержит не-ASCII символов.
Как это устроено
источник
J, 16 байт
Это использует тот же алгоритм, что и мой ответ желе. Проверьте это с J.js .
источник
Lua, 33 байта ( попробуйте онлайн )
Как это устроено:
источник
Dyalog APL, 13 байт
Это использует тот же алгоритм, что и мой ответ желе. Проверьте это на TryAPL .
источник