Komşuların toplamı


22

Bu oldukça basit bir mücadele olmalı.

Bir sayılar dizisi için, her eleman için tüm komşu öğelerin kendisine eklendiği bir dizi oluşturun ve bu dizinin toplamını döndürün.

Giriş dizisinde gerçekleşen dönüşüm [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 durumları

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

Liderler Sıralaması



Kayan nokta sayılarını mı yoksa yalnızca tamsayıları mı desteklememiz gerekiyor?
corvus_192

@ corvus_192 Test durumlarında tamsayı olmayanlar var.
Geobits

@Geobits Fark etmedim, cevabımı düzenleyeceğim.
corvus_192 14:16

2
Bunu daha sonra 2 boyutlu dizilerle yapmalısınız.
Bradley Uffner

Yanıtlar:


8

MATL , 5 bayt

7BZ+s

Çevrimiçi deneyin!

açıklama

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
Çok zekisiniz kullanımı 7Boraya[1 1 1]
Suever

Ben Matl bilmiyorum ama merak ediyorum: listesi için [a,b,c,...], nasıl alabilirim a+bama önlemek alma a?
Christian Sievers

1
@Hristiyan Ekleme bir evrişim operasyonu ile yapılır. Bahsettiğiniz kısmi sonuçları üretecektir, ancak bunlardan kaçınan bir evrişim sürümü var, çünkü yalnızca girdi kadar girdi içeren bir çıktı dizisi üretiyor. Bu, Suever'in cevabında da kullanılır
Luis Mendo,

19

Python, 25 bayt

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

Bunun neden işe yaradığını görmek için OP'deki genişlemeyi 45 derece döndürün:

             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 bayt

Adnan sayesinde 6 bayt kaydedildi .

€Ð¦¨O

Çevrimiçi deneyin!

açıklama

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

Çalışıyor mu €Ð¦¨O:)?
Adnan,

@Adnan: Mükemmel! 3 * ile yapmanın bir yolunu düşünmeye çalıştım, ama €Ðdaha önce kullanmış €D
olmama

4

JavaScript (ES6), 40 33 bayt

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

İade NaNboş bir liste verildiğinde.


Çarpma işlemini bu şekilde birleştirirseniz, 2 karakter daha v=>eval(v.join`*3+`+"*2")-v[0]
kesebilirsiniz

@Grax - Güzel! Ancak, boş dizi için artık yanlış olmaz.
Arnauld,

Her zaman orada olmayan bir şey var mı?
Grax32

@Grax - Hayır. İlk test durumu boş bir dizidir.
Arnauld,

4

R, 75 70 52 34 33 31 bayt

Üç kez topla ve ilk ve son elemanı çıkar

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

Düzenleme: @rturnbull sayesinde 3 ekstra bayt kaydedildi


3

Scala, 47 bayt

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

Bir 0 ekler ve ekler, ardından komşuları toplamak için 3 boyutlu kayar bir pencere kullanır ve toplam toplamı hesaplar


3

Java 7, 72 Bayt

float c(float[]a){float s=0,l=0;for(float i:a)s+=l=i;return 3*s-l-a[0];}

Dizinin ilk ve son öğelerini belirten fazladan girdi eklemek zorluğun özü içerisinde değil.
Geobits

@Geobits Değiştiriyorum .....
Sayı

Güzel. Bunun floatyerine biraz daha kullanarak golf double
oynayabilirsiniz

Bunun yerine kullanabilir miyim .... Çift 2 kayan şamandıra hassasiyetine sahiptir.
Sayı

1
neden ints değil ?
saat

3

Mathematica, 34 32 29 bayt

Biraz ilham alarak Lynn'in temiz Python cevabı ...

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

veya

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

veya

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

Maalesef, bu yaklaşım Pyhemat’te olduğu kadar Mathematica’da da pek uygun değil çünkü boş bir listenin ilk ve son öğesini atmanın kısa ve güvenli bir yolu yok.


2
Bana öğretmek için +1Check
Greg Martin,

2

MATLAB, 31 28 26 bayt

@Luis sayesinde 3 bayt kaydedildi

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

Bu, adlandırılabilir adında bir adsız işlev oluşturur ans:ans([1, 2, 3, 4, 5])

Çevrimiçi bir demo sağlamak için (Octave kullanan), son giriş 'same'yerine kullanmak zorunda kaldım 's'.conv

Çevrimiçi Demo

açıklama

Convolution ( conv) işlevini 1 x 3(1) bir dizi oluşturarak (bir dizi yaparak 1:3ve sonra sıfıra göre karşılaştırarak >0) gerçekleştiririz ve üçüncü girdiyi 'same'MATLAB olarak ya da kısaltabileceğimizi belirterek orijinalin boyutunu koruruz 's'. Sonra toplamı sonuca uygularız.


Muhtemelen kısaltabilirsiniz's'
Luis Mendo

1
@LuisMendo Ah iyi çağrı! MATLAB izin veriyor ama Octave (elbette)
yapmıyor


2

J, 9 bayt

+/@,}.,}:

Çünkü [1, 2, 3, 4, 5]komşular

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

Sonra meblağların köşegenlerine bakın

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

Bu yüzden, yalnızca girişi kaldırılmış ve kuyruğunu kaldırılmış olan girişin toplamını bulmaya ihtiyacımız var.

kullanım

   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

açıklama

+/@,}.,}:  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

Güzel. Ve mutlu 6k +!
Conor O'Brien,

2

Brain-Flak , 68 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

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

Diğer cevaplara benzer şekilde, listeyi toplar, 3 ile çarpar, son elemanları çıkarır. Boş giriş için göz kamaştırıcı bir hata veriyor ve sonra tükürüyor 0, ancak STDERR varsayılan olarak yok sayıldığından bu sorun değil.

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

ParameterArgumentValidationErrorEmptyStringNotAllowedAn_ಠ Ne ​​istisna!
Kade

2

Ruby, 35 33 31 bayt

Lynn'in çözümünden ilham alan:

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

to_aKademeli bir boş dizi işlemek için vardır.

EDIT: m-chrzan ve histokrat sayesinde.


Etrafında parantez gerekmez :+.
m-chrzan

[*(a*3)[1..-2]]does .to_aiki daha az bayt.
histocrat

Ruby 2.4.0'ı bir denemek isteyebilirsiniz. İle geliyor Array#sum.
Martin Ender

2

Perl 6 , 25 bayt

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

Expanded:

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

Ölçek:

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 bayt

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

Bu şekilde koş:

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

açıklama

İlk ve son sayı haricinde (iki kez eklenir), her sayı 3 defa eklendiğinde zorluk azaltılabilir. Bu nedenle, toplamın 3 katı, eksi ilk ve son sayıyı döndürüyorum.


1

> <> , 25 (için for +3  -v) = 28 bayt

Yığından girdi alır ve  -vbir -1değer sağlamak için stdin'in boş olduğunu varsayar .

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

1

LINQ ile C #, 42 bayt

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

Ad System.Linqalanını gerektirir .


C #, 84 bayt

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 vakaları ile tam program:

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

Raket 48 bayt

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

Test yapmak:

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

Çıktı:

0
1
10
28
55
-14
1.4000000000000001
12338842

1

Gloo , 12 Bayt

Gloo'nun bir özelliği olması gerektiği gibi çalışmadığı için bunu acı verici bir şekilde yapmak zorunda kaldım.

__]:]:]:,,[+

Açıklama:

__                   // 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

İksir , 93 bayt

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

Yakalama işlecini kullanan adsız işlev.

Test vakaları ile tam program:

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'da çevrimiçi deneyin !


1

TI-Basic, 17 bayt

Listenin toplamının üç katı, eksi ilk ve son öğe.

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

Meta üzerinde uzlaşmanın bunun Ansgeçersiz bir girdi şekli olduğunu söylediğine inanıyorum .
Conor O'Brien,

Bir liste ile kullanabilirsiniz, endişelenmeyin. Gibi geçmek{1,3,5,7,2,6}:prgmNEIGHBOR
Timtech

Bu hala Ansgirdi olarak.
Conor O'Brien,

Umursuyorum gibi mi görünüyor? Bu, TI-Basic'te girişi geçmenin standart yoludur.
Timtech

Sizinle hemfikir olduğum kadarıyla, bu cevabı daha geçerli kılmaz.
Conor O'Brien,

1

Ruby, 41 bayt

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

Test vakaları ile tam program:

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'deki ilk girişimim.


Ruby 2.4.0'dan itibaren var Array#sum. Bu çözüme atılıp atılamayacağını test etmek için henüz önizleme sürümünü henüz kurmadım.
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 bayt

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

Kullanımı:

#include <iostream>
int main() {
    std::cout << f({1,2,1});
    return 0;
}

1

Haskell, 25 bayt

En hızlıdan

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

en güzel

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

en çirkin ama en kısa

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

1

Toplu iş, 67 bayt

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

Parametre yoksa, son komut dönüşür 0 * 3 - -0.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.