이웃의 합


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

@Geobits 나는 그것을 알지 못했다. 나는 대답을 편집 할 것이다.
corvus_192

2
다음에 2 차원 배열로이 작업을 수행해야합니다.
Bradley Uffner

답변:


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?
Christian Sievers

1
@Christian 추가는 컨볼 루션 작업을 통해 수행됩니다. 참조하는 부분 결과를 생성하지만 입력 수만큼 항목이있는 출력 배열을 생성하기 때문에 피할 수있는 컨볼 루션 버전이 있습니다. 이것은 Suever의 답변에도 사용됩니다
Luis Mendo

19

파이썬, 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

14

파이썬 2, 28 바이트

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

각 끝 요소 중 하나의 합계와 빼기의 3 배


또한 깔끔한 25 바이트 솔루션을 찾았습니다 .
Lynn

1
실제로 a빈 목록 (첫 번째 테스트 사례)이 있다면 어떻게됩니까? 아니 a[0]던질 IndexError거야?
Lynn

6

05AB1E , 11 5 바이트

Adnan 덕분에 6 바이트를 절약했습니다 .

€Ð¦¨O

온라인으로 사용해보십시오!

설명

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

€Ð¦¨O작동 합니까 :)?
Adnan

@Adnan : 훌륭합니다! 나는 3 *로 그것을하는 방법을 생각하려고 노력했지만, 전에 €Ð사용해 본 적이조차 고려 조차 하지 않았다 €D. : P
Emigna

4

자바 스크립트 (ES6), 40 33 바이트

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

NaN빈 목록이 주어지면 반환 합니다.


이와 같이 곱셈을 조인으로 이동하면 2 개 이상의 문자를 잘라낼 수 있습니다.v=>eval(v.join`*3+`+"*2")-v[0]
Grax32

@Grax-니스! 그러나 빈 배열에 대해서는 더 이상 거짓이 아닙니다.
Arnauld

항상 뭔가가 있습니까?
Grax32

@Grax-아니요. 첫 번째 테스트 사례는 빈 배열입니다.
Arnauld

4

R, 75 70 52 34 33 31 바이트

합계 시간 3 및 첫 번째 및 마지막 요소 빼기

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

편집 : @rturnbull 덕분에 3 바이트 추가 저장


3

스칼라, 47 바이트

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

0을 앞에 추가하고 추가 한 다음 크기 3의 슬라이딩 창을 사용하여 이웃을 합하고 총합을 계산합니다.


3

자바 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

@Geobits 나는 그것을 변경 .....
Numberknot

시원한. float대신에 다음 을 사용하여 골프를 더 double
즐길

대신 사용할 수 있습니까? ... Double의 정밀도는 2 배입니다.
Numberknot

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에서 파이썬만큼 편리하지는 않습니다. 목록의 첫 번째 요소와 마지막 요소를 비울 수있는 짧고 안전한 방법은 없기 때문입니다.


2
가르쳐 주셔서 +1Check
Greg Martin

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

온라인 데모

설명

우리 는 배열을 만들고 0 과 비교하여 생성 된 모든 1의 커널로 컨볼 루션 ( conv)을 수행 하고 MATLAB에서 또는 MATLAB에서 세 번째 입력을 지정하여 원본의 크기를 유지합니다 . 그런 다음 합계를 결과에 적용합니다.1 x 31:3>0'same''s'


당신은 아마 단축 할 수 있습니다's'
Luis Mendo

1
@LuisMendo 오 좋은 전화! MATLAB은 허용하지만 옥타브는 (물론)
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 +!
Conor O'Brien

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을 곱한 후 끝 요소를 뺍니다. 빈 입력에 대해 화려한 오류를 제거하고 뱉어 내지 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ಠ_ಠ 정말 예외입니다!
Kade

2

루비, 35 33 31 바이트

Lynn의 솔루션에서 영감을 얻은 결과 :

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

to_a세그먼트는 빈 배열을 처리 할 수있다.

편집 : m-chrzan과 histocrat 덕분에.


주위에 괄호가 필요하지 않습니다 :+.
m-chrzan

[*(a*3)[1..-2]]수행 .to_a이 적은 바이트.
histocrat

Ruby 2.4.0을 사용하고 싶을 수도 있습니다. 와 함께 제공됩니다 Array#sum.
Martin Ender

2

펄 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

설명

첫 번째 숫자와 마지막 숫자 (두 번 더함)를 제외하고는 숫자를 세 번 더하는 문제를 줄일 수 있습니다. 따라서 나는 첫 번째와 마지막 숫자를 뺀 합계의 3 배를 반환합니다.


1

> <> , 25 (+3의 경우  -v) = 28 바이트

스택에서 입력을 가져  -v오고 stdin이 비어 있다고 가정하여 -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 기본, 17 바이트

목록 합계의 세 배에 불과한 첫 번째 요소와 마지막 요소를 뺀 것입니다.

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

메타에 대한 합의 Ans가 잘못된 입력 형식 이라고 말합니다 .
Conor O'Brien

목록과 함께 사용할 수 있으므로 걱정하지 마십시오. 다음과 같이 전달{1,3,5,7,2,6}:prgmNEIGHBOR
Timtech

그것은 여전히 Ans입력입니다.
Conor O'Brien

내가 좋아하는 것 같아? 이것이 TI-Basic에서 입력을 전달하는 표준 방법입니다.
Timtech

내가 당신에게 동의하는 한, 그 대답은 더 이상 유효하지 않습니다.
Conor O'Brien

1

루비, 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 2.4.0부터는 Array#sum. 아직이 솔루션에 포함시킬 수 있는지 테스트하기 위해 아직 프리뷰 릴리스를 설치하지 않았습니다.
Martin Ender

1

자바 스크립트, 46 바이트

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

여분의 2 바이트에 대해 @rlemon에게 감사드립니다.



1

자바 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

하스켈, 25 바이트

가장 빠른 것부터

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

가장 예쁘다

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

추악하지만 가장 짧음

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.