Zestaw sum podciągów

26

Wprowadzenie

Zauważmy tej tablicy: [3, 2, 4, 1, 1, 5, 1, 2].

Każdy element wyświetla długość podciągu, który należy zsumować. Rzućmy okiem na pierwszy element powyższej tablicy:

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

Element przy pierwszym indeksie ma wartość 3 , więc bierzemy teraz podłańcuch o długości trzy z takim samym indeksem jak pozycja początkowa:

[3, 2, 4]

Po zsumowaniu daje to wynik 9 , więc pierwszym elementem zestawu sum podciągów jest 9.

Robimy to dla wszystkich elementów w tablicy:

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

Widać, że liczba 5 to trochę dziwny przypadek. Liczba ta przekracza długość tablicy:

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

Zignorujemy wszystko, co przekracza tablicę, więc po prostu używamy [5, 1, 2].

Ostatnim krokiem jest podsumowanie wszystkiego:

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

I to jest tablica, która musi zostać wyprowadzona:

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

Zadanie

Biorąc pod uwagę niepustą tablicę z dodatnimi (niezerowymi) liczbami całkowitymi, wypisz zestaw sum podciągów . To jest , więc wygrywanie z najmniejszą liczbą bajtów wygrywa!

Przypadki testowe

[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
źródło
Myślę, że masz na myśli „podlistę”, a nie „podłańcuch”. Nie ma żadnych zobowiązań.
mbomb007
4
@ mbomb007 Myślę, że podciąg ma tutaj takie samo znaczenie jak w najdłuższym wspólnym problemie z podciągiem, tj. podsekwencją, której elementy sąsiadują ze sobą. Poza typami danych ciąg znaków jest po prostu skończoną sekwencją elementów zestawu alfabetu (w tym przypadku dodatnich liczb całkowitych).
Dennis

Odpowiedzi:

15

Galaretka , 6 bajtów

ṫJḣ"ḅ1

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

ṫ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
źródło
11

Python, 40 bajtów

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

Przetestuj na Ideone .

Dennis
źródło
Pomyślałem, że będzie rekurencyjne rozwiązanie dla golfistów, ale pobiłeś mnie.
El'endia Starman
11

Excel, 21 bajtów

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

Otwórz nowy arkusz kalkulacyjny, umieść wartości testowe w kolumnie A. Wprowadź formułę w B1 i kliknij dwukrotnie uchwyt komórki, aby przejść do zakresu.

Joffan
źródło
Dałbym ci drugie głosowanie za nauczenie mnie tej sztuczki polegającej na podwójnym kliknięciu, gdybym mógł.
Neil
Chociaż działa, to trochę oszustwo, ponieważ wykonanie wymaga ręcznego wprowadzania.
user3819867,
3
@ user3819867 nie znacznie więcej niż w przypadku większości programów, argumentowałbym. Być może byłoby to jeszcze bardziej porównywalne, jeśli zapiszesz arkusz kalkulacyjny zawierający tylko formułę w B1 - następnie otwórz, dodaj dane do kolumny A i kliknij dwukrotnie uchwyt na B1, aby wykonać. Oczywiście YMMV.
Joffan
7

Python 3, 47 bajtów

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

Dość prosta implementacja. Bardzo wygodne było domyślne zachowanie Pythona w przypadku plasterków, które przekraczają koniec listy .

El'endia Starman
źródło
5

Haskell, 34 , 33 bajtów

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

Jeden bajt zapisany przez nich.

Michael Klein
źródło
4

JavaScript ES6, 50 bajtów

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

Dość oczywiste. Jest mapnad każdym elementem w tablicy, przechodząc sliceod tego iindeksu przez indeks plus ewartość tego lementu, i reducedodając.

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
źródło
4

J, 11 bajtów

+/@{."_1]\.

Stosowanie

   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

Wyjaśnienie

+/@{."_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
mile
źródło
4

JavaScript (ES6), 45

reduce pobity ponownie!

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
źródło
1
O ile mi wiadomo, możesz usunąć f=, tak jak w tej odpowiedzi .
LarsW,
@LarsW racja, f=nie jest już liczony w 45 bajtach
edc65,
3

Siatkówka , 38 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

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

Dane wejściowe i wyjściowe są listami oddzielonymi przecinkami.

Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).

Martin Ender
źródło
3

Mathematica 60 55 bajtów

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

na przykład

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

Dzięki @MartinEnder za zgolenie 5 bajtów :)

jaskółka oknówka
źródło
1
Oto pomysł na uniknięcie tabeli: #+Tr@Take[x=Rest@x,UpTo[#-1]]&/@(x=#)&wciąż nie jestem pewien, czy jest optymalny, ale oszczędza 17 bajtów.
Martin Ender
3

05AB1E, 11 8 bajtów

[D¬£Oˆ¦Ž

Wyjaśnienie

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

Wypróbuj online

Emigna
źródło
2

Erlang, 69 bajtów

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

Funkcje wyższego rzędu Erlanga dla list nie otrzymują indeksu bieżącego elementu. Korzysta ze słownika procesów, aby ustawić indeks bieżącego elementu.

cPu1
źródło
2

Pyke, 12 7 bajtów

FKo>i<s

Wypróbuj tutaj!

        - o = 0
F       - for i in input:
  o     -    o+=1
   >    -    input[o:]
    i<  -   ^[:i]
      s -  sum(^)
niebieski
źródło
2

VBA, 160 bajtów

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
użytkownik3819867
źródło
2

Pyth, 6 bajtów

ms<~tQ

Zestaw testowy

To inne rozwiązanie niż dotychczas. Zapętla dane wejściowe, kroi sumę wartości początkowych, a następnie usuwa pierwszy element z zapisanych danych wejściowych i powtarza.

Wyjaśnienie:

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
źródło
1

F #, 84 82 bajtów

let f(A:int[])=[for i in 0..A.Length-1->Seq.skip i A|>Seq.truncate A.[i]|>Seq.sum]
asibahi
źródło
1

JavaScript (ES6) - 79 bajtów

Rozwiązanie rekurencyjne, które nie korzysta z żadnej z metod 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

Testowanie:

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
źródło
1

C #, 89 bajtów

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

całkiem prosto

Doceniane pomysły na ulepszenia

downrep_nation
źródło
1

Brachylog , 27 bajtów

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

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Wyjaśnienie

  .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
Fatalizować
źródło
1

Dyalog APL, 15 bajtów

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

lub

{⌽+/¨(-↑¨,\)⌽⍵}
lstefano
źródło
1

Program PHP, 72 bajty

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

Zadzwoń z php-cgi -f <filename> 'a[]=3&a[]=2&a[]=4...

+11 jako funkcja:

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

+9 bez wbudowanych:

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

($ c zachowuje oryginalne wartości, $ a odlicza każdy indeks, $ r pobiera sumy)

-3 jako program:

<?foreach($a=$r=$c=$_GET[a]as$i=>$v)for($k=$i;$k--;)if(--$c[$k]>0)$r[$k]+=$v;print_r($r);
Tytus
źródło
1

q (37 bajtów)

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

Przykład:

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
źródło
1

Matricks , 25 bajtów

Tak, wreszcie wyzwanie, dla którego nie potrzebuję nowych funkcji!

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

Biegnij z: python matricks.py substring.txt [[<input>]] 0

Wyjaśnienie:

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
niebieski
źródło
1

JavaScript (przy użyciu zewnętrznej biblioteki) (66 bajtów)

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

Link do lib: https://github.com/mvegh1/Enumerable

Wyjaśnienie kodu: _.From ładuje tablicę wejściową do biblioteki, która jest w zasadzie LINQ dla js. Następnie każdy element w tablicy jest mapowany zgodnie z następującym predykatem: Weź dane wejściowe i pokrój je z indeksu bieżącego elementu i weź ten indeks plus wartość bieżącego elementu. Następnie podsumuj tę podsekwencję. Konwertuj wynik na macierzystą tablicę JS i zwróć ją

wprowadź opis zdjęcia tutaj

applejacks01
źródło
Usuń var zmienne, nie potrzebujesz tego w golfie. Możesz także zmienić, .forEachna .mapktóry kosztuje mniej bajtów.
charredgrass,
O tak, masz rację co do var. Dzięki! Jutro powtórzę tę odpowiedź. Wygląda na to, że natywny JS (es6) zabija moje rozwiązanie lol
applejacks01
Dobre wezwanie do usunięcia var. Uświadomiłem sobie również inne rozwiązanie, które znacznie zmniejsza liczbę bajtów i jest również bardziej intuicyjne
applejacks01
1

Clojure, 63 bajty

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

Używa dopasowania wzorca do dekompozycji argumentu wejściowego na pierwszy i resztę argumentów.

NikoNyrh
źródło
1

MATL , 17 14 13 bajtów

fGy+!-R0<G*!s

Wyjaśnienie

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe (zmodyfikowano kod, aby obsługiwał kilka danych wejściowych).

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
źródło
0

C #, 94 bajtów

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

Gdzie a jest int [] reprezentującym dane wejściowe do rozwiązania.

supermeerkat
źródło
nie wolno zakładać, że zmienna jest predefiniowana
downrep_nation
Zmienna a to dane wejściowe do rozwiązania.
supermeerkat