Substitua-me pela soma dos meus sucessores cíclicos!


25

Eu tenho um desafio simples para você neste momento. Dada uma matriz de números inteiros positivos A (ou o equivalente no seu idioma), substitua cada entrada A i pela soma dos próximos elementos A i de A , voltando desde o início, se não houver itens suficientes.

Como de costume, você pode competir em qualquer linguagem de programação e receber entradas e fornecer saídas por qualquer método padrão e em qualquer formato razoável, observando que essas brechas são proibidas por padrão. Opcionalmente, você também pode usar o tamanho de A como entrada. Isso é , então a submissão mais curta (em bytes) para todos os idiomas vence.

Exemplos / Casos de Teste

Dado [1,3,4,5], seu código deve gerar [3,10,13,14], porque 1é substituído por 3, 3é substituído por 4+5+1=10(observe como ele foi recuperado desde o início), 4por 5+1+3+4=13e 5por 1+3+4+5+1=14.

Dado [3,2,1,9], seu programa deve produzir [12,10,9,33], porque substituímos 3por 2+1+9=12, 2com 1+9=10, 1com 9e 9com 3+2+1+9+3+2+1+9+3=33(observe como nos recuperamos desde o início mais de uma vez).

Mais alguns casos de teste para você escolher:

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

Respostas:


8

MATL , 10 9 bytes

"G@:X@+)s

Experimente 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 bytes

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

Experimente online!


não familiarizado com python, você pode explicar a parte em parênteses após soma?
— Jonah

2
Em primeiro lugar, o ~operador não é um pouco bit a bit, é efetivamente uma abreviação para -1-v, assim -~vcomo uma abreviação para a -(-1-v)qual é justa 1+v(mas evita parênteses como (1+v)*a). Em segundo lugar, no Python, pode-se multiplicar uma lista por um número inteiro para repeti-la (por exemplo, ['a','b']*3é ['a','b','a','b','a','b']). A -~v*apoderia ser substituído por a+v*apara o mesmo número de bytes. Por fim, o [i:i+v]é uma indexação fatia, mantendo elementos ipara i+v-1(0 indexada) somente.
— Jonathan Allan

6

J, 33 bytes

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

destroçado

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

explicação

insira a descrição da imagem aqui

Experimente online!


explicação chique: o
— Conor O'Brien

1
Imagem legal por lá, mas eu recomendo colocar a explicação em forma de texto também, pois as imagens podem não durar para sempre. ;)
— Erik the Outgolfer

7
Parece um jogo roguelike.
— Aschepler

Qual é a pontuação se você reescrever minha solução K em J?
— Streetster


6

Haskell, 50 47 44 bytes

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

Experimente 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   

Bom trabalho! Na verdade, ScanR (:) [] é caudas
— Damien

@ Damien: caudas. Direita! Obrigado!
— N /

4

05AB1E , 8 7 bytes

εL¾+èO¼

Experimente online!

Explicação

ε        # 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 bytes

Solução:

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

Experimente online!

Exemplos:

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

Explicação:

Remodelar a entrada, soltar primeiro, pegar x comprimento de cada um, resumir.

+/'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

Anexo , 26 bytes

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

Experimente online!

Explicação

Este é um fork de duas funções:

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

O que isso significa é que o dente direito Iotaé aplicado ao argumento xe passado como o segundo argumento ao dente central (a primeira função). Então isso se torna, para entrada x:

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

Substituindo aqueles em para _e _2:

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

Iota[x]retorna uma matriz dos índices de x. É equivalente a 0...#x. #xé uma maneira curta de dizer o tamanho de x, ou Size[x]. Essencialmente, esta função está mapeando a Sumfunção sobre a segunda expressão:

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

O x[...]bit externo significa que ...irá gerar uma série de índices para serem selecionados x. A parte mais importante da geração dos índices é esta:

Iota[x] + 1:x

Essa expressão usa um pouco de vetorização. Para visualizar isso, vamos supor que a entrada seja x := [1, 3, 4, 5]. Então, essa expressão é 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]]

Esta é uma lista de índices que representam os próximos Nelementos dos índices no xmod #x. Para torná-los seguros para recuperação, usamos este mod de matriz #x:

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

Isso nos fornece os índices adequados, que são obtidos a partir de xe cada matriz é somada, fornecendo os resultados adequados.

Outras tentativas

36 bytes: {Sum@_&Get=>((_2+1.._2+_)%#_)}#Iota - Esqueci x[...]completamente a vetorização, de forma que:

30 bytes: {Sum=>_[(_2+1.._2+_)%#_]}#Iota - mas então percebi que o _2+intervalo interno poderia ser fatorado, o que significa que poderíamos salvar parênteses usando em :vez de .., fornecendo a versão atual.


3

R , 89 64 bytes

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

Experimente online!

Idéia principal para gerar um vetor de índice de ciclismo com tempo suficiente que você pode usar para obter os elementos necessários a partir do vetor de entrada.

Versão original:

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

Experimente online!


Uma vez que é permitido levar o comprimento como argumento adicional ... 75
— Jayce

1
69 engraçado eu tinha começado algo parecido, mas usando cumsum e me perdi no processo ... ótima solução!
— Jayce

66 (usando Map A saída é um pouco feio assim Tio ligação un listas, eu acho que um programa completo seria ainda menor..!
— Jayce



3

R , 62 58 bytes

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

Experimente online!

Uma alternativa para a outra solução R . Nos comentários, JayCe fez uma menção sobre ocumsum que provocou algo em meu cérebro a usar diffinve reciclar matrizes em vez de rep.

Explicação:

Dada a matriz de entrada a, deixe M=max(a)e l=length(a).

Observe que esse M+lé o índice máximo possível que precisamos acessar e que M+l<=M*l+1, desde se M,l>1, M+l<=M*l(com igualdade somente quando M=l=2) e se l==1ou M==1, então M+l==M*l+1.

A título de exemplo, vamos a=c(4,3,2,1). Então M=l=4.

Construímos a M*l+1 x lmatriz em R por matrix(a,max(a)*l+1,l). Como R recicla ana ordem principal da coluna, terminamos com uma matriz repetindo os elementos da seguinte aforma:

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

Cada coluna é os sucessores cíclicos de cada elemento de a, com ana primeira linha; isso se deve à maneira como R recicla seus argumentos em uma matriz.

A seguir, pegamos a "derivada" inversa com diffinv, essencialmente, a soma cumulativa de cada coluna com uma adicional 0como primeira linha, gerando a matriz

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

Na primeira coluna, a entrada 6=4+2é igual a 14=4 + (3+2+1+4), que é a soma cíclica do sucessor (CSS) mais uma inicial 4. Da mesma forma, na segunda coluna, a entrada 5=3+2é igual a 10=3 + (4+1+2)e assim por diante.

Portanto, na coluna i, a a[i]+2entrada nd é igual a CSS(i)+a[i]. Portanto, pegamos linhas indexadas por a+2, produzindo uma matriz quadrada:

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

As entradas ao longo da diagonal são iguais às somas cíclicas do sucessor mais a, portanto extraímos a diagonal e subtraímos a, retornando o resultado como as somas cíclicas do sucessor.


Mal posso esperar pela explicação!
— 21418 JayCe

@JayCe adicionou! como tantas vezes acontece, explicar isso levou a outro golfe; Eu sempre recomendo adicionar uma explicação para que você ou outras pessoas que estejam seguindo possam encontrar outra abordagem, embora eu nem sempre tenha tempo para fazer isso, haha.
— Giuseppe

1
O elemento comum a ambas as soluções é a geração eficiente de uma reciclagem por tempo suficiente do índice ou dos próprios elementos, uma vez que as linguagens indexadas a 1 não podem usar a aritmética modular para voltar ao início da matriz.
— N /

@ngm sim, com certeza. Eu gosto do seu uso Map, e originalmente isso era como 68 bytes antes de eu descobrir que eu poderia usar lcomo entrada!
— 18718 Giuseppe #:

2

Pitão, 13 11 bytes

.esm@Q+dkSb

Economizou 2 bytes graças ao Sr. Xcoder.
Experimente aqui

Explicação

.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

Carvão , 12 bytes

IEθΣEι§θ⊕⁺κλ

Experimente online! Link é a versão detalhada do código. Explicação:

  θ             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 bytes

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

Solução simples. Ungolfed:

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

A map()função do JavaScript é perfeita para o trabalho, executa o retorno de chamada fornecido em cada elemento e o substitui pelo resultado do retorno de chamada. O retorno de chamada recebe dois parâmetros, o primeiro xé o valor e o segundo yé o índice. Ao usar o módulo i % a.length, podemos facilmente fazer um loop sobre o array, várias vezes, se necessário.

Snippet de teste

(Coloque a entrada como notação JSON)


2

Java 8, 87 bytes

Um lambda vazio ao curry tomando uma int[]lista e intcomprimento.

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];}

Experimente Online . Observe que eu fiz sombra System.outneste programa para obter resultados para uma impressão mais bonita.


2

Julia 0.6 , 63 55 53 bytes

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

Experimente online!


Solução mais antiga:

Julia 0.6 , 65 bytes

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

Experimente online!


Outra solução. Não é ótimo por bytecount, mas eu gosto e provavelmente é mais eficiente que os outros dois, especialmente se a entrada tiver grandes números.

Julia 0.6 , 69 bytes

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

Experimente online!


1

Tela , 10 bytes

²X{x+⁸@]∑]

Experimente aqui!

Explicação:

{         ] 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 bytes

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

A primeira entrada é o comprimento L , e as entradas subsequentes L são os elementos em ordem. As saídas L representam a matriz resultante, com os elementos na ordem em que são apresentados.



1

APL + WIN, 37 bytes

Solicita entrada:

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

Experimente online! Cortesia de Dyalog Classic

Explicação:

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

destroçado

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

Experimente online!

(versão ungolfed acima) Eu sou novo nessa coisa de codegolf!


*Atualizada! graças aos links úteis fornecidos nos comentários, consegui reduzir o tamanho para 65 bytes!


Bem vindo ao site. Existem algumas maneiras de melhorar isso. Você pode usar nomes de variáveis ​​de caracteres únicos e remover espaço em branco extra. (os operadores não precisam ser cercados por espaços.)
— Assistente de trigo

Além das dicas do Assistente de gato, temos uma coleção de dicas para jogar golfe em JavaScript . Como você diz que é novo no golfe, também pode achar interessantes as dicas genéricas para o golfe em <todos os idiomas> .
— manatwork

Você deve adicionar a versão golfed antes o ungolfed
— Sefa

Você está assumindo que a matriz está atribuída a uma variável predefinida ( n), que não permitimos. Bem-vindo ao PPCG, embora :)
— Shaggy

Aqui está uma versão de 59 bytes .
— Shaggy




0

Pip -rn , 14 bytes

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

Toma números de entrada em linhas sucessivas de stdin; fornece números de saída em linhas sucessivas de stdout. Experimente online!

Explicação

             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)

Ou, usando um exemplo trabalhado:

             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 bytes

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

Experimente online!

Eu sou novo no golfe em Perl 6, então tenho certeza que isso pode ser mais curto. Não é mais novo, e de volta ao golfe isso!

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.