Substring Sum Set

26

pengantar

Mari kita amati array ini: [3, 2, 4, 1, 1, 5, 1, 2].

Setiap elemen menampilkan panjang substring yang harus disimpulkan. Mari kita lihat elemen pertama dari array di atas:

[3, 2, 4, 1, 1, 5, 1, 2]
 ^

Elemen pada indeks pertama adalah 3 , jadi kami sekarang mengambil substring dengan panjang tiga dengan indeks yang sama dengan posisi awal:

[3, 2, 4]

Ketika diringkas, ini menghasilkan 9 , jadi elemen pertama dari set jumlah substring adalah 9.

Kami melakukan ini untuk semua elemen dalam array:

3 -> [3, 2, 4]
2 -> [2, 4]
4 -> [4, 1, 1, 5]
1 -> [1]
1 -> [1]
5 -> [5, 1, 2]
1 -> [1]
2 -> [2]

Anda dapat melihat bahwa angka 5 adalah kasus yang aneh. Angka itu melebihi panjang array:

[3, 2, 4, 1, 1, 5, 1, 2]
                ^  ^  ^  ^  ^

Kami akan mengabaikan semua yang melebihi array, jadi kami gunakan saja [5, 1, 2].

Langkah terakhir adalah merangkum semuanya:

[3, 2, 4]     -> 9
[2, 4]        -> 6
[4, 1, 1, 5]  -> 11
[1]           -> 1
[1]           -> 1
[5, 1, 2]     -> 8
[1]           -> 1
[2]           -> 2

Dan itu adalah array yang perlu di-output:

[9, 6, 11, 1, 1, 8, 1, 2]

Tugas

Diberikan array yang tidak kosong dengan bilangan bulat positif (bukan nol), mengeluarkan himpunan jumlah substring . Ini adalah , jadi pengiriman dengan jumlah byte terkecil menang!

Uji kasus

[1, 2, 3, 4, 5] -> [1, 5, 12, 9, 5]
[3, 3, 3, 3, 3, 3, 3, 3] -> [9, 9, 9, 9, 9, 9, 6, 3]
[5, 1, 2, 4, 1] -> [13, 1, 6, 5, 1]
[1] -> [1]
Adnan
sumber
Saya pikir maksud Anda "sub-daftar", bukan "substring". Tidak ada ikatan.
mbomb007
4
@ mbomb007 Saya pikir substring memiliki arti yang sama di sini seperti pada masalah substring umum terpanjang, yaitu, sebuah susunan yang unsur-unsurnya berdekatan. Selain tipe data, string hanyalah urutan elemen elemen alfabet yang terbatas (dalam hal ini, bilangan bulat positif).
Dennis

Jawaban:

15

Jelly , 6 byte

ṫJḣ"ḅ1

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ṫJḣ"ḅ1  Main link. Argument: A (array)

 J      Index; yield the 1-based indices of A.
ṫ       Tail; map k to the postfix of A that begins with the k-th element.
  ḣ"    Vectorized head; for each k in A, truncate the corr. postfix to length k.
    ḅ1  Convert the resulting slices from base 1 to integer.
Dennis
sumber
11

Python, 40 byte

f=lambda x:x and[sum(x[:x[0]])]+f(x[1:])

Uji di Ideone .

Dennis
sumber
Saya pikir akan ada solusi rekursif golf, tetapi Anda mengalahkan saya untuk itu.
El'endia Starman
11

Excel, 21 byte

=SUM(OFFSET(A1,,,A1))

Buka spreadsheet baru, masukkan nilai tes di kolom A. Masukkan rumus di B1 dan klik dua kali gagang sel untuk naik rentang.

Joffan
sumber
Saya akan memberi Anda upvote kedua untuk mengajari saya tentang trik klik dua kali itu jika saya bisa.
Neil
Meskipun berfungsi, ini sedikit curang karena eksekusi memerlukan input manual.
user3819867
3
@ user3819867 tidak lebih signifikan dari kebanyakan eksekusi program, saya berpendapat. Mungkin akan lebih sebanding jika Anda menyimpan spreadsheet hanya berisi rumus di B1 - lalu buka, tambahkan data ke kolom A, dan klik dua kali pegangan pada B1 untuk mengeksekusi. YMMV tentu saja.
Joffan
7

Python 3, 47 byte

lambda X:[sum(X[i:i+k])for i,k in enumerate(X)]

Implementasi yang cukup mudah. Perilaku default Python untuk irisan yang melewati akhir daftar sangat nyaman di sini.

El'endia Starman
sumber
5

Haskell, 34 , 33 byte

f l@(x:y)=sum(take x l):f y
f x=x

Satu byte disimpan oleh nimi.

Michael Klein
sumber
4

JavaScript ES6, 50 byte

a=>a.map((e,i)=>a.slice(i,i+e).reduce((a,b)=>a+b))

Cukup jelas. Itu mapatas setiap elemen dalam array, mendapatkan slicedari index melalui indeks ditambah enilai lement, dan reducedengan menambahkan.

f=
  a=>a.map((e,i)=>a.slice(i,i+e).reduce((a,b)=>a+b))

;[
  [3, 2, 4, 1, 1, 5, 1, 2],
  [1, 2, 3, 4, 5],
  [3, 3, 3, 3, 3, 3, 3, 3,],
  [5, 1, 2, 4, 1],
  [1]
].forEach(function(test){
  document.getElementById('p').textContent += test + ' => ' + f(test) + '\n';
});
<pre id="p"></pre>

NinjaBearMonkey
sumber
4

J, 11 byte

+/@{."_1]\.

Pemakaian

   f =: +/@{."_1]\.
   f 3 2 4 1 1 5 1 2
9 6 11 1 1 8 1 2
   f 1 2 3 4 5
1 5 12 9 5

Penjelasan

+/@{."_1]\.  Input: A
        ]\.  Get each suffix of A from longest to shortest
   {."_1     For each value in A, take that many values from its corresponding suffix
+/@          Sum that group of values taken from that suffix
             Return the sums
mil
sumber
4

JavaScript (ES6), 45

reduce dipukuli lagi!

a=>a.map((v,i)=>eval(a.slice(i,v+i).join`+`))

F=
a=>a.map((v,i)=>eval(a.slice(i,v+i).join`+`))

;[[3, 2, 4, 1, 1, 5, 1, 2],
  [1, 2, 3, 4, 5],
  [3, 3, 3, 3, 3, 3, 3, 3,],
  [5, 1, 2, 4, 1],
  [1]].forEach(t=>console.log(t+' -> '+F(t)))

edc65
sumber
1
Sejauh yang saya tahu, Anda dapat menghapus f=, sama seperti dalam jawaban ini .
LarsW
@ LarsW benar, f=sudah tidak dihitung dalam 45 byte
edc65
3

Retina , 38 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

\d+
$*
M!&`\b1(1)*(?<-1>,1+)*
M%`1
¶
,

Input dan output adalah daftar yang dipisahkan koma.

Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)

Martin Ender
sumber
3

Mathematica 60 55 byte

Tr@Take[#,UpTo@#&@@#]&/@Drop[#,t-1]~Table~{t,Length@#}&

misalnya

f = %; f /@ {{1, 2, 3, 4, 5}, {3, 3, 3, 3, 3, 3, 3, 3}, {5, 1, 2, 4, 1}, {1}}

(*    {{1, 5, 12, 9, 5}, {9, 9, 9, 9, 9, 9, 6, 3}, {13, 1, 6, 5, 1}, {1}}    *)

Terima kasih @MartinEnder untuk mencukur 5 byte :)

martin
sumber
1
Berikut adalah ide untuk menghindari tabel: #+Tr@Take[x=Rest@x,UpTo[#-1]]&/@(x=#)&Masih tidak yakin itu optimal tetapi menghemat 17 byte.
Martin Ender
3

05AB1E, 11 8 byte

[D¬£Oˆ¦Ž

Penjelasan

[         # infinite loop
 D        # duplicate current list
  ¬       # get head of list
   £      # get that many elements from list
    O     # sum
     ˆ    # add to global array
      ¦   # remove first element of list
       Ž  # break if stack is empty
          # implicitly push and print global array

Cobalah online

Emigna
sumber
2

Erlang, 69 byte

f(A)->put(1,1),L=lists,[L:sum(L:sublist(A,put(1,get(1)+1),X))||X<-A].

Fungsi tingkat tinggi Erlang untuk daftar tidak menerima indeks elemen saat ini. Ini menggunakan kamus proses untuk mengatur indeks elemen saat ini.

cPu1
sumber
2

Pyke, 12 7 byte

FKo>i<s

Coba di sini!

        - o = 0
F       - for i in input:
  o     -    o+=1
   >    -    input[o:]
    i<  -   ^[:i]
      s -  sum(^)
Biru
sumber
2

VBA, 160 byte

Function e(g())
Dim h()
k=LBound(g)
l=UBound(g)
ReDim h(k To l)
On Error Resume Next
For i=k To l
For j=i To i+g(i)-1
h(i)=h(i)+g(j)
Next
Next
e=h
End Function
pengguna3819867
sumber
2

Pyth, 6 byte

ms<~tQ

Suite uji

Ini adalah solusi yang berbeda dari yang lain sejauh ini. Itu loop atas input, mengiris menjumlahkan nilai awal, kemudian menghapus elemen pertama dari input yang disimpan, dan ulangi.

Penjelasan:

ms<~tQ
ms<~tQdQ    Implicit variable introduction
            Implicit: Q = eval(input())
m      Q    Map d over the input, Q
  <  Qd     Take the first d elements of Q
 s          Sum them
   ~tQ      Afterwards, set Q to the tail of Q, removing the first element.
isaacg
sumber
1

F #, 84 82 byte

let f(A:int[])=[for i in 0..A.Length-1->Seq.skip i A|>Seq.truncate A.[i]|>Seq.sum]
asibahi
sumber
1

JavaScript (ES6) - 79 Bytes

Solusi rekursif yang tidak menggunakan metode Array:

f=([a,...t],n)=>a&&n?a+f(t,n-1):0;g=([a,...t],r=[])=>a?g(t,[...r,a+f(t,a-1)]):r

Pengujian:

f=([a,...t],n)=>a&&n?a+f(t,n-1):0;
g=([a,...t],r=[])=>a?g(t,[...r,a+f(t,a-1)]):r;

[
  [3, 2, 4, 1, 1, 5, 1, 2],
  [1, 2, 3, 4, 5],
  [3, 3, 3, 3, 3, 3, 3, 3,],
  [5, 1, 2, 4, 1],
  [1]
].forEach(a=>console.log(''+g(a)));

MT0
sumber
1

C #, 89 byte

int[]s(List<int>a)=>a.Select((n,i)=>a.GetRange(i,Math.Min(n,a.Count-i)).Sum()).ToArray();

cukup lurus ke depan

ide perbaikan dihargai

downrep_nation
sumber
1

Brachylog , 27 byte

.v|h~l(A:Tc?;A?)b:0&~b.h~+A

Cobalah online! atau verifikasi semua kasus uji .

Penjelasan

  .v           Input = Output = []
|            Or
  h~l          A is a list, its length is the value of the first element of the Input
  (
    A:Tc?        The concatenation of A with another list T results in the Input
  ;            Or
    A?           A = Input
  )
  b:0&         Call recursively on Input minus the first element
  ~b.          Output is the output of that call with an extra element at the beginning
  h~+A         That extra element is the sum of the elements of A
Fatalisasi
sumber
1

Dyalog APL, 15 byte

{+/¨⍵↑∘⌽¨⌽,\⌽⍵}

atau

{⌽+/¨(-↑¨,\)⌽⍵}
lstefano
sumber
1

Program PHP, 72 Bytes

<?foreach($a=$_GET[a]as$i=>$v)echo array_sum(array_slice($a,$i,$v)),"
";

telepon dengan php-cgi -f <filename> 'a[]=3&a[]=2&a[]=4...

+11 sebagai fungsi:

function f($a){foreach($a as$i=>$v)$r[]=array_sum(array_slice($a,$i,$v));return$r;}

+9 tanpa bawaan:

function p($a){foreach($c=$r=$a as$i=>$v)for($k=$i;$k--;)if(--$a[$k]>0)$r[$k]+=$v;return$r;}

($ c menyimpan nilai asli, $ a menghitung mundur untuk setiap indeks, $ r mendapatkan jumlah)

-3 sebagai program:

<?foreach($a=$r=$c=$_GET[a]as$i=>$v)for($k=$i;$k--;)if(--$c[$k]>0)$r[$k]+=$v;print_r($r);
Titus
sumber
1

q (37 byte)

{sum each(til[count x],'x)sublist\:x}

Contoh:

q){sum each(til[count x],'x)sublist\:x}3 2 4 1 1 5 1 2
9 6 11 1 1 8 1 2
skeevey
sumber
1

Matricks , 25 byte

Yay, akhirnya tantangan aku tidak butuh fitur baru!

md{z:l-g:c;+c;q:c;};:1:l;

Jalankan dengan: python matricks.py substring.txt [[<input>]] 0

Penjelasan:

m                  :1:l;   #loop over entire input
                           #set each value to...
 d{               }        #the sum of...
   z:l-g:c:+c;q:c;         #the input cropped to
                           #the length of the value in the cell
Biru
sumber
1

Javascript (menggunakan Perpustakaan Eksternal) (66 byte)

n=>_.From(n).Select((v,i)=>_.From(n).Slice(i,i+v).Sum()).ToArray()

Tautan ke lib: https://github.com/mvegh1/Enumerable

Penjelasan kode: _.Dari memuat array input ke perpustakaan, yang pada dasarnya adalah LINQ untuk js. Kemudian setiap item dalam array dipetakan sesuai dengan predikat berikut: Ambil input, dan potong dari indeks item saat ini dan ambil indeks itu ditambah nilai item saat ini. Kemudian jumlahkan urutan berikutnya. Konversi hasilnya ke array JS asli dan kembalikan

masukkan deskripsi gambar di sini

applejacks01
sumber
Hapus var dari variabel, Anda tidak perlu itu dalam golf. Anda juga dapat mengubah .forEachke .mapmana biaya lebih sedikit byte.
charredgrass
Oh ya, kau benar tentang var. Terima kasih! Saya akan membahas jawaban ini lagi besok. Sepertinya JS asli (es6) membunuh solusi saya lol
applejacks01
Panggilan bagus untuk menghapus var. Saya juga menyadari solusi lain yang mengurangi jumlah byte banyak dan juga lebih intuitif
applejacks01
1

Clojure, 63 byte

(defn f[[b & r]](concat[(apply + b(take(dec b)r))](if r(f r))))

Menggunakan pencocokan pola untuk menguraikan argumen input menjadi argumen pertama dan selanjutnya.

NikoNyrh
sumber
1

MATL , 17 14 13 byte

fGy+!-R0<G*!s

Penjelasan

Cobalah online! Atau verifikasi semua kasus uji (kode dimodifikasi untuk menangani beberapa input).

f     % Take input implicitly. Indices of nonzero elements: this gives [1 2 ... n]
      % where n is input size
G     % Push input again
y     % Push a copy of [1 2 ... n]
+     % Add. Gives [a+1 b+2...] where [a b...] is the input
!     % Transpose into a column vector
-     % Subtraction with broadcast. Gives 2D array
R     % Keep upper triangular part, making the rest of entries 0
0<    % True for negative entries. Each row corresponds to a substring sum.
      % For each row, this gives true for the entries of the input that make up
      % that substring sum. Each row is thus a mask to select entries of the input
G     % Push input again
*     % Multiply with broadcast. This multiplies the input times each row
!s    % Sum of each row. Implicitly display
Luis Mendo
sumber
0

C #, 94 byte

Console.Write(String.Join(",",a.Select((v,i)=>a.Skip(i).Take(v).Sum().ToString()).ToArray()));

Di mana a adalah int [] yang mewakili input yang harus dipecahkan.

supermeerkat
sumber
Anda tidak boleh menganggap variabel sudah ditentukan sebelumnya
downrep_nation
Variabel a adalah input yang harus dipecahkan.
supermeerkat