Sostituiscimi con la somma dei miei successori ciclici!


25

Questa volta ho una sfida semplice per te. Data una matrice di numeri interi positivi A (o l'equivalente nella tua lingua), sostituisci ogni voce A i con la somma dei successivi elementi A i di A , tornando indietro dall'inizio se non ci sono abbastanza elementi.

Come al solito, puoi competere con qualsiasi linguaggio di programmazione e prendere input e fornire output attraverso qualsiasi metodo standard e in qualsiasi formato ragionevole, tenendo presente che queste scappatoie sono vietate per impostazione predefinita. Puoi anche prendere la dimensione di A come input. Questo è , quindi vince l'invio più breve (in byte) per ogni lingua .

Esempi / casi di test

Dato [1,3,4,5], l'output del tuo codice [3,10,13,14], perché 1è sostituito da 3, 3è sostituito da 4+5+1=10(nota come è tornato dall'inizio), 4da 5+1+3+4=13e 5da 1+3+4+5+1=14.

Dato [3,2,1,9], il tuo programma dovrebbe produrre [12,10,9,33], perché sostituiamo 3con 2+1+9=12, 2con 1+9=10, 1con 9e 9con 3+2+1+9+3+2+1+9+3=33(nota come siamo tornati dall'inizio più di una volta).

Alcuni altri casi di test tra cui scegliere:

[4,3,2,1]                       -> [10,7,5,4]
[3,2,1,9]                       -> [12,10,9,33]
[1,3,4,5]                       -> [3,10,13,14]
[4,4,3,2,2]                     -> [11,11,8,6,8]
[3,5,3,2,1]                     -> [10,14,6,4,3]
[3,2,4,3,2,1,1]                 -> [9,7,7,4,2,1,3]
[7,8,6,5,4,3,2,1,5]             -> [29,33,20,15,11,8,6,5,30]
[28,2,4,2,3,2,3,4,5,3]          -> [137,6,10,5,9,7,12,38,39,34]
[1,2,3,4,5,4,3,2,1,2,3,4,3,2,1] -> [2,7,13,14,12,8,5,3,2,7,9,7,4,2,1]

Risposte:


8

MATL , 10 9 byte

"G@:X@+)s

Provalo online!

	% implicit input
"	% for loop, iterate over the input array 
G	% push input x
@	% push for loop index, x[i]
:	% range, push [1,...,x[i]]
X@	% push for loop index, i
+	% sum, so stack holds [i+1,...,i+x[i]]
)	% index, modularly, so gets the cyclic successors
s	% sum cyclic successors, leaving the sum on the stack
	% implicit end of for loop
	% implicit output of stack


6

Python , 55 byte

lambda a:[sum((-~v*a)[i:i+v])for i,v in enumerate(a,1)]

Provalo online!


non hai familiarità con Python puoi spiegare la parte in parentesi dopo la somma?
Giona

2
In primo luogo l' ~operatore è un po 'no, è effettivamente una scorciatoia per -1-v, quindi -~vè una scorciatoia per -(-1-v)cui è giusto 1+v(ma evita parentesi come (1+v)*a). Secondariamente in Python si può moltiplicare un elenco per un numero intero per ripeterlo (es. ['a','b']*3È ['a','b','a','b','a','b']). L' -~v*apotrebbero essere sostituiti con a+v*aper lo stesso numero di byte. Infine la [i:i+v]è un'indicizzazione fetta, mantenendo elementi ia i+v-1(0-indicizzato) soltanto.
Jonathan Allan,

6

J, 33 byte

[:({.+/@{.}.)"1 i.@#|."{($~>./*#)

ungolfed

[: ({. +/@{. }.)"1 i.@# |."0 _ ($~ (>./ * #))

spiegazione

inserisci qui la descrizione dell'immagine

Provalo online!


spiegazione di fantasia: o
Conor O'Brien,

1
Bella immagine laggiù, ma consiglio di mettere anche la spiegazione in forma di testo, poiché le immagini potrebbero non durare per sempre. ;)
Erik the Outgolfer,

7
Sembra un gioco roguelike.
aschepler,

Qual è il punteggio se riscrivi la mia soluzione K in J?
streetster,


6

Haskell, 50 47 44 byte

zipWith((sum.).take)<*>scanr(:)[].tail.cycle

Provalo online!

                    -- <*> in function context is Haskell's S combinator, i.e.
                    --     (zipWith ... <*> scanr ...) arg
                    -- resovles to
                    --     zipWith ... arg (scanr ... arg)
zipWith             -- so we zip
                    --   the input list and
 scanr(:)[]         --   the tails (tails of [1,2,3] are [[1,2,3],[2,3],[3],[]])
      tail          --   of the tail of
          cycle     --   and infinite cycle of the input list
                    -- with the function
 (sum.).take        --   take that many elements given by the element
                    --   of the input list from the list given by the inits
                    --   and sum it   

Bel lavoro! In realtà, scanr (:) [] è croce
Damien,

@Damien: code. Destra! Grazie!
nimi,

4

05AB1E , 8 7 byte

εL¾+èO¼

Provalo online!

Spiegazione

ε        # apply to each element x of the input
 L       # push range [1 ... x]
  ¾+     # add counter to each (initially 0)
    è    # cyclically index into input with each
     O   # sum
      ¼  # increment counter

4

K4 / K (oK) , 20 19 byte

Soluzione:

+/'x#'1_(1+2##x)#x:

Provalo online!

Esempi:

q)k)+/'x#'1_(1+2##x)#x:1 3 4 5
3 10 13 14
q)k)+/'x#'1_(1+2##x)#x:4 3 2 1
10 7 5 4
q)k)+/'x#'1_(1+2##x)#x:3 2 4 3 2 1 1
9 7 7 4 2 1 3
q)k)+/'x#'1_(1+2##x)#x:1 2 3 4 5 4 3 2 1 2 3 4 3 2 1
2 7 13 14 12 8 5 3 2 7 9 7 4 2 1

Spiegazione:

Risagoma input, rilascia prima, prendi x lunghezza di ciascuno, riassumi.

+/'x#'1_(1+2##x)#x: / the solution
                 x: / store input as x
                #   / reshape
        (      )    / do this together
             #x     / count x
           2#       / duplicate (2-take)
         1+         / add 1
      1_            / 1 drop (_), remove first element
   x#'              / x take each-both
+/'                 / sum (+/) each


3

Attache , 26 byte

{Sum=>_[(_2+1:_)%#_]}#Iota

Provalo online!

Spiegazione

Questa è una forcella di due funzioni:

  • {Sum=>_[(_2+1:_)%#_]}
  • Iota

Ciò significa che il dente giusto Iotaviene applicato all'argomento xe passato come secondo argomento al dente centrale (la prima funzione). Quindi questo diventa, per input x:

{Sum=>_[(_2+1:_)%#_]}[x, Iota[x]]

Sostituendo quelli in per _e _2:

Sum => x[(Iota[x] + 1:x) % #x]

Iota[x]restituisce una matrice degli indici di x. È equivalente a 0...#x. #xè un modo breve per dire la dimensione di x, o Size[x]. In sostanza, questa funzione sta mappando la Sumfunzione sulla seconda espressione:

x[(Iota[x] + 1:x) % #x]

Il x[...]bit esterno indica che ...genererà una serie di indici da cui selezionare x. La parte più importante della generazione degli indici è questa:

Iota[x] + 1:x

Questa espressione usa un po 'di vettorializzazione. Per visualizzare questo, supponiamo che sia l'input x := [1, 3, 4, 5]. Quindi, questa espressione è equivalente a:

Iota[[1, 3, 4, 5]] + 1:[1, 3, 4, 5]
[0, 1, 2, 3] + [1:1, 1:3, 1:4, 1:5]
[0, 1, 2, 3] + [[1], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
[0 + [1], 1 + [1, 2, 3], 2 + [1, 2, 3, 4], 3 + [1, 2, 3, 4, 5]]
[[0 + 1], [1 + 1, 1 + 2, 1 + 3], [2 + 1, 2 + 2, 2 + 3, 2 + 4], [3 + 1, 3 + 2, 3 + 3, 3 + 4, 3 + 5]]
[[1], [2, 3, 4], [3, 4, 5, 6], [4, 5, 6, 7, 8]]

Questa è una lista di indici che rappresentano gli indici prossimi Nelementi in xmod #x. Per renderli sicuri per il recupero, prendiamo questa mod di array #x:

(Iota[x] + 1:x) % #x

Questo ci dà gli indici corretti, che vengono quindi ottenuti xe ogni array viene sommato, dando i risultati corretti.

Altri tentativi

36 byte: {Sum@_&Get=>((_2+1.._2+_)%#_)}#Iota - Ho dimenticato x[...]vettorializzare completamente, in modo che diventi:

30 byte: {Sum=>_[(_2+1.._2+_)%#_]}#Iota - ma poi ho capito che l' _2+intervallo interno poteva essere preso in considerazione, il che significa che potevamo salvare le parentesi usando :invece di .., dandoci la versione corrente.


3

R , 89 64 byte

j=rep(x<-scan(),max(x));Map(function(u,v)sum(j[v+1:u]),x,seq(x))

Provalo online!

Idea principale per generare un vettore di indice di ciclo sufficientemente lungo che è possibile utilizzare per ottenere gli elementi necessari dal vettore di input.

Versione originale:

function(x,i=seq(x),j=rep(i,max(x))){for(k in i){T=c(T,sum(x[j[(k+1):(k+x[k])]]))};T[-1]}

Provalo online!


Dal momento che è consentito prendere la lunghezza come argomento aggiuntivo ... 75
JayCe

1
69 divertente avevo iniziato qualcosa di simile ma usando cumsum e mi sono perso nel processo ... bella soluzione!
JayCe,

66 (usando Map. L'output è un po 'brutto, quindi il link TIO non lo elenca. Immagino che un programma completo sarebbe ancora più breve!
JayCe,



3

R , 62 58 byte

function(a,l)diag(diffinv(matrix(a,max(a)*l+1,l))[a+2,])-a

Provalo online!

In alternativa alla altra soluzione R . Nei commenti JayCe ha fatto menzione di ciòcumsum che ha innescato qualcosa nel mio cervello da usare diffinve il riciclaggio della matrice anziché rep.

Spiegazione:

Dato array di input a, let M=max(a)e l=length(a).

Osserva che M+lè l'indice massimo possibile a cui avremmo bisogno di accedere e che M+l<=M*l+1, dal momento che M,l>1, M+l<=M*l(con l'uguaglianza solo quando M=l=2) e se l==1o M==1, allora M+l==M*l+1.

A titolo di esempio, lascia a=c(4,3,2,1). Poi M=l=4.

Costruiamo la M*l+1 x lmatrice in R di matrix(a,max(a)*l+1,l). Poiché R ricicla ain ordine di colonna maggiore, si finisce con una matrice che ripete gli elementi acome tali:

      [,1] [,2] [,3] [,4]
 [1,]    4    3    2    1
 [2,]    3    2    1    4
 [3,]    2    1    4    3
 [4,]    1    4    3    2
 [5,]    4    3    2    1
 [6,]    3    2    1    4
 [7,]    2    1    4    3
 [8,]    1    4    3    2
 [9,]    4    3    2    1
[10,]    3    2    1    4
[11,]    2    1    4    3
[12,]    1    4    3    2
[13,]    4    3    2    1
[14,]    3    2    1    4
[15,]    2    1    4    3
[16,]    1    4    3    2
[17,]    4    3    2    1

Ogni colonna è il successore ciclico di ciascun elemento di a, con aattraverso la prima riga; ciò è dovuto al modo in cui R ricicla i suoi argomenti in una matrice.

Successivamente, prendiamo la "derivata" inversa con diffinv, essenzialmente la somma cumulativa di ogni colonna con un ulteriore 0come prima riga, generando la matrice

      [,1] [,2] [,3] [,4]
 [1,]    0    0    0    0
 [2,]    4    3    2    1
 [3,]    7    5    3    5
 [4,]    9    6    7    8
 [5,]   10   10   10   10
 [6,]   14   13   12   11
 [7,]   17   15   13   15
 [8,]   19   16   17   18
 [9,]   20   20   20   20
[10,]   24   23   22   21
[11,]   27   25   23   25
[12,]   29   26   27   28
[13,]   30   30   30   30
[14,]   34   33   32   31
[15,]   37   35   33   35
[16,]   39   36   37   38
[17,]   40   40   40   40
[18,]   44   43   42   41

Nella prima colonna, la voce 6=4+2è uguale a 14=4 + (3+2+1+4), che è la somma ciclica del successore (CSS) più un anticipo 4. Allo stesso modo, nella seconda colonna, la voce 5=3+2è uguale 10=3 + (4+1+2)e così via.

Quindi nella colonna i, la a[i]+2voce nd è uguale a CSS(i)+a[i]. Quindi, prendiamo le righe indicizzate da a+2, producendo una matrice quadrata:

     [,1] [,2] [,3] [,4]
[1,]   14   13   12   11
[2,]   10   10   10   10
[3,]    9    6    7    8
[4,]    7    5    3    5

Le voci lungo la diagonale sono uguali alle somme cicliche successive a, quindi estraiamo la diagonale e sottraggiamo a, restituendo il risultato come somme cicliche successive.


Non vedo l'ora per la spiegazione!
JayCe,

@JayCe aggiunto! come spesso accade, spiegarlo ha portato ad un altro golf; Consiglio sempre di aggiungere una spiegazione in modo che tu o gli altri che seguono possano trovare un altro approccio, anche se non ho sempre tempo per farlo, ahah.
Giuseppe,

1
L'elemento comune ad entrambe le soluzioni è la generazione efficiente di un riciclo abbastanza lungo dell'indice o degli elementi stessi, dal momento che i linguaggi a 1 indice non possono utilizzare con garbo l'aritmetica modulare per tornare all'inizio dell'array.
ngm,

@ngm sì, certo. Mi piace il tuo uso di Map, e in origine questo era come 68 byte prima di capire che potevo prendere lcome input!
Giuseppe,

2

Pyth, 13 11 byte

.esm@Q+dkSb

Salvato 2 byte grazie a Mr. Xcoder.
Provalo qui

Spiegazione

.esm@Q+dkSb
.e         Q   For each index k and value b in (implicit) input...
         Sb    ... get the list [1, ..., b]...
   m  +dk      ... add k to each...
    @Q         ... and index into the input...
  s            ... then take the sum.


2

Carbone , 12 byte

IEθΣEι§θ⊕⁺κλ

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

  θ             Input array
 E              Map over elements
     ι          Current element
    E           Map over implicit range
           λ    Inner index
          κ     Outer index
         ⁺      Sum
        ⊕       Increment
       θ        Input array
      §         Cyclically index
   Σ            Sum
I               Cast to string
                Implicitly print on separate lines

2

JavaScript ES6, 65 byte

a=>a.map((x,y)=>{for(s=0,i=y;i<y+x;)s+=a[++i%a.length];return s})

Soluzione semplice. Ungolfed:

a => a.map((x,y) => {
    var s = 0;
    for (i = y; i < y + x; i++) {
        s += a[i % a.length];
    }
    return s;
});

La map()funzione JavaScript è perfetta per il lavoro, esegue il callback dato su ogni elemento e lo ha sostituito con il risultato del callback. Il callback riceve due parametri, il primo xè il valore e il secondo yè l'indice. Prendendo il modulo i % a.lengthpossiamo facilmente passare in rassegna l'array, più volte se necessario.

Snippet di prova

(Inserisci l'input come notazione JSON)


2

Java 8, 87 byte

Un lambda vuoto al curry che prendeva una int[]lista e una intlunghezza.

l->s->{for(int i=-1,j,t;++i<s;System.out.println(t))for(j=t=0;j++<l[i];)t+=l[(i+j)%s];}

Provalo online . Si noti che ho ombreggiato System.outin questo programma per ottenere risultati per una stampa più bella.


2

Julia 0.6 , 63 55 53 byte

A->[sum(repmat(A,v+1)[i+1:i+v])for(i,v)=enumerate(A)]

Provalo online!


Soluzione precedente:

Julia 0.6 , 65 byte

A->(l=length(A);[sum(A[mod1(j,l)]for ji+1:i+A[i])for i1:l])

Provalo online!


Un'altra soluzione. Non eccezionale, ma mi piace, ed è probabilmente più efficiente degli altri due, soprattutto se l'input ha grandi numeri.

Julia 0.6 , 69 byte

A->(l=length(A);[sum([A;A][i+1:i+A[i]%l])+A[il*sum(A)for i1:l])

Provalo online!


1

Tela , 10 byte

²X{x+⁸@]∑]

Provalo qui!

Spiegazione:

{         ] map over the items in the input
 ²X           save this loops counter on X (because of a bad design choice..)
   {    ]     map over 1..current item
    x+          add to it X
      ⁸@        and index in the input using that
         ∑    sum the map

1

QBasic 1.1 , 115 byte

INPUT L
DIM A(L)
FOR I=0TO L-1
INPUT C
A(I)=C
NEXT
FOR I=0TO L-1
S=0
FOR C=I+1TO I+A(I)
S=S+A(C MOD L)
NEXT
?S
NEXT

Il primo input è la lunghezza L , quindi L gli input successivi sono gli elementi in ordine. Gli output L rappresentano l'array risultante, con gli elementi nell'ordine in cui sono presentati.



1

APL + WIN, 37 byte

Richiede input:

+/¨v↑¨⊂[2](⍳⍴v)⌽((⍴v),⍴n)⍴n←(+/v)⍴v←⎕

Provalo online! Per gentile concessione di Dyalog Classic

Spiegazione:

n←(+/v)⍴v←⎕ prompts for input and creates a repeating vector of length max v

((⍴v),⍴n)⍴n converts n to a matrix of length v x length n

(⍳⍴v)⌽ rotates each row of n by the size of each element of v

⊂[2] converts each row of m to an element in a nested vector

+/¨v↑¨ selects the number of elements from each element of the nested vector according to v and sums


1

JavaScript, 65 byte 3̶0̶0̶ ̶b̶y̶t̶e̶s̶

golfed

n=>n.map((z,x)=>{for(s=0,i=x;i<z+x;)s+=n[++i%n.length];return s})

ungolfed

     f = n=>n.map((z,x)=>{
            for(s=0,i=x;i<z+x;)s+=n[++i%n.length];
            return s
            }
        );
console.log(f(process.argv[2].slice(1, -1).split(", ").map(x=>+x)))

Provalo online!

(versione non golfata sopra) Sono nuovo di questa cosa codegolf!


* Aggiornato! grazie agli utili link forniti nei commenti, sono riuscito a ridurre la dimensione a 65 byte!


Benvenuti nel sito. Ci sono un paio di modi in cui questo potrebbe essere migliorato. È possibile utilizzare nomi di variabili a carattere singolo e rimuovere spazi extra bianchi. (gli operatori non devono essere circondati da spazi.)
Mago del grano,

Oltre ai suggerimenti di Cat Wizard, abbiamo una raccolta di suggerimenti per giocare a golf in JavaScript . Come dici di essere un principiante del golf, potresti trovare interessanti anche i Consigli generici per giocare a golf in <tutte le lingue> .
arte

Dovresti aggiungere la versione golfata prima di quella non golfata
Sefa, il

Supponiamo che l'array sia assegnato come variabile predefinita ( n), che non è consentita. Benvenuto in PPCG, però :)
Shaggy,





0

Pip -rn , 14 byte

$+g@(_+\,B)MEg

Prende i numeri di input su righe successive di stdin; fornisce numeri di output su righe successive di stdout.Provalo online!

Spiegazione

             g  List of lines of stdin (from -r flag)
           ME   Enumerate and map this function to the (index, value) pairs:
       \,B       One-based range(value)
     _+          To each element, add the index of that value
  g@(     )      Use the resulting range to slice into the original list g
                 (cyclical indexing is built in)
$+               Sum the numbers in the slice
                Output the list of results one per line (from -n flag)

Oppure, usando un esempio funzionante:

             g  [1 3 4 5]
           ME   
       \,B      [(1,2) (1,4) (1,5) (1,6)]
     _+         [(1,2) (2,5) (3,7) (4,9)]
  g@(     )     [[3] [4 5 1] [5 1 3 4] [1 3 4 5 1]]
$+              [3 10 13 14]


0

Perl 6 , 50 32 byte

{$_>>.&{.[++$+ ^$^a X%+$_].sum}}

Provalo online!

Sono nuovo a giocare a golf in Perl 6, quindi sono sicuro che questo può essere più breve. Non più nuovo, e torna al golf questo!

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.