Substring Toplam Kümesi


26

Giriş

En bu diziyi gözlemlemek edelim: [3, 2, 4, 1, 1, 5, 1, 2].

Her eleman toplanması gereken alt tabakanın uzunluğunu gösterir. Yukarıdaki dizinin ilk elemanına bir göz atalım:

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

İlk dizindeki öğe 3'tür , bu yüzden şimdi başlangıç ​​konumu ile aynı dizine sahip üçlü bir alt dizgiyi alıyoruz:

[3, 2, 4]

İçine, bu sonuçlar özetlenebilir zaman , 9 , bu nedenle ilk elemanı alt dize toplamı grubu olduğu 9.

Bunu, dizideki tüm öğeler için yaparız:

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

5 rakamının biraz garip bir durum olduğunu görebilirsiniz. Bu sayı dizinin uzunluğunu aşıyor:

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

Diziyi geçen her şeyi görmezden geleceğiz, bu yüzden sadece kullanıyoruz [5, 1, 2].

Son adım her şeyi özetlemektir:

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

Ve bu çıkması gereken dizi:

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

Görev

Pozitif (sıfır olmayan) tamsayıları olan boş olmayan bir dizi göz önüne alındığında, alt toplamı ayarlanan çıktı . Bu , bu yüzden en küçük bayt sayısına sahip olan gönderim kazanıyor!

Test durumları

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

Sanırım "alt liste" demek, "alt dize" değil. İp yok.
mbomb007

4
@ mbomb007 Burada alt dizginin burada en uzun kullanılan alt dizgi probleminde olduğu gibi aynı anlama sahip olduğunu düşünüyorum, yani elemanları bitişik olan bir alt dizilim. Veri türleri bir yana, bir dize bir alfabe kümesinin elemanlarının sonlu bir sekansıdır (bu durumda, pozitif tamsayılar).
Dennis,

Yanıtlar:


15

Jöle , 6 bayt

ṫJḣ"ḅ1

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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

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

İdeone üzerinde test et .


Ben düşündüm bir golfier özyinelemeli çözüm olurdu, ama buna beni yendi.
El'endia Starman,

11

Excel, 21 bayt

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

Yeni bir e-tablo açın, test değerlerini A sütununa yerleştirin. B1'deki formülü girin ve aralık sürmek için hücre tutamacını çift tıklatın.


Yapabilirsem, bana çift tıklama hilesi hakkında bilgi verdiğin için ikinci bir oy verirdim.
Neil,

İşe yaradığı halde, yürütme manuel girdi gerektirdiğinden biraz hile yapmak yeterlidir.
user3819867

3
@ user3819867, program yürütmenin çoğundan çok daha fazla değil, savunuyorum. Belki de B1'deki formülü içeren bir elektronik tabloyu kaydederseniz, daha sonra açıp A sütununa veri ekleyip B1 üzerindeki tanıtıcıyı çift tıklatırsanız daha da karşılaştırılabilir. Elbette YMMV.
Joffan,

7

Python 3, 47 bayt

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

Oldukça basit bir uygulama. Python'un listenin sonundan geçen dilimler için varsayılan davranışı burada çok uygun oldu .


5

Haskell, 34 , 33 bayt

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

Bir bayt nimi tarafından kaydedildi.


4

JavaScript ES6, 50 bayt

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

Oldukça kendini açıklayıcı. Bu mapalma, dizideki her öğeyi bitti slicebundan iindeksi artı o aracılığıyla nDex eelemanının net değerinin ve reduceekleyerek ing.

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 bayt

+/@{."_1]\.

kullanım

   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

açıklama

+/@{."_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 tekrar dövülmüş!

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
Bildiğim kadarıyla f=, bu cevapta olduğu gibi , kaldırabilirsiniz .
LarsW

@LarsW sağ, f=zaten 45 byte sayılmaz
edc65

3

Retina , 38 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

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

Giriş ve çıkış virgülle ayrılmış listelerdir.

Çevrimiçi deneyin! (İlk satır satır besleme ile ayrılmış bir test takımı sağlar.)


3

Mathematica 60 55 bayt

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

Örneğin

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

5 byte tıraş için teşekkürler @MartinEnder :)


1
Tablodan kaçınmak için bir fikir: #+Tr@Take[x=Rest@x,UpTo[#-1]]&/@(x=#)&Yine de optimal olduğundan emin değil, ancak 17 byte kazandırıyor.
Martin Ender

3

05AB1E, 11 8 bayt

[D¬£Oˆ¦Ž

açıklama

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

Çevrimiçi deneyin



2

Erlang, 69 bayt

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

Erlang'ın listelerdeki üst düzey işlevleri, geçerli öğenin dizinini almıyor. Bu, geçerli öğenin dizinini ayarlamak için işlem sözlüğünü kullanır.


2

Pyke, 12 7 bayt

FKo>i<s

Burada dene!

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

2

VBA, 160 bayt

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 bayt

ms<~tQ

Test odası

Bu, şu ana kadar diğerlerinden farklı bir çözüm. Girdi üzerinde dönerek başlangıç ​​değerlerini toplayarak, daha sonra kaydedilen girişin ilk elemanını çıkararak tekrar eder.

Açıklama:

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 bayt

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 Bayt

Dizi yöntemlerinden herhangi birini kullanmayan özyinelemeli bir çözüm:

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

Test yapmak:

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 bayt

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

oldukça yalındır

iyileştirme fikirleri takdir edildi


1

Brachylog , 27 bayt

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

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

açıklama

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

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

veya

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

1

PHP programı, 72 Bayt

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

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

Bir fonksiyon olarak +11:

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

Yerleşik olmadan +9:

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

($ c orijinal değerleri tutar, $ a her indeks için geri sayılır, $ r toplamı alır)

Program olarak -3:

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

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

Örnek:

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 bayt

Yay, nihayet bir meydan okuma için yeni özelliklere ihtiyacım yok!

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

Çalıştır: python matricks.py substring.txt [[<input>]] 0

Açıklama:

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 (Harici Kitaplığı kullanarak)

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

Lib bağlantısı: https://github.com/mvegh1/Numerable

Kod açıklaması: _.From tarafından giriş dizisini js için temel olarak LINQ olan kütüphaneye yüklüyor. Ardından dizideki her öğe aşağıdaki yüklemeye göre eşlenir: Girdiyi alın ve geçerli öğe dizininden dilimleyin ve bu dizini ve geçerli öğenin değerini alın. Sonra bu sırayı toplayın. Sonucu yerel bir JS dizisine dönüştürün ve döndürün

görüntü tanımını buraya girin


var Değişkenleri kaldırın, golfde buna ihtiyacınız yok. Ayrıca değiştirebilir .forEachiçin .maphangi az bayt mal olur.
charredgrass

Evet, Var konusunda haklısın. Teşekkürler! Bu cevabı yarın tekrar geçeceğim. Yerli JS gibi görünüyor (es6) benim çözüm lol öldürür
applejacks01

Var kaldırma iyi çağrı. Ayrıca bayt sayısını çok azaltan ve aynı zamanda daha sezgisel olan başka bir çözüm daha gerçekleştirdim
applejacks01

1

Clojure, 63 bayt

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

Girdi argümanının ilkine ve argümanların geri kalanına ayrıştırılması için desen eşleştirme kullanır.


1

MATL , 17 14 13 bayt

fGy+!-R0<G*!s

açıklama

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın (birkaç girişi işlemek için kod değiştirildi)

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 bayt

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

Burada a, çözülecek girişi temsil eden bir int [] 'dir.


Bir değişkenin önceden tanımlanmış olduğunu varsaymanıza izin verilmez
downrep_nation

A değişkeni çözülecek girdidir.
supermeerkat
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.