Найти n-ную перекрестную альтернативную сумму


17

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

Возьмите пример ввода 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=1to 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

8
Nit pick: это не чередующаяся сумма. Вы добавляете первые два условия.
Деннис

Ответы:


26

Желе, 21 19 11 10 7 байт

²~³¡H+2

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

идея

Предположим на секунду, что первый член окончательной суммы вычтен, а не добавлен.

Пусть n будет положительным целым числом.

Даже случай

 1              6
    8       11
      15 16
      21 22
   26       29
31             36

Различия между диагональными элементами в нижней половине строк представляют собой первые n ÷ 2 нечетных натуральных чисел. Поскольку 1 + 3 + 5 +… + (2k + 1) = k 2 , они составляют (n ÷ 2) 2 = n 2 ÷ 4 .

В этом примере

- 1 + 6 - 8 + 11 - 15 + 16 - 21 + 22 - 26 + 29 - 31 + 36  =
-(1 - 6)-(8 - 11)-(15 - 16)-(21 - 22)-(26 - 29)-(31 - 36) =
(    5   +   3    +    1  )+(   1    +    3    +    5   ) =
             9             +              9               = 18

Таким образом, сумма составляет 2 × n 2 ÷ 4 = n 2 ÷ 2 .

Нечетный случай

 1           5
    7     9
      13
   17    19
21          25

Различия между диагональными элементами в соответствующих строках сверху и снизу ( 1и 5, и 21и 25; 7и 9, и 17и 19) одинаковы, поэтому они будут взаимно аннулироваться.

В этом примере

- 1 + 5 - 7 + 9 - 13 + 17 - 19 + 21 - 25  =
-(1 - 5)-(7 - 9)- 13 +(17 - 19)+(21 - 25) =
    4   +   2   - 13 -    2    -    4     = -13

Все, что осталось, - это отрицание центрального элемента, которое является средним арифметическим первого и последнего числа, поэтому его можно рассчитать как - (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 .

Код

²~³¡H+2    Main link. Input: n

²          Yield n².
 ~         Apply bitwise NOT to n²...
  ³¡           n times.
    H      Halve the result.
     +2    Add 2.

1
Я знал, что есть какая-то простая формула, но ваше объяснение и исполнение просто потрясающе. +1
ETHпродукция

5

JavaScript, 40 38 22 байта

Использование этого новомодного, причудливого решения в закрытой форме - это все в моде!

n=>(n%2?3-n*n:4+n*n)/2

Благодаря ThomasKwa я могу избавиться от своей дорогостоящей рекурсивной функции.


Вам просто нужно поразрядно НЕ один раз, если n% 2. На самом деле, я думаю, что в JS это может быть короче(n%2?3-n*n:4+n*n)/2
lirtosiast



3

Минколанг 0,15 , 26 15 13 байт

Используя безумный алгоритм Денниса, и благодаря ему забил еще два байта. Этот парень отвечает за половину количества байтов!

n2;d[~]4+2:N.

Попробуй это здесь!

объяснение

@VoteToClose n^ 2, применять побитовое НЕ, nраз, добавить четыре, разделить пополам . - Томас Ква 7 минут назад

См. Ответ Денниса для объяснения того, почему это работает. В комментарии к этому ответу он предложил еще одно улучшение, которое работает, потому что :это целочисленное деление, поэтому я могу свести на нет вершину стека и не беспокоиться о +1 при выполнении двоичного дополнения. Кроме того, n и n ^ 2 имеют одинаковую четность, что устраняет необходимость в обмене.

n                Take number from input - n
 2;              n**2
   d             Duplicates top of stack
    [~]          For loop that negates the top of stack n times
       4+        Add 4
         2:      Divide by 2
           N.    Output as number and stop.

2

GolfScript, 12 байт

~2?.{~}*2/2+

Это использует алгоритм из моего ответа желе . Попробуйте онлайн!

Как это устроено

~            # Evaluate the input.
 2?          # Square it.
   .         # Push a copy of the square.
    {~}      # Push a code block that applies bitwise NOT.
       *     # Execute it n² times. Since n² and n have the same parity,
             # this is equivalent to executing in only n times.
        2/   # Halve the result.
          2+ # Add 2.

2

ES7, 17 байт

n=>-1**n*n*n+4>>1

Простой порт ответа @ Dennis's Python 2.

Во время написания этого ответа мне удалось увеличить свой порт ES6 до 17 байт!

n=>(n*n^-n%2)/2+2


2

Чистый Баш, 28

Теперь, когда @Dennis показал нам всем, как это сделать, это нужно обновить:

echo $[-1**$1*($1*$1+1)/2+2]

Предыдущий ответ:

Утилиты Bash + GNU, 77

Вот начало:

a=$1
(seq 1 $[a+1] $[a*a]
seq $1 $[a>1?a-1:1] $[a*a])|sort -un|paste -sd+-|bc

N передается как параметр командной строки.

pasteздесь действительно удобно производить переменную сумму. -dОпция позволяет список символов разделителей, которые используются циклически.


$[-1**$1*$1*$1+4>>1]еще короче.
Нил

2

Юлия, 41 40 25 19 16 байт

n->-n%2$n^2÷2+2

Это анонимная функция, которая принимает целое число и возвращает целое число. Чтобы вызвать его, назначьте его переменной.

Подход, разработанный Деннисом, заключается в следующем. Сначала мы получаем четность 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 благодаря Деннису на этом!



1

Python 2, 24 байта

lambda n:(-1)**n*n*n/2+2

Это использует алгоритм из моего ответа Jelly , с незначительной модификацией:

Вместо применения ~ n раз мы применяем - n раз (умножая на (-1) n ). Это эквивалентно, потому что ~ x = -x - 1 и этажи целочисленного деления в Python, поэтому ~ x / 2 = (-x - 1) / 2 = -x / 2 .


1

Pyth, 11 байт

+2/u_GQ*QQ2

Попробуйте онлайн в компиляторе Pyth .

Как это устроено

Это использует алгоритм из моего ответа Jelly , с незначительной модификацией:

Вместо применения ~ n раз мы применяем - n раз (умножая на (-1) n ). Это эквивалентно, потому что ~ x = -x - 1 и этажи целочисленного деления в Pyth, поэтому ~ x / 2 = (-x - 1) / 2 = -x / 2 .

+2/u_GQ*QQ2  Evaluated input: Q

       *QQ   Yield Q².
   u  Q      Set G = Q². For each non-negative integer below Q:
    _G         Set G = -G.
             Return G.
  /       2  Halve the result.
+2           Add 2.

1

дк, 17

Используя ту же самую проверенную и проверенную формулу от Денниса:

?dd*1+r_1r^*2/2+p

Попробуйте онлайн О, почему в песочнице Ideone bash нет dc?

Тест командной строки:

for i in {1..100}; do echo $i | dc -e '?dd*1+r_1r^*2/2+p'; done 

?2^1+2~2*1-*2+pсохраняет два байта.
Деннис

1

GS2, 9 байт

V,@!α2+''

Это использует алгоритм из моего ответа желе . Попробуйте онлайн!

V,@e 7+''

одинаково короткий, но особенно не содержит не-ASCII символов.

Как это устроено

V          Parse the input as an integer n.
 ,         Compute n².
  @        Push a copy of n².
   !       Bitwise NOT.
    α      Make a block of the previous instruction.
     2     Execute the block n² times. Since n² and n have the same parity,
           this is equivalent to executing in only n times.
      +    Halve the result.
       ''  Increment twice.

1

J, 16 байт

[:<.2%~4+*:*_1^]

Это использует тот же алгоритм, что и мой ответ желе. Проверьте это с J.js .


0

Lua, 33 байта ( попробуйте онлайн )

i=(...)print((-1)^i*i*i/2-.5*i%2)

Как это устроено:

i=(...)print((-1)^i*i*i/2-.5*i%2)
i=(...)                           Take input and store to i
       print(
             (-1)^i               Raise (-1) to the i-th power: -1 if odd, 1 if even
                   *i*i/2         Multiply by i squared and halved.
                         -.5*i%2  i%2 is the remainder when i is divided by 2
                                  if i is odd, then i%2 will be 1, and this expression
                                  will evaluate to -0.5
                                  but if i is even, then i%2 will be 0, which makes
                                  this expression evaluate to 0
                                )

0

Dyalog APL, 13 байт

⌊2+.5××⍨ׯ1*⊢

Это использует тот же алгоритм, что и мой ответ желе. Проверьте это на TryAPL .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.