隣人の合計


22

これは非常に簡単な課題です。

数値の配列の場合、すべての要素についてすべての隣接要素がそれ自体に追加される配列を生成し、その配列の合計を返します。

入力配列で発生する変換は次のとおりです [1,2,3,4,5]

[1,2,3,4,5] => [1+2, 2+1+3, 3+2+4, 4+3+5, 5+4] => [3,6,9,12,9] => 39
 0          => neighbours of item 0, including item 0
[1,2]       => 1 + 2      => 3
   1
[1,2,3]     => 1 + 2 + 3  => 6
     2
  [2,3,4]   => 2 + 3 + 4  => 9
       3
    [3,4,5] => 3 + 4 + 5  => 12
         4
      [4,5] => 4 + 5      => 9

               3+6+9+12+9 => 39

テストケース

[]            => 0 (or falsy)
[1]           => 1
[1,4]         => 10 (1+4 + 4+1)
[1,4,7]       => 28
[1,4,7,10]    => 55
[-1,-2,-3]    => -14
[0.1,0.2,0.3] => 1.4
[1,-20,300,-4000,50000,-600000,7000000] => 12338842

リーダーボード



浮動小数点数または整数のみをサポートする必要がありますか?
corvus_192

@ corvus_192テストケースには非整数が含まれます。
ジオビット

@Geobits気づかなかったので、答えを編集します。
corvus_192

2
次に2次元配列でこれを行う必要があります。
ブラッドリーアフナー

回答:


8

MATL、5バイト

7BZ+s

オンラインでお試しください!

説明

7B  % Push array [1, 1, 1], obtained as 7 in binary
Z+  % Take input implicitly. Convolve with [1, 1, 1], keeping size
s   % Sum of resulting array. Display implicitly

3
7B取得するための非常に巧妙な使用[1 1 1]
Suever

私はMATLを知らないが、私は疑問に思う:リストのために[a,b,c,...]、どのように取得するa+bが、取得を避けるのaですか?
クリスチャンシーバーズ

1
@Christian追加は畳み込み演算によって行われます。参照する部分的な結果を生成しますが、入力と同じ数のエントリのみを含む出力配列を生成するため、それらを回避する畳み込みのバージョンがあります。これはSueverの答えでも使用されている
ルイスMendo

19

Python、25バイト

lambda a:sum((a*3)[1:-1])

これが機能する理由を確認するには、OPの展開を45度回転します。

             1 + 2                        
           + 1 + 2 + 3                            2 + 3 + 4 + 5
               + 2 + 3 + 4          =       + 1 + 2 + 3 + 4 + 5
                   + 3 + 4 + 5              + 1 + 2 + 3 + 4.
                       + 4 + 5


6

05AB1E11 5バイト

Adnanのおかげで6バイト節約できました。

€Ð¦¨O

オンラインでお試しください!

説明

€Ð     # triplicate each item in the list
  ¦¨   # remove first and last element
    O  # sum

動作します€Ð¦¨O:)?
アドナン

@アドナン:素晴らしい!私は3 *でそれを行う方法を考えようとしましたが、以前に€Ð使用したことがありますが、私も考えたことはありませんでした€D:P
Emigna

4

JavaScript(ES6)、40 33バイト

l=>eval(l.join`+`)*3-l[0]-l.pop()

NaN空のリストが与えられたときに返します。


あなたはそのように参加するには乗算を移動する場合は、2つの以上の文字を切り落とすことができますv=>eval(v.join`*3+`+"*2")-v[0]
Grax32

@Grax-いいね!ただし、空の配列の場合はもう偽物ではありません。
アーナルド

常に何かがありますか?
Grax32

@Grax-いいえ。最初のテストケースは空の配列です。
アーナウルド

4

R、75 70 52 34 33 31バイト

3を合計し、最初と最後の要素を減算します

sum(x<-scan())*3-x[1]-tail(x,1)

編集:@rturnbullのおかげで3バイト余分に保存されました


3

Scala、47バイト

def&(a:Float*)=(0+:a:+0)sliding 3 map(_.sum)sum

0を先頭に追加してから、サイズ3のスライディングウィンドウを使用して近傍を合計し、合計を計算します


3

Java 7、72バイト

float c(float[]a){float s=0,l=0;for(float i:a)s+=l=i;return 3*s-l-a[0];}

配列の最初と最後の要素を示す追加の入力を追加することは、挑戦の精神ではないと思います。
ジオビット

@Geobits私はそれを変更します
.....-Numberknot

クール。あなたは使用してより多くのそれはいくつかのゴルフできるfloatの代わりにdouble:)
Geobits

代わりに使用できますか?... Doubleにはfloatの2倍の精度があります。
ナンバーノット

1
どうしてint
sidgate

3

Mathematica、34 32 29バイト

LynnのきちんとしたPythonの答えからインスピレーションを得て...

Check[3Tr@#-Last@#-#[[1]],0]&

または

Check[3(+##)-#&@@#-Last@#,0]&

または

Check[##-#/3&@@#*3-Last@#,0]&

残念なことに、このアプローチは、空のリストの最初と最後の要素を破棄するための短くて安全な方法がないため、MathematicaではPythonほど便利ではありません。


2
教えてくれた+1Check
グレッグマーティン

2

MATLAB、31 28 26バイト

@Luisのおかげで3バイト節約

@(x)sum(conv(x,1:3>0,'s'))

これにより、次のansように呼び出すことができる匿名関数が作成されます。ans([1, 2, 3, 4, 5])

オンラインデモ(Octaveを使用)を提供するために、最後の入力としての'same'代わりに使用する's'必要がありましたconv

オンラインデモ

説明

すべて1のカーネル(配列を作成してからゼロと比較することで作成conv)で畳み込み()を実行し、MATLABで3番目の入力を指定するか、MATLABでこれを単に短縮することで元のサイズを維持します。次に、結果に合計を適用します。1 x 31:3>0'same''s'


おそらく短縮できます's'
ルイスメンドー

1
@LuisMendoいいね!MATLABは許可しますが、Octaveは許可しません(もちろん)
Suever


2

J、9バイト

+/@,}.,}:

のため[1, 2, 3, 4, 5]に、隣人は

1 2 3 4 5
1+2
1+2+3
  2+3+4
    3+4+5
      4+5

次に、和の対角線に沿って見てください

(2+3+4+5)+(1+2+3+4+5)+(1+2+3+4)

そのため、頭と尾を削除した入力の合計を見つけるだけで済みます。

使用法

   f =: +/@,}.,}:
   f 1 2 3 4 5
39
   f '' NB. Empty array
0
   f 1
1
   f 1 4
10
   f 1 4 7
28
   f 1 4 7 10
55
   f _1 _2 _3
_14
   f 0.1 0.2 0.3
1.4
   f 1 _20 300 _4000 50000 _600000 7000000
12338842

説明

+/@,}.,}:  Input: array A
       }:  Return a list with the last value in A removed
    }.     Return a list with the first value in A removed
      ,    Join them
   ,       Join that with A
+/@        Reduce that using addition to find the sum and return

いいね そしてハッピー6k +!
コナーオブライエン

2

Brain-Flak、68バイト

(<><>)([]){{}({}({})<>{})<>({}<(({})<>{})><>)([][()()])}{}({}{}<>{})

オンラインでお試しください!

説明:

#Push a 0
(<><>)

#Push the stack height
([])

#While true:
{

    #Pop the stack height 
    {}

    #Add the sum of the top 3 elements to the other stack, and pop the top of the stack
    ({}({})<>{})<>({}<(({})<>{})><>)

    #Push the new stack height minus two
    ([][()()])

#End
}

#Pop the exhausted counter
{}

#Add the top two numbers to the other stack
({}{}<>)

2

PowerShell v2 +、40バイト

param($a)($a-join'+'|iex)*3-$a[0]-$a[-1]

他の回答と同様に、リストを合計し、3で乗算して、終了要素を減算します。空の入力に対してBarfsが壮大なエラーを出力してから吐き出し0ますが、STDERRはデフォルトで無視されるため、これで問題ありません。

PS C:\Tools\Scripts\golfing> .\sum-of-neighbors.ps1 @()
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\sum-of-neighbors.ps1:1 char:22
+ param($a)($a-join'+'|iex)*3-$a[0]-$a[-1]
+                      ~~~
    + CategoryInfo          : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand

0

PS C:\Tools\Scripts\golfing> .\sum-of-neighbors.ps1 @(1)
1

PS C:\Tools\Scripts\golfing> .\sum-of-neighbors.ps1 @(1,4)
10

PS C:\Tools\Scripts\golfing> .\sum-of-neighbors.ps1 @(1,4,7)
28

PS C:\Tools\Scripts\golfing> .\sum-of-neighbors.ps1 @(1,4,7,10)
55

PS C:\Tools\Scripts\golfing> .\sum-of-neighbors.ps1 @(-1,-2,-3)
-14

PS C:\Tools\Scripts\golfing> .\sum-of-neighbors.ps1 @(0.1,0.2,0.3)
1.4

PS C:\Tools\Scripts\golfing> .\sum-of-neighbors.ps1 @(1,-20,300,-4000,50000,-600000,7000000)
12338842

ParameterArgumentValidationErrorEmptyStringNotAllowedಠ_ಠなんという例外でしょう!
カデ

2

ルビー、35 33 31バイト

リンのソリューションに触発された:

->a{[*(a*3)[1..-2]].reduce:+}

to_aセグメントは、空の配列を処理するために存在します。

編集:m-chrzanとhistocratに感謝します。


かっこは必要ありません:+
m-chrzan

[*(a*3)[1..-2]]ない.to_a2バイト以下に。
-histocrat

Ruby 2.4.0を試してみたいと思うかもしれません。付属していArray#sumます。
マーティンエンダー

2

Perl 6、25バイト

{.sum*3-.[0]-(.[*-1]//0)}    # generates warning
{+$_&&.sum*3-.[0]-.[*-1]}

拡張:

# bare block lambda with implicit parameter 「$_」
{
  +$_        # the number of elements

  &&         # if that is 0 return 0, otherwise return the following

  .sum * 3   # sum them up and multiply by 3
  - .[ 0 ]   # subtract the first value
  - .[*-1]   # subtract the last value
}

テスト:

use v6.c;
use Test;

my &code = {+$_&&.sum*3-.[0]-.[*-1]}

my @tests = (
  []            => 0,
  [1]           => 1,
  [1,4]         => 10,
  [1,4,7]       => 28,
  [1,4,7,10]    => 55,
  [-1,-2,-3]    => -14,
  [0.1,0.2,0.3] => 1.4,
  [1,-20,300,-4000,50000,-600000,7000000] => 12338842,
);

plan +@tests;

for @tests -> $_ ( :key(@input), :value($expected) ) {
  is code(@input), $expected, .gist;
}

1

PHP、39バイト

<?=3*array_sum($a=$argv)-$a[1]-end($a);

次のように実行します:

echo '<?=3*array_sum($a=$argv)-$a[1]-end($a);' | php -- 1 -20 300 -4000 50000 -600000 7000000 2>/dev/null;echo

説明

課題は、最初の数字と最後の数字(2回追加)を除いて、3回ごとに追加することに減らすことができます。したがって、合計の3倍から最初と最後の数を引いた値を返します。


1

> <>、25(+3の場合 -v)= 28バイト

スタックから入力を受け取り、 -vstdinが空であると想定し、それに依存して-1値を提供します。

:{:}+i*v
:$v?=1l<+++:
;n<

1

LINQを使用したC#、42バイト

a=>3*a.Sum()-(a.Length>0?a[0]+a.Last():0);

System.Linq名前空間が必要です。


C#、84バイト

a=>{int i=0,l=a.Length;var r=0d;for(;i<l;)r+=3*a[i++];return(l>0?r-a[0]-a[l-1]:0);};

テストケースを含む完全なプログラム:

using System;

namespace SumOfNeighbours
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<double[],double>f= a=>{int i=0,l=a.Length;var r=0d;for(;i<l;)r+=3*a[i++];return(l>0?r-a[0]-a[l-1]:0);};


            // test cases:
            double[] x = new double[]{1,2,3,4,5};
            Console.WriteLine(f(x));    // 39

            x = new double[] {};
            Console.WriteLine(f(x));    // 0

            x = new double[] {1};
            Console.WriteLine(f(x));    // 1

            x = new double[] {1,4};
            Console.WriteLine(f(x));    // 10 (1+4 + 4+1)

            x = new double[] {1,4,7};
            Console.WriteLine(f(x));    // 28

            x = new double[] {1,4,7,10};
            Console.WriteLine(f(x));    // 55

            x = new double[] {-1,-2,-3};
            Console.WriteLine(f(x));    // -14

            x = new double[] {0.1,0.2,0.3};
            Console.WriteLine(f(x));    // 1.4

            x = new double[] {1,-20,300,-4000,50000,-600000,7000000};
            Console.WriteLine(f(x));    // 12338842
        }
    }
}

1

ラケット48バイト

(if(null? l)0(-(* 3(apply + l))(car l)(last l)))

ゴルフをしていない:

(define (f lst)
  (if (null? lst)
      0
      (- (* 3 (apply + lst))
         (first lst)
         (last lst))))

テスト:

(f '()) 
(f '(1))
(f '(1 4)) 
(f '(1 4 7)) 
(f '(1 4 7 10)) 
(f '(-1 -2 -3)) 
(f '(0.1 0.2 0.3)) 
(f '(1 -20 300 -4000 50000 -600000 7000000)) 

出力:

0
1
10
28
55
-14
1.4000000000000001
12338842

1

Gloo、12バイト

Glooの機能が意図したとおりに機能しないことが判明したため、これを苦痛な方法で行う必要がありました。

__]:]:]:,,[+

説明:

__                   // duplicate the input list twice
  ]:]:]:             // flatten each list, and rotate stack left 
        ,,           // pop the last 2 numbers 
                     // (which are the first and last element of the list)
          [+         // wrap all items in a list and sum.

1

エリクサー、93バイト

&if (length(&1)>0),do: Enum.reduce(&1,fn(n,r)->n+r end)*3-Enum.at(&1,0)-List.last(&1),else: 0

キャプチャー演算子を使用した匿名関数。

テストケースを含む完全なプログラム:

s=&if (length(&1)>0),do: Enum.reduce(&1,fn(n,r)->n+r end)*3-Enum.at(&1,0)-List.last(&1),else: 0
# test cases:
IO.puts s.([])            # 0
IO.puts s.([1])           # 1
IO.puts s.([1,4])         # 10 (1+4 + 4+1)
IO.puts s.([1,4,7])       # 28
IO.puts s.([1,4,7,10])    # 55
IO.puts s.([-1,-2,-3])    # -14
IO.puts s.([0.1,0.2,0.3]) # 1.4
IO.puts s.([1,-20,300,-4000,50000,-600000,7000000]) # 12338842

ElixirPlaygroundでオンラインで試しください!


1

TI-Basic、17バイト

リストの合計の3倍から、最初と最後の要素を引いたものです。

3sum(Ans)-Ans(1)-Ans(dim(Ans)-1

メタに関するコンセンサスはそれAnsが無効な入力形式であると言っていると思います。
コナーオブライエン

リストで使用できます。心配しないでください。次のように渡す{1,3,5,7,2,6}:prgmNEIGHBOR
Timtech

それはまだAns入力としてです。
コナーオブライエン

気になっているように見えますか?これが、TI-Basicで入力を渡す標準的な方法です。
ティムテック

私があなたに同意する限り、それは答えをこれ以上有効にしません。
コナーオブライエン

1

Ruby、41バイト

->a{a.reduce(0,:+)*3-(a[0]?a[0]+a[-1]:0)}

テストケースを含む完全なプログラム:

f=->a{a.reduce(0,:+)*3-(a[0]?a[0]+a[-1]:0)}

#test cases
a=[]            
puts f.call(a)  # 0

a=[1]           
puts f.call(a)  # 1

a=[1,4]         
puts f.call(a)  # 10

a=[1,4,7]       
puts f.call(a)  # 28

a=[1,4,7,10]    
puts f.call(a)  # 55

a=[-1,-2,-3]    
puts f.call(a)  # -14

a=[0.1,0.2,0.3] 
puts f.call(a)  # 1.4

a=[1,-20,300,-4000,50000,-600000,7000000] 
puts f.call(a)  # 12338842

Rubyでの私の最初の試み。


Ruby 2.4.0の時点でがありArray#sumます。ただし、これをこのソリューションに単純にドロップできるかどうかをテストするために、プレビューリリースをまだインストールしていません。
マーティンエンダー



1

Java 8、60

d->d.length>0?Arrays.stream(d).sum()*3-d[0]-d[d.length-1]:0;

1

C ++、67バイト

#import<valarray>
int f(std::valarray<int>v){return 3*v.sum()-v[0]-v[v.size()-1];}

使用法:

#include <iostream>
int main() {
    std::cout << f({1,2,1});
    return 0;
}

1

Haskell、25バイト

最速から

sum.sequence[(0-).head,(3*).sum,(0-).last]$[1..5]

最もきれいな

sum.sequence[sum.init,sum,sum.tail]$[1..5]

gliいが最短

let y x=sum$init x++x++tail x in y[1..5]     
--  1234567890123456789012345

1

バッチ、67バイト

@set/as=l=0
@for %%n in (%*)do @set/as+=l=%%n
@cmd/cset/as*3-%1-l

パラメータがない場合、最後のコマンドはに変わり0 * 3 - -0ます。

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