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]

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.

11

Python, 40 byte

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

Uji di Ideone .


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.


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.


5

Haskell, 34 , 33 byte

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

Satu byte disimpan oleh nimi.


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>


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

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


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


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


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



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.


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

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

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.


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]

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


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


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

1

Dyalog APL, 15 byte

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

atau

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

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

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

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

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


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.


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

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.


Anda tidak boleh menganggap variabel sudah ditentukan sebelumnya
downrep_nation

Variabel a adalah input yang harus dipecahkan.
supermeerkat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.