Jumlah tetangga

22

Ini harus menjadi tantangan yang cukup sederhana.

Untuk array angka, buat array di mana untuk setiap elemen semua elemen tetangga ditambahkan ke dirinya sendiri, dan kembalikan jumlah array itu.

Berikut adalah transformasi yang terjadi pada array input [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

Uji kasus

[]            => 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

Papan peringkat

Bassdrop Cumberwubwubwub
sumber
1
Terkait Terkait Terkait
Martin Ender
Apakah kita perlu mendukung angka floating point atau hanya bilangan bulat?
corvus_192
@ corvus_192 Kasus uji termasuk bukan bilangan bulat.
Geobits
@ Geobits Saya tidak menyadarinya, saya akan mengedit jawaban saya.
corvus_192
2
Anda harus melakukan ini dengan array 2 dimensi berikutnya.
Bradley Uffner

Jawaban:

8

MATL , 5 byte

7BZ+s

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
3
Penggunaan yang sangat pintar dari 7Bsana untuk mendapatkan[1 1 1]
Suever
Saya tidak tahu MATL, tapi saya ingin tahu: untuk daftar [a,b,c,...], bagaimana Anda mendapatkan a+btetapi menghindari a?
Christian Sievers
1
@Christian Penambahan dilakukan melalui operasi konvolusi. Ini akan menghasilkan hasil parsial yang Anda rujuk, tetapi ada versi konvolusi yang menghindarinya, karena ia menghasilkan array keluaran dengan hanya entri sebanyak input. Ini juga digunakan dalam jawaban Suever
Luis Mendo
19

Python, 25 byte

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

Untuk melihat mengapa ini bekerja, putar ekspansi di OP dengan 45 derajat:

             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
Lynn
sumber
14

Python 2, 28 byte

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

Hanya 3 kali jumlah dan minus satu dari setiap elemen ujung

Kebun binatang kebun binatang
sumber
Saya juga menemukan solusi 25-byte yang rapi .
Lynn
1
Sebenarnya, bagaimana jika adaftar kosong (test case pertama)? a[0]akan melempar IndexError, bukan?
Lynn
6

05AB1E , 11 5 byte

Disimpan 6 byte berkat Adnan .

€Ð¦¨O

Cobalah online!

Penjelasan

€Ð     # triplicate each item in the list
  ¦¨   # remove first and last element
    O  # sum
Emigna
sumber
Apakah €Ð¦¨Oberhasil :)?
Adnan
@ Adnan: Brilliant! Saya mencoba memikirkan cara untuk melakukannya dengan 3 *, tetapi saya bahkan tidak pernah mempertimbangkan €Ðmeskipun saya telah menggunakan €Dsebelumnya: P
Emigna
4

JavaScript (ES6), 40 33 byte

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

Kembali NaNketika diberikan daftar kosong.

Arnauld
sumber
Anda dapat memangkas 2 karakter lagi jika Anda memindahkan perkalian ke dalam join seperti ituv=>eval(v.join`*3+`+"*2")-v[0]
Grax32
@Grax - Bagus! Namun, itu tidak akan palsu lagi untuk array kosong.
Arnauld
Selalu ada sesuatu, kan?
Grax32
@ Galx - Tidak. Kotak uji pertama adalah array kosong.
Arnauld
4

R, 75 70 52 34 33 31 byte

Jumlahkan tiga kali dan kurangi elemen pertama dan terakhir

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

Sunting: Disimpan 3 byte tambahan berkat @rturnbull

Billywob
sumber
3

Scala, 47 byte

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

Tambahkan dan tambahkan a 0, kemudian gunakan jendela geser ukuran 3 untuk menjumlahkan tetangga, dan menghitung jumlah total

corvus_192
sumber
3

Java 7, 72 Bytes

float c(float[]a){float s=0,l=0;for(float i:a)s+=l=i;return 3*s-l-a[0];}
Numberknot
sumber
Saya tidak berpikir menambahkan input tambahan yang menunjukkan elemen pertama dan terakhir dari array adalah semangat tantangan.
Geobits
@ Geobits, saya mengubahnya .....
Numberknot
Keren. Anda dapat bermain golf lebih banyak dengan menggunakan floatalih-alih double:)
Geobits
Dapatkah saya menggunakannya sebagai gantinya .... Double memiliki 2x presisi float.
Numberknot
1
kenapa tidak int?
sidgate
3

Mathematica, 34 32 29 byte

Mengambil beberapa inspirasi, jawaban Python yang rapi dari Lynn ...

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

atau

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

atau

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

Sayangnya, pendekatan ini tidak begitu nyaman di Mathematica seperti di Python, karena tidak ada cara pendek dan aman untuk membuang elemen pertama dan terakhir dari daftar yang mungkin kosong.

Martin Ender
sumber
2
+1 untuk mengajari sayaCheck
Greg Martin
2

MATLAB, 31 28 26 byte

3 byte disimpan berkat @Luis

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

Ini menciptakan fungsi anonim bernama ansyang dapat disebut seperti:ans([1, 2, 3, 4, 5])

Dalam rangka memberikan demo online (yang menggunakan Octave), saya harus menggunakan 'same'bukannya's' sebagai input terakhirconv

Demo online

Penjelasan

Kami melakukan konvolusi ( conv) dengan 1 x 3kernel semua 1's (dibuat dengan membuat array 1:3dan kemudian membandingkannya dengan nol >0) dan mempertahankan ukuran aslinya dengan menetapkan input ketiga sebagai 'same'atau di MATLAB kita dapat mempersingkat ini menjadi 's'. Kami kemudian menerapkan jumlah pada hasilnya.

Suever
sumber
Anda mungkin dapat mempersingkat menjadi's'
Luis Mendo
1
@LuisMendo Oh panggilan bagus! MATLAB memperbolehkannya tetapi Octave tidak (tentu saja)
Suever
2

Jelly , 5 byte

ẋ3ṖḊS

Cobalah online!

Terjemahan dari jawaban Python saya .

ẋ3      Concatenate three copies of the input list
  Ṗ     Remove the last element
   Ḋ    Remove the first element
    S   Sum
Lynn
sumber
Begitu banyak 5 byters, di mana 4? ḊṖ+ḤS, Ṗ++ḊS, +Ḋ+ṖS, +Ṗ+ḊS, ...
Jonathan Allan
2

J, 9 byte

+/@,}.,}:

Karena [1, 2, 3, 4, 5], para tetangga adalah

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

Kemudian lihat diagonal angka-angka

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

Jadi kita hanya perlu menemukan jumlah input dengan kepalanya dilepas dan ekornya dilepas.

Pemakaian

   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

Penjelasan

+/@,}.,}:  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
mil
sumber
Bagus. Dan bahagia 6k +!
Conor O'Brien
2

Brain-Flak , 68 byte

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

Cobalah online!

Penjelasan:

#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
({}{}<>)
DJMcMayhem
sumber
2

PowerShell v2 +, 40 byte

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

Mirip dengan jawaban lain, jumlahkan daftar, lipat dengan 3, kurangi elemen akhirnya. Tidak ada kesalahan spektakuler untuk input kosong, dan kemudian 0dimuntahkan, tetapi karena STDERR diabaikan secara default, ini OK.

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
AdmBorkBork
sumber
ParameterArgumentValidationErrorEmptyStringNotAllowedಠ_ಠ Pengecualian!
Kade
2

Ruby, 35 33 31 byte

Terinspirasi oleh solusi Lynn:

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

Itu to_a segmen yang ada untuk menangani array kosong.

EDIT: Terima kasih kepada m-chrzan dan histokrat.

Lee W
sumber
Anda tidak perlu tanda kurung :+.
m-chrzan
[*(a*3)[1..-2]]tidak .to_adalam dua byte lebih sedikit.
histokrat
Anda mungkin ingin mencoba Ruby 2.4.0. Itu datang dengan Array#sum.
Martin Ender
2

Perl 6 , 25 byte

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

Diperluas:

# 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
}

Uji:

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;
}
Brad Gilbert b2gills
sumber
1

PHP, 39 byte

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

Jalankan seperti ini:

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

Penjelasan

Tantangan dapat dikurangi dengan menambahkan setiap angka 3 kali, kecuali angka pertama dan terakhir (ditambahkan dua kali). Karena itu saya mengembalikan 3 kali jumlah, minus angka pertama dan terakhir.

aross
sumber
1

> <> , 25 (+3 untuk  -v) = 28 byte

Mengambil input dari stack dengan  -vdan menganggap stdin kosong, bergantung padanya untuk memberikan -1nilai.

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

C # dengan LINQ, 42 byte

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

Membutuhkan System.Linqnamespace.


C #, 84 byte

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);};

Program lengkap dengan kasus uji:

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
        }
    }
}
adrianmp
sumber
1

Racket 48 byte

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

Tidak Disatukan:

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

Pengujian:

(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)) 

Keluaran:

0
1
10
28
55
-14
1.4000000000000001
12338842
juga
sumber
1

Gloo , 12 Bytes

Ternyata fitur Gloo tidak berfungsi sebagaimana mestinya jadi saya harus melakukan ini dengan cara yang menyakitkan.

__]:]:]:,,[+

Penjelasan:

__                   // 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.
Kade
sumber
1

Elixir , 93 byte

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

Fungsi anonim menggunakan operator tangkap.

Program lengkap dengan kasus uji:

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

Cobalah online di ElixirPlayground !

adrianmp
sumber
1

TI-Basic, 17 byte

Cukup tiga kali jumlah dari daftar, minus elemen pertama dan terakhir.

3sum(Ans)-Ans(1)-Ans(dim(Ans)-1
Timtech
sumber
Saya percaya konsensus tentang meta mengatakan bahwa itu Ansadalah bentuk input yang tidak valid.
Conor O'Brien
Anda dapat menggunakannya dengan daftar, jangan khawatir. Lulus saja{1,3,5,7,2,6}:prgmNEIGHBOR
Timtech
Itu masih Ans sebagai input.
Conor O'Brien
Apakah aku peduli? Itulah cara standar untuk melewatkan input di TI-Basic.
Timtech
seperti saya setuju dengan Anda, itu tidak membuat jawaban lebih valid.
Conor O'Brien
1

Ruby, 41 byte

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

Program lengkap dengan kasus uji:

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

Upaya pertama saya di Ruby.

adrianmp
sumber
Pada Ruby 2.4.0 ada Array#sum. Saya belum menginstal rilis preview untuk menguji apakah ini dapat dimasukkan ke dalam solusi ini.
Martin Ender
1

Javascript, 46 byte

a.reduce((t,c,i)=>t+(a[i-1]|0)+c+(a[i+1]|0),0)

Terima kasih @rlemon untuk 2 byte tambahan

Naftali alias Neal
sumber
1

Java 8, 60

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

C ++, 67 byte

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

Pemakaian:

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

Haskell, 25 byte

Dari tercepat

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

via tercantik

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

ke paling jelek tapi terpendek

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

Batch, 67 byte

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

Jika tidak ada parameter, perintah terakhir berubah menjadi 0 * 3 - -0.

Neil
sumber