이웃의 합


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.