ผลรวมของเพื่อนบ้าน


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 การเพิ่มจะกระทำโดยการใช้วิธีการ convolution มันจะสร้างผลลัพธ์บางส่วนที่คุณอ้างถึง แต่มีเวอร์ชันของการโน้มน้าวใจที่หลีกเลี่ยงพวกเขาเพราะมันจะสร้างอาร์เรย์เอาต์พุตที่มีเพียงรายการจำนวนมากเท่าอินพุต นี่ยังใช้ในคำตอบของ Suever
Luis Mendo

19

Python ขนาด 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

Python 2, 28 ไบต์

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

เพียง 3 เท่าของผลรวมและลบหนึ่งในองค์ประกอบท้ายแต่ละอัน


ฉันยังพบโซลูชัน 25 ไบต์ที่เรียบร้อย
Lynn

1
ที่จริงแล้วถ้าaเป็นรายการเปล่า (กรณีทดสอบครั้งแรก) คืออะไร? a[0]จะโยนIndexErrorใช่มั้ย
ลินน์

6

05AB1E , 11 5 ไบต์

บันทึกแล้ว 6 ไบต์ขอบคุณ Adnan

€Ð¦¨O

ลองออนไลน์!

คำอธิบาย

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

ไม่€Ð¦¨Oทำงาน :)?
Adnan

@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 - ดีมาก! อย่างไรก็ตามมันจะไม่เป็นเท็จอีกต่อไปสำหรับอาเรย์ที่ว่างเปล่า
Arnauld

มีบางสิ่งที่ไม่ได้อยู่ที่นั่นเสมอ?
Grax32

@Grax - ไม่กรณีทดสอบแรกคืออาร์เรย์ว่าง
Arnauld

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

@Geobits ฉันเปลี่ยน .....
Numberknot

เย็น. คุณสามารถกอล์ฟมันบางมากขึ้นโดยใช้floatแทนdouble:)
Geobits

ฉันสามารถใช้มันแทน .... Double มีความแม่นยำของการลอยสองเท่า
Numberknot

1
ทำไมไม่ints?
sidgate

3

Mathematica, 34 32 29 ไบต์

การสร้างแรงบันดาลใจบางส่วนของลินน์เรียบร้อยคำตอบหลาม ...

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

หรือ

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

หรือ

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

น่าเสียดายที่วิธีการนี้ไม่ค่อยสะดวกใน Mathematica เหมือนกับใน Python เนื่องจากไม่มีวิธีที่สั้นและปลอดภัยในการทิ้งองค์ประกอบแรกและสุดท้ายของรายการที่อาจว่างเปล่า


2
+1 สำหรับสอนฉันCheck
Greg Martin

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

การสาธิตออนไลน์

คำอธิบาย

เราทำการแปลง ( conv) ด้วย1 x 3เคอร์เนลของ 1 ทั้งหมด (สร้างโดยสร้างอาร์เรย์1:3แล้วเปรียบเทียบกับศูนย์>0 ) และรักษาขนาดของต้นฉบับโดยการระบุอินพุตที่สามเป็น'same'หรือใน MATLAB เราสามารถย่อให้สั้นลง's'ได้ จากนั้นเราใช้ผลรวมกับผลลัพธ์


คุณสามารถย่อให้สั้นลง's'
Luis Mendo

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

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

Ruby, 35 33 31 ไบต์

แรงบันดาลใจจากโซลูชันของ Lynn:

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

to_aส่วนจะมีการจัดการกับอาร์เรย์ที่ว่างเปล่า

แก้ไข: ขอบคุณ m-chrzan และ histocrat


:+คุณไม่จำเป็นต้องวงเล็บรอบ
m-chrzan

[*(a*3)[1..-2]]ทำ.to_aในสองไบต์น้อยกว่า
ฮิสโทแก

คุณอาจต้องการให้ Ruby 2.4.0 a go Array#sumมันมาพร้อมกับ
Martin Ender

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

Ungolfed:

(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

Elixir , 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

ฉันเชื่อว่าฉันทามติใน meta กล่าวว่าAnsเป็นรูปแบบการป้อนข้อมูลที่ไม่ถูกต้อง
Conor O'Brien

คุณสามารถใช้กับรายการไม่ต้องกังวล ผ่านมันอย่างนั้น{1,3,5,7,2,6}:prgmNEIGHBOR
Timtech

นั่นยังคงAnsเป็นอินพุต
Conor O'Brien

มันดูเหมือนว่าฉันแคร์? นั่นเป็นวิธีมาตรฐานในการผ่านอินพุตใน TI-Basic
Timtech

เท่าที่ฉันเห็นด้วยกับคุณนั่นไม่ได้ทำให้คำตอบถูกต้องอีกต่อไป
Conor O'Brien

1

Ruby, 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

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หากมีพารามิเตอร์ไม่มีคำสั่งสุดท้ายจะกลายเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.