Set somma sottostringa


26

introduzione

Osserviamo questa matrice: [3, 2, 4, 1, 1, 5, 1, 2].

Ogni elemento visualizza la lunghezza della sottostringa che deve essere riassunta. Diamo un'occhiata al primo elemento dell'array sopra:

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

L'elemento al primo indice è 3 , quindi ora prendiamo una sottostringa di lunghezza tre con lo stesso indice della posizione iniziale:

[3, 2, 4]

Riassumendo, questo risulta in 9 , quindi il primo elemento dell'insieme di somma della sottostringa è 9.

Lo facciamo per tutti gli elementi dell'array:

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

Puoi vedere che il numero 5 è un po 'strano. Quel numero supera la lunghezza dell'array:

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

Ignoreremo tutto ciò che supera l'array, quindi utilizziamo semplicemente [5, 1, 2].

L'ultimo passo è riassumere tutto:

[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 questo è l'array che deve essere emesso:

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

L'obiettivo

Dato un array non vuoto con numeri interi positivi (diversi da zero), emette il set di somma della sottostringa . Questo è , quindi vince l'invio con il minor numero di byte!

Casi test

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

Penso che intendi "sotto-elenco", non "sottostringa". Non ci sono stringhe.
mbomb007,

4
@ mbomb007 Penso che la sottostringa abbia lo stesso significato qui del problema di sottostringa comune più lungo, ovvero una sottosequenza i cui elementi sono adiacenti. A parte i tipi di dati, una stringa è solo una sequenza finita di elementi di un set di alfabeto (in questo caso, gli interi positivi).
Dennis,

Risposte:


15

Gelatina , 6 byte

ṫJḣ"ḅ1

Provalo online! o verifica tutti i casi di test .

Come funziona

ṫ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

Excel, 21 byte

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

Apri un nuovo foglio di calcolo, inserisci i valori del test nella colonna A. Inserisci la formula in B1 e fai doppio clic sulla maniglia della cella per superare l'intervallo.


Ti darei un secondo voto per avermi insegnato su quel trucco del doppio clic, se potessi.
Neil,

Mentre funziona è un po 'imbroglione poiché l'esecuzione richiede un input manuale.
user3819867

3
@utente3819867 non significativamente più della maggior parte dell'esecuzione del programma, direi. Forse sarebbe ancora più comparabile se salvi un foglio di calcolo contenente solo la formula in B1 - quindi apri, aggiungi i dati alla colonna A e fai doppio clic sull'handle su B1 per eseguire. YMMV ovviamente.
Joffan,

7

Python 3, 47 byte

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

Implementazione piuttosto semplice. Il comportamento predefinito di Python per le sezioni che superano la fine dell'elenco è stato molto utile qui.


5

Haskell, 34 , 33 byte

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

Un byte salvato da nimi.


4

JavaScript ES6, 50 byte

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

Abbastanza autoesplicativo. Si trova mapsu ogni elemento dell'array, ottenendo il sliceda quel index attraverso l'indice più eil valore di quel lement , e reduceing aggiungendo.

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 byte

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

Spiegazione

+/@{."_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 battuto di nuovo!

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
Per quanto ne so, è possibile rimuovere f=, proprio come in questa risposta .
LarsW

@LarsW giusto, il non f=è già conteggiato nei 45 byte
edc65

3

Retina , 38 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

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

Input e output sono elenchi separati da virgole.

Provalo online! (La prima riga abilita una suite di test separata da avanzamento riga.)


3

Mathematica 60 55 byte

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

per esempio

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

Grazie @MartinEnder per la rasatura di 5 byte :)


1
Ecco un'idea per evitare la tabella: #+Tr@Take[x=Rest@x,UpTo[#-1]]&/@(x=#)&non sono ancora sicuro che sia ottimale, ma salva 17 byte.
Martin Ender,

3

05AB1E, 11 8 byte

[D¬£Oˆ¦Ž

Spiegazione

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

Provalo online



2

Erlang, 69 byte

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

Le funzioni di ordine superiore di Erlang per gli elenchi non ricevono l'indice dell'elemento corrente. Questo utilizza il dizionario di processo per impostare l'indice dell'elemento corrente.


2

Pyke, 12 7 byte

FKo>i<s

Provalo qui!

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

2

VBA, 160 byte

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 byte

ms<~tQ

Suite di test

Questa è una soluzione diversa da qualsiasi altra finora. Passa sopra l'input, tagliando una somma dei valori iniziali, quindi rimuovendo il primo elemento dell'input memorizzato e ripetendo.

Spiegazione:

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 byte

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 byte

Una soluzione ricorsiva che non utilizza nessuno dei metodi 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

test:

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 byte

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

abbastanza diretto

idee di miglioramento apprezzate


1

Brachylog , 27 byte

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

Provalo online! o verifica tutti i casi di test .

Spiegazione

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

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

o

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

1

Programma PHP, 72 byte

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

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

+11 in funzione:

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

+9 senza builtin:

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

($ c mantiene i valori originali, $ a esegue il conto alla rovescia per ciascun indice, $ r ottiene le somme)

-3 come programma:

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

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

Esempio:

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

Matrick , 25 byte

Sì, finalmente una sfida per la quale non ho bisogno di nuove funzionalità!

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

Corri con: python matricks.py substring.txt [[<input>]] 0

Spiegazione:

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 (utilizzando la libreria esterna) (66 byte)

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

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

Spiegazione del codice: _.Dal sta caricando l'array di input nella libreria, che è sostanzialmente LINQ per js. Quindi ogni elemento nell'array viene mappato in base al predicato seguente: Prendi l'input e separalo dall'indice dell'articolo corrente e prendi quell'indice più il valore dell'oggetto corrente. Quindi riassumi quella sottosequenza. Convertire il risultato in un array JS nativo e restituirlo

inserisci qui la descrizione dell'immagine


Rimuovi le var variabili, non è necessario nel golf. Puoi anche cambiare .forEacha .mapquale costa meno byte.
charredgrass,

Oh sì, hai ragione sulla var. Grazie! Domani risponderò di nuovo a questa risposta. Sembra che il nativo JS (es6) uccida la mia soluzione lol
applejacks01

Buona chiamata sulla rimozione di var. Ho anche realizzato un'altra soluzione che riduce molto il conteggio dei byte ed è anche più intuitiva
applejacks01

1

Clojure, 63 byte

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

Utilizza la corrispondenza dei modelli per decomporre l'argomento di input nel primo e nel resto degli argomenti.


1

MATL , 17 14 13 byte

fGy+!-R0<G*!s

Spiegazione

Provalo online! Oppure verifica tutti i casi di test (codice modificato per gestire più input).

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 byte

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

Dove a è un int [] che rappresenta l'input da risolvere.


non ti è consentito supporre che una variabile sia predefinita
downrep_nation

La variabile a è l'input da risolvere.
supermeerkat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.