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.