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 ji+1:i+A[i])for i1: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[il*sum(A)for i1: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.