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]

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:



11

Python, 40 bajtów

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

Przetestuj na Ideone .


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.


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 .


5

Haskell, 34 , 33 bajtów

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

Jeden bajt zapisany przez nich.


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>


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

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


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


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


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



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.



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

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.


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]

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


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


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

1

Dyalog APL, 15 bajtów

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

lub

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

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

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

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

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


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.


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

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.


nie wolno zakładać, że zmienna jest predefiniowana
downrep_nation

Zmienna a to dane wejściowe do rozwiązania.
supermeerkat
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.