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



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

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

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


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

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.


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


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ę


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

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.


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.


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

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

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

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

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.


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

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ę.


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<

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

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

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.

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 !


1

TI-Basic, 17 bajtów

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

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

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.


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

Java 8, 60

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

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

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.