Знайдіть 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=1до 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
ETHproductions

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+

Для цього використовується алгоритм з моєї відповіді Jelly . Спробуйте в Інтернеті!

Як це працює

~            # 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 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 не входить 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+''

Для цього використовується алгоритм з моєї відповіді Jelly . Спробуйте в Інтернеті!

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^]

Для цього використовується той же алгоритм, що і моя відповідь на Jelly. Перевірте це з J.js .


0

Луа, 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

Діалог APL, 13 байт

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

Для цього використовується той же алгоритм, що і моя відповідь на Jelly. Перевірте його на TryAPL .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.