Suma sąsiadów

22

To powinno być dość proste wyzwanie.

W przypadku tablicy liczb wygeneruj tablicę, w której dla każdego elementu zostaną dodane wszystkie sąsiednie elementy, i zwróć sumę tej tablicy.

Oto transformacja zachodząca na tablicy wejściowej [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

Przypadki testowe

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

Tabela liderów

Bassdrop Cumberwubwubwub
źródło
Czy musimy obsługiwać liczby zmiennoprzecinkowe, czy tylko liczby całkowite?
corvus_192
@ corvus_192 Przypadki testowe obejmują liczby całkowite.
Geobits
@Geobits Nie zauważyłem tego, zmienię swoją odpowiedź.
corvus_192
2
Powinieneś to zrobić z tablicami dwuwymiarowymi.
Bradley Uffner,

Odpowiedzi:

8

MATL , 5 bajtów

7BZ+s

Wypróbuj online!

Wyjaśnienie

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
źródło
3
Bardzo sprytne użycie 7Btam, aby uzyskać[1 1 1]
Suever
Nie znam MATL-a, ale zastanawiam się: [a,b,c,...]jak zdobyć listę , a+bale jak uniknąć a?
Christian Sievers
1
@Christian Dodawanie odbywa się za pomocą operacji splotu. Dałoby to częściowe wyniki, do których się odwołujesz, ale istnieje wersja splotu, która ich unika, ponieważ tworzy tablicę wyjściową zawierającą tylko tyle wpisów, ile danych wejściowych. Jest to również wykorzystywane w odpowiedzi Suever
Luis Mendo
19

Python, 25 bajtów

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

Aby zobaczyć, dlaczego to działa, obróć rozwinięcie w OP o 45 stopni:

             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
źródło
14

Python 2, 28 bajtów

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

Tylko 3-krotność sumy i minus jeden z każdego elementu końcowego

Zoo Zoo
źródło
Znalazłem również schludne 25-bajtowe rozwiązanie .
Lynn
1
Co właściwie, jeśli ajest pusta lista (pierwszy przypadek testowy)? a[0]rzuci IndexError, nie?
Lynn
6

05AB1E , 11 5 bajtów

Zaoszczędzono 6 bajtów dzięki Adnan .

€Ð¦¨O

Wypróbuj online!

Wyjaśnienie

€Ð     # triplicate each item in the list
  ¦¨   # remove first and last element
    O  # sum
Emigna
źródło
Czy €Ð¦¨Odziała :)?
Adnan
@Adnan: Brilliant! Próbowałem wymyślić sposób na zrobienie tego z 3 *, ale nigdy nawet nie zastanawiałem się, €Ðmimo że użyłem €Dwcześniej: P
Emigna
4

JavaScript (ES6), 40 33 bajtów

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

Zwraca się NaNpo otrzymaniu pustej listy.

Arnauld
źródło
Możesz odciąć jeszcze 2 postacie, jeśli przeniesiesz mnożenie do złączenia w taki sposóbv=>eval(v.join`*3+`+"*2")-v[0]
Grax32,
@Grax - Fajnie! Jednak pusta tablica nie byłaby już fałszywa.
Arnauld,
Zawsze coś tam nie ma?
Grax32
@Grax - Nie. Pierwszy przypadek testowy to pusta tablica.
Arnauld,
4

R, 75 70 52 34 33 31 bajtów

Suma razy trzy i odejmij pierwszy i ostatni element

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

Edycja: Zapisano 3 dodatkowe bajty dzięki @rturnbull

Billywob
źródło
3

Scala, 47 bajtów

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

Poprzedza i dodaje 0, a następnie używa przesuwanego okna o rozmiarze 3, aby zsumować sąsiadów, i oblicza całkowitą sumę

corvus_192
źródło
3

Java 7, 72 bajty

float c(float[]a){float s=0,l=0;for(float i:a)s+=l=i;return 3*s-l-a[0];}
Numberknot
źródło
Nie sądzę, aby dodanie dodatkowych danych wejściowych oznaczających pierwszy i ostatni element tablicy było w duchu wyzwania.
Geobits
@Geobits, zmieniam to .....
Numberknot
Fajne. Możesz floatdouble
zagrać w
Czy mogę go zamiast tego użyć .... Double ma 2x precyzję float.
Numberknot
1
dlaczego nie ints
sidgate
3

Mathematica, 34 32 29 bajtów

Inspirując się staranną odpowiedzią Pytona na Lynn ...

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

lub

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

lub

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

Niestety takie podejście nie jest tak wygodne w Mathematica, jak w Pythonie, ponieważ nie ma krótkiego i bezpiecznego sposobu na odrzucenie pierwszego i ostatniego elementu listy, który może być pusty.

Martin Ender
źródło
2
+1 za nauczenie mnieCheck
Greg Martin
2

MATLAB, 31 28 26 bajtów

3 bajty zapisane dzięki @Luis

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

Tworzy to anonimową funkcję o nazwie, ansktórą można wywołać:ans([1, 2, 3, 4, 5])

Aby udostępnić demo online (wykorzystujące Octave), musiałem użyć 'same'zamiast 's'ostatniego wpisu doconv

Demo online

Wyjaśnienie

Wykonujemy convolution ( conv) z 1 x 3jądrem wszystkich 1 (utworzonych przez utworzenie tablicy, 1:3a następnie porównanie do zera >0) i zachowujemy rozmiar oryginału, określając trzecie wejście jako 'same'lub w MATLAB, do którego możemy po prostu skrócić 's'. Następnie stosujemy sumę do wyniku.

Suever
źródło
Prawdopodobnie możesz skrócić do's'
Luis Mendo
1
@LuisMendo Oh dobra rozmowa! MATLAB na to pozwala, ale Octave nie (oczywiście)
Suever
2

Galaretka , 5 bajtów

ẋ3ṖḊS

Wypróbuj online!

Tłumaczenie mojej odpowiedzi w języku Python .

ẋ3      Concatenate three copies of the input list
  Ṗ     Remove the last element
   Ḋ    Remove the first element
    S   Sum
Lynn
źródło
Tyle 5 bajtów, gdzie są 4? ḊṖ+ḤS, Ṗ++ḊS, +Ḋ+ṖS, +Ṗ+ḊS, ...
Jonathan Allan
2

J, 9 bajtów

+/@,}.,}:

Dla [1, 2, 3, 4, 5]sąsiedzi są

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

Następnie spójrz po przekątnych sum

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

Potrzebujemy więc tylko znaleźć sumę danych wejściowych z usuniętą głową i usuniętym ogonem.

Stosowanie

   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

Wyjaśnienie

+/@,}.,}:  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
mile
źródło
Miły. I szczęśliwy 6k +!
Conor O'Brien
2

Brain-Flak , 68 bajtów

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

Wypróbuj online!

Wyjaśnienie:

#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
źródło
2

PowerShell v2 +, 40 bajtów

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

Podobnie do innych odpowiedzi, sumuje listę, mnoży przez 3, odejmuje elementy końcowe. Wyklucza spektakularny błąd dla pustych danych wejściowych, a następnie wypluwa 0, ale ponieważ STDERR jest domyślnie ignorowany, jest to 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
źródło
ParameterArgumentValidationErrorEmptyStringNotAllowedಠ_ಠ Co za wyjątek!
Kade
2

Ruby, 35 33 31 bajtów

Zainspirowany rozwiązaniem Lynn:

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

to_aOdcinek ma na sobie pustą tablicę.

EDYCJA: Dzięki m-chrzan i histocrat.

Lee W.
źródło
Nie potrzebujesz nawiasów :+.
m-chrzan
[*(a*3)[1..-2]]robi o .to_adwa mniej bajtów.
histocrat
Możesz wypróbować Ruby 2.4.0. Pochodzi z Array#sum.
Martin Ender
2

Perl 6 , 25 bajtów

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

Rozszerzony:

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

Test:

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
źródło
1

PHP, 39 bajtów

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

Uruchom tak:

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

Wyjaśnienie

Wyzwanie można zredukować do dodawania każdej liczby 3 razy, z wyjątkiem pierwszej i ostatniej liczby (dodawanej dwukrotnie). Dlatego zwracam 3 razy sumę, pomniejszoną o pierwszą i ostatnią liczbę.

aross
źródło
1

> <> , 25 (+3 dla -v ) = 28 bajtów

Pobiera dane wejściowe ze stosu  -vi przyjmuje, że standardowe wejście jest puste, opierając się na nim, aby podać -1wartość.

:{:}+i*v
:$v?=1l<+++:
;n<
Aaron
źródło
1

C # z LINQ, 42 bajty

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

Wymaga System.Linqprzestrzeni nazw.


C #, 84 bajtów

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

Pełny program z przypadkami testowymi:

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
źródło
1

Rakieta 48 bajtów

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

Nie golfowany:

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

Testowanie:

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

Wydajność:

0
1
10
28
55
-14
1.4000000000000001
12338842
rnso
źródło
1

Gloo , 12 bajtów

Okazuje się, że funkcja Gloo nie działa zgodnie z przeznaczeniem, więc musiałem to zrobić w sposób bolesny.

__]:]:]:,,[+

Wyjaśnienie:

__                   // 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
źródło
1

Eliksir , 93 bajty

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

Anonimowa funkcja korzystająca z operatora przechwytywania.

Pełny program z przypadkami testowymi:

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

Wypróbuj online na ElixirPlayground !

adrianmp
źródło
1

TI-Basic, 17 bajtów

Po prostu trzykrotnie suma listy, minus pierwszy i ostatni element.

3sum(Ans)-Ans(1)-Ans(dim(Ans)-1
Timtech
źródło
Uważam, że konsensus w sprawie meta mówi, że Ansjest to nieprawidłowa forma danych wejściowych.
Conor O'Brien
Możesz używać go z listą, nie martw się. Podaj to jak{1,3,5,7,2,6}:prgmNEIGHBOR
Timtech
To wciąż Ansjako dane wejściowe.
Conor O'Brien
Czy to wygląda na to, że mnie to obchodzi? To standardowy sposób przekazywania danych wejściowych w TI-Basic.
Timtech
o ile się z tobą zgadzam, to nie sprawia, że ​​odpowiedź jest bardziej aktualna.
Conor O'Brien
1

Rubin, 41 bajtów

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

Pełny program z przypadkami testowymi:

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

Moja pierwsza próba w Ruby.

adrianmp
źródło
Od wersji Ruby 2.4.0 jest Array#sum. Nie zainstalowałem jeszcze wersji zapoznawczej, aby sprawdzić, czy można to po prostu wrzucić do tego rozwiązania.
Martin Ender
1

JavaScript, 46 bajtów

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

Dzięki @rlemon za dodatkowe 2 bajty

Naftali alias Neal
źródło
1

Java 8, 60

d->d.length>0?Arrays.stream(d).sum()*3-d[0]-d[d.length-1]:0;
dpa97
źródło
1

C ++, 67 bajtów

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

Stosowanie:

#include <iostream>
int main() {
    std::cout << f({1,2,1});
    return 0;
}
Anedar
źródło
1

Haskell, 25 bajtów

Od najszybszego

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

przez najładniejsze

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

aż do najbrzydszych, ale najkrótszych

let y x=sum$init x++x++tail x in y[1..5]     
--  1234567890123456789012345
Roman Czyborra
źródło
1

Partia, 67 bajtów

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

Jeśli nie ma żadnych parametrów, zmienia się ostatnie polecenie 0 * 3 - -0.

Neil
źródło