Conjunto de Soma de Substring

26

Introdução

Vamos observar esta matriz: [3, 2, 4, 1, 1, 5, 1, 2].

Cada elemento exibe o comprimento da substring que deve ser resumida. Vamos dar uma olhada no primeiro elemento da matriz acima:

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

O elemento no primeiro índice é 3 , portanto, agora usamos uma substring de comprimento três com o mesmo índice que a posição inicial:

[3, 2, 4]

Quando resumido, isso resulta em 9 ; portanto, o primeiro elemento do conjunto de somas de substring é 9.

Fazemos isso para todos os elementos da matriz:

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

Você pode ver que o número 5 é um caso estranho. Esse número excede o comprimento da matriz:

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

Ignoraremos tudo o que exceder a matriz, portanto, apenas usamos [5, 1, 2].

O último passo é resumir tudo:

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

E essa é a matriz que precisa ser gerada:

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

A tarefa

Dada uma matriz não vazia com números inteiros positivos (diferentes de zero), produza o conjunto de soma de substring . Isso é , então a submissão com o menor número de bytes vence!

Casos de teste

[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
fonte
Eu acho que você quer dizer "sub-lista", não "substring". Não há cordas.
mbomb007
4
@ mbomb007 Acho que substring tem o mesmo significado aqui que no problema mais comum de substring, ou seja, uma subsequência cujos elementos são adjacentes. Tipos de dados à parte, uma string é apenas uma sequência finita de elementos de um conjunto de alfabeto (nesse caso, os números inteiros positivos).
Dennis

Respostas:

15

Gelatina , 6 bytes

ṫJḣ"ḅ1

Experimente online! ou verifique todos os casos de teste .

Como funciona

ṫ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
fonte
11

Python, 40 bytes

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

Teste em Ideone .

Dennis
fonte
Eu imaginei que haveria uma solução recursiva Golfier, mas você chegou antes de mim.
El'endia Starman
11

Excel, 21 bytes

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

Abra uma nova planilha, coloque os valores de teste na coluna A. Digite a fórmula em B1 e clique duas vezes no identificador da célula para percorrer o intervalo.

Joffan
fonte
Eu daria a você um segundo voto positivo por me ensinar sobre esse truque de clique duplo, se eu pudesse.
Neil
Enquanto funciona, é meio trapaceiro, pois a execução requer entrada manual.
user3819867
3
@ user3819867 não significativamente mais do que a maioria das execuções de programas, eu diria. Talvez seja ainda mais comparável se você salvar uma planilha contendo apenas a fórmula em B1 - em seguida, abra, adicione os dados à coluna A e clique duas vezes no identificador em B1 para executar. YMMV é claro.
Joffan
7

Python 3, 47 bytes

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

Implementação bastante direta. O comportamento padrão do Python para fatias que ultrapassam o final da lista foi muito conveniente aqui.

El'endia Starman
fonte
5

Haskell, 34 , 33 bytes

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

Um byte salvo por nimi.

Michael Klein
fonte
4

JavaScript ES6, 50 bytes

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

Bastante auto-explicativo. Ele mapestá sobre cada elemento da matriz, obtendo o valor slicedesse index através do índice mais eo valor desse elemento e reduceadicionando.

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
fonte
4

J, 11 bytes

+/@{."_1]\.

Uso

   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

Explicação

+/@{."_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
milhas
fonte
4

JavaScript (ES6), 45

reduce espancado novamente!

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
fonte
1
Tanto quanto eu sei, você pode remover o f=, assim como nesta resposta .
LarsW
@LarsW direita, o f=que já não é contado nos 45 bytes
edc65
3

Retina , 38 bytes

A contagem de bytes assume a codificação ISO 8859-1.

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

Entrada e saída são listas separadas por vírgula.

Experimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)

Martin Ender
fonte
3

Mathematica 60 55 bytes

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

por exemplo

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

Obrigado @MartinEnder por cortar 5 bytes :)

Martin
fonte
1
Aqui está uma idéia para evitar a tabela: #+Tr@Take[x=Rest@x,UpTo[#-1]]&/@(x=#)&Ainda não tenho certeza de que é o ideal, mas economiza 17 bytes.
Martin Ender
3

05AB1E, 11 8 bytes

[D¬£Oˆ¦Ž

Explicação

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

Experimente online

Emigna
fonte
2

Erlang, 69 bytes

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

As funções de ordem superior de Erlang para listas não recebem o índice do elemento atual. Isso usa o dicionário do processo para definir o índice do elemento atual.

cPu1
fonte
2

Pyke, 12 7 bytes

FKo>i<s

Experimente aqui!

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

VBA, 160 bytes

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
user3819867
fonte
2

Pitão, 6 bytes

ms<~tQ

Suíte de teste

Esta é uma solução diferente de qualquer outra até agora. Ele faz um loop na entrada, fatiando uma soma dos valores iniciais, removendo o primeiro elemento da entrada armazenada e repetindo.

Explicação:

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
fonte
1

F #, 84 82 bytes

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

JavaScript (ES6) - 79 bytes

Uma solução recursiva que não usa nenhum dos métodos 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

Teste:

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
fonte
1

C #, 89 bytes

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

bem direto

idéias de melhoria apreciadas

downrep_nation
fonte
1

Braquilog , 27 bytes

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

Experimente online! ou verifique todos os casos de teste .

Explicação

  .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
Fatalizar
fonte
1

Dyalog APL, 15 bytes

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

ou

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

Programa PHP, 72 bytes

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

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

+11 como uma função:

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

+9 sem builtins:

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

($ c mantém os valores originais, $ a conta para cada índice, $ r obtém as somas)

-3 como programa:

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

q (37 bytes)

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

Exemplo:

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
fonte
1

Matrizes , 25 bytes

Bem, finalmente, um desafio para o qual não preciso de novos recursos!

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

Correr com: python matricks.py substring.txt [[<input>]] 0

Explicação:

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
Azul
fonte
1

Javascript (usando Biblioteca Externa) (66 bytes)

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

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

Explicação do código: _.From está carregando a matriz de entrada na biblioteca, que é basicamente o LINQ para js. Cada item da matriz é mapeado de acordo com o seguinte predicado: Pegue a entrada e corte-a no índice do item atual e pegue esse índice mais o valor do item atual. Em seguida, resuma essa subsequência. Converta o resultado em uma matriz JS nativa e retorne-o

insira a descrição da imagem aqui

applejacks01
fonte
Remova o var das variáveis, você não precisa disso no golfe. Você também pode alterar .forEachpara .mapqual custa menos bytes.
Charredgrass
Ah sim, você está certo sobre var. Obrigado! Eu vou passar por esta resposta novamente amanhã. Parece que JS nativas (ES6) mata a minha solução lol
applejacks01
Boa chamada para remover var. Eu também percebi outra solução que reduz o byte contam muito, e também é mais intuitivo
applejacks01
1

Clojure, 63 bytes

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

Usa a correspondência de padrões para decompor o argumento de entrada no primeiro e no restante dos argumentos.

NikoNyrh
fonte
1

MATL , 17 14 13 bytes

fGy+!-R0<G*!s

Explicação

Experimente online! Ou verifique todos os casos de teste (código modificado para lidar com várias entradas).

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
fonte
0

C #, 94 bytes

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

Onde a é um int [] que representa a entrada a ser resolvida.

supermeerkat
fonte
você não esteja autorizado a assumir uma variável é predefinido
downrep_nation
A variável a é a entrada a ser resolvida.
23816 supermeerkat