n番目の相互代替和を見つける


17

単一の正の整数の入力が与えられた場合、その整数に対応する「相互代替和」を出力します。

入力の例を見てくださいn=5。交互の合計を見つけるには、まず、幅と高さの正方形のグリッドを作成し、n左から右、上から下に向かって読み取り、1各位置で開始し、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:これは交互の合計ではありません。最初の2つの用語を追加しています。
デニス

回答:


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 + ... +(1 + 2K)= 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

上と下からの対応する行の対角要素(1and 5、and、および21and 257and 917and 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)の2の補数整数の(表すビット単位NOT)、奇数の場合の式のように書き換えることができる〜N 2 ÷2

また、元の合計の最初の項(1)が減算ではなく加算されるため、上記の式では2の誤差が残るため、修正する必要があります。

従って、N 番目のクロス代替和であるN 2 ÷2 + 2の場合、Nでもあり、〜N 2 ÷2 + 2が奇数である場合。

最後に、ビット単位のNOTはインボリューションです。つまり、すべての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の場合、ビット単位でNOTを1回だけ行う必要があります。実際、JSでは、やるのがもっと短いかもしれないと思います(n%2?3-n*n:4+n*n)/2
リトシアスト



3

Minkolang 0.1526の 15 13バイト

Dennisの非常識なアルゴリズムを使用し、彼のおかげでさらに2バイトのゴルフをしました。その男はバイトカウントを半分にする責任があります!

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

ここで試してみてください!

説明

@VoteToClose n^ 2、ビット単位のNOT n時間を適用し、4を加算して半分にします。– トーマス・クワ 7分前

それが機能する理由の説明については、デニスの回答を参照してください。この答えに対するコメントで、彼:は整数除算のために機能する別の改善を提案したので、スタックのトップを否定し、+ 1が2の補数を行うことを心配することはありません。さらに、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 answerのアルゴリズムを使用しています。オンラインでお試しください!

使い方

~            # 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の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が得られます。次に、n 2とビット単位のXORをとります。nが偶数の場合、0とのXORは単なる数値であるため、これはちょうどn 2です。nが奇数の場合、-1とのXORはビットごとの否定と同じです。そのため、この時点でn 2またはNOTのビット単位のN 2を。これを整数で2で除算し、2を加算して結果を取得します。

以前のバージョンではSp3000のおかげで1バイト節約でき、このバージョンではデニスのおかげで9バイト節約できました!



1

Python 2、24バイト

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

これはからのアルゴリズムを使用します 私のゼリーの答えが、少し変更します。

代わりに適用する~ のn倍を、私たちは、適用- のn(を乗じ回(-1)のn)。〜x = -x-1およびPythonの整数除算の下限、したがって〜x / 2 =(-x-1)/ 2 = -x / 2であるため、これは同等です。


1

Pyth、11バイト

+2/u_GQ*QQ2

Pyth Compilerでオンラインで試す

使い方

これは私のゼリーの答えからアルゴリズムを使用しますが、少し変更します。

代わりに適用する~ の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

dc、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+p2バイト節約します。
デニス

1

GS2、9バイト

V,@!α2+''

これは、私のJelly answerのアルゴリズムを使用しています。オンラインでお試しください!

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でテストします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.