Tổng hàng xóm


22

Đây sẽ là một thử thách khá đơn giản.

Đối với một mảng các số, tạo một mảng trong đó cho mọi phần tử, tất cả các phần tử lân cận được thêm vào chính nó và trả về tổng của mảng đó.

Đây là phép biến đổi xảy ra trên mảng đầu vào [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

Các trường hợp thử nghiệm

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

Bảng xếp hạng



Chúng ta có cần hỗ trợ số dấu phẩy động hay chỉ số nguyên?
corvus_192

@ corvus_192 Các trường hợp thử nghiệm bao gồm các số nguyên.
Geobits

@Geobits Tôi không nhận thấy điều đó, tôi sẽ chỉnh sửa câu trả lời của mình.
corvus_192

2
Bạn nên làm điều này với mảng 2 chiều tiếp theo.
Bradley Uffner

Câu trả lời:


8

MATL , 5 byte

7BZ+s

Hãy thử trực tuyến!

Giải trình

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
Sử dụng rất thông minh 7Bđể có được[1 1 1]
Suever

Tôi không biết MATL, nhưng tôi tự hỏi: đối với một danh sách [a,b,c,...], làm thế nào để bạn nhận được a+bnhưng tránh nhận được a?
Christian Sievers

1
@Christian Việc bổ sung được thực hiện bằng phương pháp tích chập. Nó sẽ tạo ra kết quả một phần mà bạn đề cập đến, nhưng có một phiên bản tích chập tránh chúng, bởi vì nó tạo ra một mảng đầu ra chỉ có nhiều mục nhập như đầu vào. Điều này cũng được sử dụng trong câu trả lời của Suever
Luis Mendo

19

Python, 25 byte

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

Để xem lý do tại sao điều này hoạt động, xoay 45 độ mở rộng trong OP:

             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

14

Python 2, 28 byte

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

Chỉ cần 3 lần tổng và trừ một trong mỗi phần tử kết thúc


Tôi cũng tìm thấy một giải pháp 25 byte gọn gàng .
Lynn

1
Trên thực tế, nếu adanh sách trống (trường hợp thử nghiệm đầu tiên) thì sao? a[0]sẽ ném một IndexError, không?
Lynn

6

05AB1E , 11 5 byte

Đã lưu 6 byte nhờ Adnan .

€Ð¦¨O

Hãy thử trực tuyến!

Giải trình

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

€Ð¦¨Ohoạt động không :)?
Ad Nam

@Ad Nam: Rực rỡ! Tôi đã cố gắng nghĩ cách để làm điều đó với 3 *, nhưng tôi thậm chí chưa bao giờ xem xét €Ðmặc dù tôi đã sử dụng €Dtrước đó: P
Emigna

4

JavaScript (ES6), 40 33 byte

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

Trả về NaNkhi được đưa ra một danh sách trống.


Bạn có thể cắt thêm 2 ký tự nếu bạn di chuyển phép nhân vào phép nối như vậyv=>eval(v.join`*3+`+"*2")-v[0]
Grax32

@Grax - Tốt đẹp! Tuy nhiên, nó sẽ không còn sai lệch nữa cho mảng trống.
Arnauld

Luôn có thứ gì đó không có ở đó?
Grax32

@Grax - Không. Trường hợp thử nghiệm đầu tiên là một mảng trống.
Arnauld

4

R, 75 70 52 34 33 31 byte

Tổng ba lần và trừ phần tử đầu tiên và cuối cùng

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

Chỉnh sửa: Đã lưu thêm 3 byte nhờ @rturnbull


3

Scala, 47 byte

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

Chuẩn bị và nối thêm 0, sau đó sử dụng cửa sổ trượt có kích thước 3 để tính tổng các hàng xóm và tính tổng tiền


3

Java 7, 72 byte

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

Tôi không nghĩ việc thêm các đầu vào bổ sung biểu thị các yếu tố đầu tiên và cuối cùng của mảng là trên tinh thần của thách thức.
Geobits

@Geobits Tôi thay đổi nó .....
Numberjack

Mát mẻ. Bạn có thể chơi gôn nhiều hơn bằng cách sử dụng floatthay vì double:)
Geobits

Tôi có thể sử dụng nó thay thế .... Double có độ chính xác gấp 2 lần float.
Numberjack

1
tại sao không ints?
bên lề

3

Toán học, 34 32 29 byte

Lấy một số cảm hứng Câu trả lời Python gọn gàng của Lynn ...

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

hoặc là

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

hoặc là

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

Thật không may, cách tiếp cận này không hoàn toàn thuận tiện trong Mathicala như trong Python, bởi vì không có cách nào ngắn và an toàn để loại bỏ phần tử đầu tiên và cuối cùng của danh sách có thể trống.


2
+1 để dạy tôiCheck
Greg Martin

2

MATLAB, 31 28 26 byte

3 byte được lưu nhờ @Luis

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

Điều này tạo ra một hàm ẩn danh có tên anscó thể được gọi là:ans([1, 2, 3, 4, 5])

Để cung cấp bản demo trực tuyến (sử dụng Octave), tôi đã phải sử dụng 'same'thay vì 's'làm đầu vào cuối cùng đểconv

Demo trực tuyến

Giải trình

Chúng tôi thực hiện tích chập ( conv) với một 1 x 3hạt nhân của tất cả 1 (được tạo bằng cách tạo một mảng 1:3và sau đó so sánh với 0 >0) và giữ kích thước của bản gốc bằng cách chỉ định đầu vào thứ ba là 'same'hoặc trong MATLAB, chúng tôi có thể rút ngắn điều này thành 's'. Sau đó chúng tôi áp dụng tổng cho kết quả.


Bạn có thể rút ngắn xuống's'
Luis Mendo

1
@LuisMendo ơi gọi thật tốt! MATLAB cho phép nhưng Octave không (dĩ nhiên)
Suever


2

J, 9 byte

+/@,}.,}:

Đối với [1, 2, 3, 4, 5], hàng xóm là

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

Sau đó nhìn dọc theo các đường chéo của tổng

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

Vì vậy, chúng ta chỉ cần tìm tổng của đầu vào với đầu bị loại bỏ và đuôi bị loại bỏ.

Sử dụng

   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

Giải trình

+/@,}.,}:  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

Tốt đẹp. Và hạnh phúc 6k +!
Conor O'Brien

2

Brain-Flak , 68 byte

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

Hãy thử trực tuyến!

Giải trình:

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

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

Tương tự như các câu trả lời khác, tính tổng danh sách, nhân 3, trừ các phần tử kết thúc. Barfs đưa ra một lỗi ngoạn mục cho đầu vào trống, và sau đó phun ra 0, nhưng vì STDERR bị bỏ qua theo mặc định, điều này là 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

ParameterArgumentValidationErrorEmptyStringNotAllowed_ಠ Thật là một ngoại lệ!
Kade

2

Ruby, 35 33 31 byte

Lấy cảm hứng từ giải pháp của Lynn:

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

Các to_abộ phận là có để xử lý các mảng sản phẩm nào.

EDIT: Cảm ơn m-chrzan và histocrat.


Bạn không cần dấu ngoặc đơn xung quanh :+.
m-chrzan

[*(a*3)[1..-2]]không .to_atrong hai byte ít hơn.
lịch sử

Bạn có thể muốn cho Ruby 2.4.0 đi. Nó đi kèm với Array#sum.
Martin Ender

2

Perl 6 , 25 byte

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

Mở rộng:

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

Kiểm tra:

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 byte

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

Chạy như thế này:

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

Giải trình

Thách thức có thể được giảm xuống để thêm mỗi số 3 lần, ngoại trừ số đầu tiên và số cuối cùng (thêm hai lần). Do đó, tôi trả lại 3 lần tổng, trừ số đầu tiên và số cuối cùng.


1

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

Đưa đầu vào từ ngăn xếp với  -vvà giả sử stdin trống, dựa vào nó để cung cấp một -1giá trị.

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

1

C # với LINQ, 42 byte

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

Yêu cầu System.Linqkhông gian tên.


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

Chương trình đầy đủ với các trường hợp thử nghiệm:

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

Vợt 48 byte

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

Ung dung:

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

Kiểm tra:

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

Đầu ra:

0
1
10
28
55
-14
1.4000000000000001
12338842

1

Gloo , 12 byte

Hóa ra một tính năng của Gloo không hoạt động như dự định nên tôi phải làm điều này một cách đau đớn.

__]:]:]:,,[+

Giải trình:

__                   // 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

Thuốc tiên , 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

Chức năng ẩn danh sử dụng toán tử chụp.

Chương trình đầy đủ với các trường hợp thử nghiệm:

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

Dùng thử trực tuyến trên ElixirPlayground !


1

TI-Basic, 17 byte

Đơn giản chỉ cần ba lần tổng của danh sách, trừ phần tử đầu tiên và cuối cùng.

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

Tôi tin rằng sự đồng thuận về meta nói rằng đó Anslà một hình thức đầu vào không hợp lệ.
Conor O'Brien

Bạn có thể sử dụng nó với một danh sách, đừng lo lắng. Vượt qua như thế{1,3,5,7,2,6}:prgmNEIGHBOR
TimTech

Đó vẫn Anslà đầu vào.
Conor O'Brien

Nó trông giống như tôi quan tâm? Đó là cách tiêu chuẩn để chuyển đầu vào trong TI-Basic.
Timtech

nhiều như tôi đồng ý với bạn, điều đó không làm cho câu trả lời trở nên hợp lệ hơn.
Conor O'Brien

1

Ruby, 41 byte

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

Chương trình đầy đủ với các trường hợp thử nghiệm:

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

Nỗ lực đầu tiên của tôi trong Ruby.


Kể từ Ruby 2.4.0 Array#sum. Tôi chưa cài đặt bản phát hành xem trước mặc dù để kiểm tra xem liệu điều này có thể được bỏ vào giải pháp này hay không.
Martin Ender



1

Java 8, 60

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

1

C ++, 67 byte

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

Sử dụng:

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

1

Haskell, 25 byte

Từ nhanh nhất

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

thông qua đẹp nhất

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

xuống đến xấu nhất nhưng ngắn nhất

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

1

Mẻ, 67 byte

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

Nếu không có tham số, lệnh cuối cùng biến thành 0 * 3 - -0.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.