26
\$\begingroup\$

This should be a fairly simple challenge.

For an array of numbers, generate an array where for every element all neighbouring elements are added to itself, and return the sum of that array.

Here is the transformation which occurs on the input array [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

Test cases

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

Leaderboard

var QUESTION_ID=96188,OVERRIDE_USER=41257;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>

\$\endgroup\$
5
  • 1
    \$\begingroup\$ Related. Related. Related. \$\endgroup\$ Oct 14, 2016 at 12:42
  • \$\begingroup\$ Do we need to support floating point numbers or only integers? \$\endgroup\$
    – corvus_192
    Oct 14, 2016 at 12:55
  • \$\begingroup\$ @corvus_192 The test cases include non-integers. \$\endgroup\$
    – Geobits
    Oct 14, 2016 at 13:10
  • \$\begingroup\$ @Geobits I didn't notice that, I'll edit my answer. \$\endgroup\$
    – corvus_192
    Oct 14, 2016 at 13:12
  • 2
    \$\begingroup\$ You should do this with 2 dimensional arrays next. \$\endgroup\$ Oct 14, 2016 at 18:23

44 Answers 44

1
2
1
\$\begingroup\$

Haskell, 25 bytes

From fastest

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

via prettiest

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

down to ugliest but shortest

let y x=sum$init x++x++tail x in y[1..5]     
--  1234567890123456789012345
\$\endgroup\$
1
\$\begingroup\$

GameMaker Language, 69 bytes

a=argument_count;for(i=0;i<a;)s+=argument[i++]*(3-(i=1||i=a))return s
\$\endgroup\$
1
\$\begingroup\$

Actually, 9 bytes

Golfing suggestions welcome. Try it online!

3@VdXpXΣΣ

Ungolfing

       Implicit input a.
3@V    Push all slices of a of length 1 <= n <= 3.
dXpX   Get rid of the first and last slices since they're length 1 lists.
Σ      Summing a 2D array essentially flattens into a 1D array.
Σ      Push sum(a).
       Implicit return.
\$\endgroup\$
1
\$\begingroup\$

Vim, 21 bytes

yGPP<C-V>GI+<Esc>DgvJD^C<C-R>=<C-R>"<CR>

Input is one number per line. Same algorithm as other entries (triplicate array, remove first and last items, sum).

\$\endgroup\$
1
\$\begingroup\$

Batch, 67 bytes

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

If there are no parameters, the last command turns into 0 * 3 - -0.

\$\endgroup\$
1
\$\begingroup\$

Pyth, 10 7 5 bytes

sPt*3

Saved 1 byte thanks to implicit input, and 1 byte thanks to the P function (replaces t_ in the previous solution)


Previous versions:

st_t*3Q

Concatenates the array 3 times, removes first and last elements, and sums it up

-*3sQ+eQhQ

The final sum is 3 times the sum of the elements - first element - last element.
That's exactly what this code does :)

Try it here!

\$\endgroup\$
1
\$\begingroup\$

C++14, 64 59 bytes

As unnamed lambda

[](auto c,int&r){r=-c[0];for(auto x:c)r+=3*x;r-=c.back();}

Initializes counter with -c[0], then sums all elements times 3 and subtracts the last element. This gives 3*sum(c)-c.first-c.last which is the direct formula for this problem.

Takes any container that supports .back(). If you insinst on using plain old arrays (örglöärks) then substitute c.back() with std::end(c)[-1] for +7 bytes.

Usage:

auto n=[](auto c,int&r){r=-c[0];for(auto x:c)r+=3*x;r-=c.back();};

std::vector<int> v{1,2,3,4,5};
//or// std::array<int,5> v{1,2,3,4,5};
//or// int v[]={1,2,3,4,5}; //with std::end(c)[-1]
int r;
n(v,r);
std::cout << r << std::endl;
\$\endgroup\$
1
+100
\$\begingroup\$

APL (Dyalog Unicode), 10 bytes

+/¯1↓1↓3/⊢

Try it online!

Explanation

Use the same observation as a previous answer that the result is the sum of 3x the elements minus the first and last.

+/¯1↓1↓3/⊢ ⍝ Function train. Below explanation uses a sample input of 1 2 3
       3/⊢ ⍝ Repeats (/) each element of the right hand side (⊢) three times - 1 1 1 2 2 2 3 3 3
     1↓    ⍝ Drops (↓) the first item of the array -> 1 1 2 2 2 3 3 3
  ¯1↓      ⍝ Drops (↓) the last item (¯1) of the array -> 1 1 2 2 2 3 3
+/         ⍝ Sum over the array -> 14
\$\endgroup\$
1
\$\begingroup\$

Thunno 2 S, 4 bytes

€Ðḣṫ

Try it online!

Port of Emigna's 05AB1E answer.

Explanation

€Ðḣṫ  # Implicit input
€     # To each item in the input:
 Ð    #  Triplicate in-place
  ḣ   # Remove the first item
   ṫ  # Remove the last item
      # Sum the resulting list
      # Implicit output
\$\endgroup\$
1
\$\begingroup\$

BQN, 7 bytes

+´»+«+⊢

Try it at BQN online!

Explanation

+´»+«+⊢
      ⊢  The input array
     +   Add
    «    The input array shifted left, with the empty spot filled with 0
   +     Add
  »      The input array shifted right, with the empty spot filled with 0
+´       Fold on addition (sum)
\$\endgroup\$
1
\$\begingroup\$

Swift 5.10, 53 bytes

let f={$0==[] ?0.0:$0.reduce(0,+)*3.0-$0[0]-$0.last!}
\$\endgroup\$
0
\$\begingroup\$

C#, 49 45 bytes

(27 if you don't count the using statement)

using System.Linq;v=>v.Sum()*3-v[0]-v.Last();
\$\endgroup\$
1
  • \$\begingroup\$ Sum()*3 saves 4 bytes \$\endgroup\$ Oct 15, 2016 at 7:00
0
\$\begingroup\$

Uiua SBCS, 9 bytes

/+↘1↘¯1▽3

Try it!

3 of each item, remove first and last, sum.

\$\endgroup\$
-1
\$\begingroup\$

Perl 5 -MList::Util=sum -ap, 24 bytes

$_=3*(sum@F)-sum@F[0,-1]

Try it online!

\$\endgroup\$
1
2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.