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]

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.

11

Python, 40 bytes

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

Teste em Ideone .


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.


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.


5

Haskell, 34 , 33 bytes

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

Um byte salvo por nimi.


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>


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

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


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


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


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



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.



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

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.


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]

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


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


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

1

Dyalog APL, 15 bytes

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

ou

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

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

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

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

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


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.


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

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.


você não esteja autorizado a assumir uma variável é predefinido
downrep_nation

A variável a é a entrada a ser resolvida.
23816 supermeerkat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.