Сума сусідів


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 Я цього не помітив, я відредагую свою відповідь.
corvus_192

2
Ви повинні зробити це з двовимірними масивами поруч.
Бредлі Уффнер

Відповіді:


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?
Крістіан Сіверс

1
@Christian Додавання робиться за допомогою операції згортання. Це дозволило б отримати часткові результати, на які ви посилаєтесь, але є версія згортки, яка уникає їх, оскільки він створює вихідний масив, що містить лише стільки записів, скільки вхід. Це також використовується у відповіді Сьювера
Луїс Мендо

19

Пітон, 25 байт

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

Щоб зрозуміти, чому це працює, поверніть розширення в ОП на 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


6

05AB1E , 11 5 байт

Збережено 6 байт завдяки Аднану .

€Ð¦¨O

Спробуйте в Інтернеті!

Пояснення

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

Чи €Ð¦¨Oпрацює :)?
Аднан

@Adnan: Блискуче! Я спробував придумати спосіб зробити це за допомогою 3 *, але я ніколи навіть не замислювався, €Ðхоча раніше я використовував €D: P
Emigna

4

JavaScript (ES6), 40 33 байт

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

Повертається, NaNколи ви отримуєте порожній список.


Ви можете відрізати ще 2 символи, якщо перенести множення на з'єднання такv=>eval(v.join`*3+`+"*2")-v[0]
Grax32

@Grax - Приємно! Однак для порожнього масиву це вже не буде хибним.
Арнольд

Завжди чогось немає?
Grax32

@Grax - Ні. Перший тестовий випадок - це порожній масив.
Арнольд

4

R, 75 70 52 34 33 31 байт

Підсумуйте три рази і відніміть перший і останній елемент

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

Редагувати. Збережено 3 зайвих байти завдяки @rturnbull


3

Скала, 47 байт

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

Попередньо додає та додає 0, потім використовує розсувне вікно розміром 3 для підсумовування сусідів та обчислює загальну суму


3

Java 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 Я його
змінюю

Класно. Ви можете floatdouble
пограти

Чи можу я використовувати його замість .... Double має вдвічі більшу точність поплавця.
Numberknot

1
чому б не intс?
sidgate

3

Математика, 34 32 29 байт

Отримавши трохи натхнення, Лінн охайний відповідь Python ...

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

або

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

або

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

На жаль, у Mathematica такий підхід не такий зручний, як у Python, оскільки немає короткого та безпечного способу відкинути перший та останній елемент списку, який може бути порожнім.


2
+1 для навчання менеCheck
Грег Мартін

2

MATLAB, 31 28 26 байт

3 байти збережено завдяки @Luis

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

Це створює анонімну функцію ans, названу так:ans([1, 2, 3, 4, 5])

Щоб надати демонстрацію в Інтернеті (яка використовує Octave), мені довелося використовувати 'same'замість's' останнього вводу даніconv

Демонстрація в Інтернеті

Пояснення

Ми виконуємо convolution ( conv) з 1 x 3ядром усіх 1-х (створений складанням масиву 1:3і порівнянням з нулем >0) і зберігаємо розмір оригіналу, вказуючи третій вхід як 'same'або в MATLAB, ми можемо просто скоротити це до 's'. Потім ми застосовуємо суму до результату.


Можливо, ви можете скоротити до's'
Луїс Мендо

1
@LuisMendo О, гарний дзвінок! MATLAB дозволяє це, але Octave не (звичайно)
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

Мозок-Флак , 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, віднімаємо кінцеві елементи. Barfs видає вражаючу помилку для порожнього введення, а потім виплює 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ಠ_ಠ Який виняток!
Кейд

2

Рубі, 35 33 31 байт

Натхненний рішенням Лінн:

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

The to_aСегмент там обробляти порожній масив.

EDIT: Завдяки m-chrzan та hiscrat.


Круглі дужки навколо не потрібні :+.
m-chrzan

[*(a*3)[1..-2]]робить .to_aна два менших байти.
гістократ

Можливо, ви хочете дати Рубі 2.4.0. Він поставляється з Array#sum.
Мартін Ендер

2

Perl 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 рази, крім першого та останнього числа (додається двічі). Тому я повертаю 3-кратну суму, мінус перше і останнє число.


1

> <> , 25 (+3 за  -v) = 28 байт

Бере вхід із стека за допомогою  -vта передбачає, що stdin порожній, спираючись на нього, щоб надати -1значення.

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

1

C # з LINQ, 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

Гло , 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-Basic, 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. Я ще не встановив реліз попереднього перегляду, щоб перевірити, чи можна просто включити це рішення.
Мартін Ендер




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

Haskell, 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.