Para cima e para baixo, para cima e para baixo


34

Desafio:

Dada uma entrada inteira positiva n , crie um vetor que siga este padrão:

0  1  0 -1 -2 -1  0  1  2  3  2  1  0 -1 -2 -3 -4 -3 -2 -1 ... ±(n-1) ±n

Ou, explicado com palavras: o vetor começa em 0e faz incrementos 1até atingir o menor número inteiro positivo ímpar que não faz parte da sequência; em seguida, faz decrementos até atingir o menor número inteiro (em magnitude) mesmo negativo que seja faz parte da sequência. Continua assim até nser alcançado. A sequência terminará em positivo nse nfor ímpar e negativo nse nfor par.

O formato de saída é flexível.

Casos de teste:

n = 1
0  1
-----------
n = 2
0  1  0 -1 -2
-----------
n = 3
0  1  0 -1 -2 -1  0  1  2  3
-----------
n = 4
0  1  0 -1 -2 -1  0  1  2  3  2  1  0 -1 -2 -3 -4
-----------
n = 5
0  1  0 -1 -2 -1  0  1  2  3  2  1  0 -1 -2 -3 -4 -3 -2 -1  0  1  2  3  4  5

Você pode escolher entre n indexados a zero. n = 1daria então 0 1 0 -1 -2.

Isso é , então o código mais curto em cada idioma vence! As explicações são incentivadas como sempre!


Respostas:


10

R , 58 54 50 48 43 bytes

-2 bytes graças ao MickyT

function(n)diffinv(rep(1:n%%2*2-1,1:n*2-1))

Experimente online!

function(n)
 diffinv(                           # take cumulative sum, starting at 0 of
             1:n%%2*2-1,            # a vector of alternating 1,-1
         rep(                       # repeated
                        1:n*2-1))   # 1, 3, 5, etc. times


8

Perl 6 ,  60  26 bytes

{flat {((1,-*...*)ZX*(-$++...0...$++)xx$_)}(),$_*($_%2||-1)}

Tente

{[...] (-1,-*...*)Z*0..$_}

Tente

Expandido:

{  # bare block lambda with implicit parameter $_

  [...]  # reduce using &infix:«...» (sequence generator)

          ( -1, -* ... * ) # (-1, 1, -1, 1 ... *)

      Z*                   # zip multiplied with

          0 .. $_          # range up to and including input
}

(-1,-*...*)Z*0..$_ gera a sequência 0 1 -2 3 -4 5


7

Python 2 , 69 57 56 bytes

f=lambda n:[0][n:]or f(n-1)+range(-n,n+1)[::n%2*2-1][2:]

Experimente online!

Para cada um n até o inputo range(-n,n)(inclusive), é calculado, invertida quando né um número par, tem o punho dois números (após a inversão) removido, e, em seguida, anexado à saída.


7

05AB1E , 9 7 bytes

Guardado 2 bytes graças a @Emigna

Ýā®sm*Ÿ

Experimente online!

Minha primeira resposta 05AB1E (eu acho), então posso estar perdendo alguns truques ...

Explicação

Ý         # push range [0 ... n]   stack: [[0 ... n]]
 ā        # push range [1 ... len(prev)]  [[0 ... n], [1 ... n+1]]
  ®       # push value of register        [[0 ... n], [1 ... n+1], -1]
   s      # swap top two values           [[0 ... n], -1, [1 ... n+1]]
    m     # power                         [[0 ... n], [-1, 1, -1, 1, ...]]
     *    # multiply                      [[0, 1, -2, 3, -4, 5, ...]]
      Ÿ   # range interpolation           [[0, 1, 0, -1, -2, -1, ...]]

Tenho que agradecer @ Dennis para o uso original deŸ , caso contrário eu não pode , provavelmente, nunca teria conhecido sobre isso ...


Agradável :)! Eu fiquei ÝεDÈi®*}}Ÿsem checar, ā®smé louco haha ​​inteligente.
Magic Octopus Urn

6

05AB1E , 15 14 bytes

ÝDÉ·<*Ý€û˜ÔsF¨

Experimente online!

Explicação

Ý                # push range [0 ... n]
 D               # duplicate
  É·<            # (x % 2 == 1)*2-1 for each
     *           # multiply
      Ý          # range [0 ... a] for each
       €û        # palendromize each
         ˜       # flatten
          Ô      # connected uniqueified
           sF¨   # remove the last n elements

6

JavaScript (ES6), 56 bytes

f=(n,b=d=1,k=0)=>[k,...k-d*n?f(n,k-b?b:(d=-d)-b,k+d):[]]

Experimente online!

Comentado

f = (               // f = recursive function taking:
  n,                //   n = input
  b =               //   b = boundary value, initialized to 1
  d = 1,            //   d = current direction, initialized to 1
  k = 0             //   k = current sequence value, initialized to 0
) =>                //
  [                 // update the sequence:
    k,              //   append the current value
    ...k - d * n ?  //   if |k| is not equal to |n|:
      f(            //     append the (spread) result of a recursive call:
        n,          //       use the original input
        k - b ?     //       if k has not reached the boundary value:
          b         //         leave b unchanged
        :           //       else:
          (d = -d)  //         reverse the direction
          - b,      //         and use a boundary of higher amplitude and opposite sign
        k + d       //       update k
      )             //     end of recursive call
    :               //   else:
      []            //     stop recursion and append nothing
  ]                 // end of sequence update

6

Haskell , 43 bytes

f n=scanl(-)0[(-1)^k|k<-[1..n],_<-[2..2*k]]

Experimente online!

Calcula as somas acumuladas negadas da lista [(-1)^k|k<-[1..n],_<-[2..2*k]], que são as primeiras nlinhas de

[-1,
 +1, +1, +1,
 -1, -1, -1, -1, -1,
 +1, +1, +1, +1, +1, +1, +1

6

Geléia , 11 9 bytes

²Ḷƽ-*0;Ä

Experimente online!

Como funciona

²Ḷƽ-*0;Ä  Main link. Argument: n

²          Square; yield n².
 Ḷ         Unlength; yield [0, ..., n²-1].
  ƽ       Take the integer square root of each k in the range.
    -*     Compute (-1)**r for each integer square root r.
      0;   Prepend a zero.
        Ä  Accumulate; take the sums of all prefixes.

6

Haskell , 48 42 bytes

f n=0:[(-1)^i*x|i<-[0..n-1],x<-[1-i..i+1]]

Experimente online!

Graças a Οurous por -1 byte

Mesmo sendo óbvio em retrospectiva, demorei um pouco para chegar a (-1)^i*xqual é xquando ié par e -xquando ié estranho. Iterações anteriores em que:

(-1)^i*x
x-2*mod i 2*x
(-1)^mod i 2*x
[x,-x]!!mod i 2
(1-sum[2|odd i])*x

1
Você pode salvar um byte usando em 1-ivez de -i+1na ..expressão.
Οurous

4

C # (.NET Core) , 300  167 bytes

Eu nunca fiz nada disso antes, mas este parecia divertido. Entendo por que as pessoas usam esses idiomas de "golfe", pois o 167 parece muito mais alto do que algumas das outras respostas. Mas você precisa seguir o que sabe.

static int[] f(int n){if (n==1) return new int[]{0,1};var a=f(n-1);return a.Concat(a.Skip(a.Length-(n-1)*2).Select(x=>-x)).Concat(new int[]{(n%2)!=0?n:-n}).ToArray();}

Experimente online!

// Recursive Worker Function
static public int[] f( int n )
{
    // Start with the simple case
    if ( n == 1 ) return new int[]{0,1};

    // Recusively build off of that
    var a = f(n-1);

    // To be added at the end
    int[] b = { (n%2) !=0 ? n : -n };

    // Skip some based on length
    int s = a.Length - (n-1)*2;

    // With the rest, multiply by -1 and then append to the end
    // And append the part
    return a.Concat( a.Skip(s).Select( x => -x ) ).Concat( b ).ToArray();
}

1
Você pode tornar isso muito mais curto se contar apenas as usinginstruções e a função. Isso é permitido por padrão, a menos que o desafio especifique que deve ser um programa completo (mesmo que existisse, você poderia reduzir o nome da classe que o continha).
Οurous

Obrigado! Graças à sua sugestão, descobri o significado das seções "cabeçalho" e "rodapé" do site do TIO. Isso cortou meu tamanho de envio pela metade!
Darrin Cullop

2
Bem-vindo ao PPCG! (parece sua primeira postagem.) Não se preocupe com os outros idiomas, apenas tente ser o melhor possível no seu idioma. / Dicas: Remova espaços desnecessários. Em C #, você pode remover todos os espaços ao redor dos símbolos ( [](){};.) e (n-1)*2apenas, 2*n-2com algum rearranjo, você pode remover os parênteses.
User202729 18/0418

Além disso, !=tem precedência menor que a de %que você pode remover um par de parênteses. E você pode usar em >0vez de `! = 0, salva um byte.
User202729 18/0418

1
Também de mim: bem-vindo ao PPCG! Dicas para jogar golfe em C # e Dicas para jogar golfe em todos os idiomas podem ser interessantes para ler. :) Quanto a algumas dicas de golfe: static int[] f(int n)pode tornar-se f=n=>usando um lambda (recursivo) e (n-1)*2pode ~-n*2economizar entre parênteses. Eu reduzi para 155 (137 + 18) bytes: Experimente online . Os 18 bytes são para using System.Linq;, porque as importações necessárias são obrigatórias para a contagem de bytes. Aproveite sua estadia!
Kevin Cruijssen

4

J , 25 bytes

-5 bytes graças ao FrownyFrog!

>:@*:$i.;@(<@i:@*_1&^)@,]

Experimente online!

J , 30 bytes

>:@*:{.;@([:(i:@*_1&^)&.>i.,])

Explicação:

i.,] cria a lista 0..n

&.> para cada número da lista, execute o verbo em (...) e marque o resultado (preciso de boxe, porque os resultados têm tamanho diferente)

[:( _1&^)encontre -1 para a ipotência th (-1 ou 1)

i:@* faça uma lista -n..n ou n ..- n, dependendo do sinal do item acima

;@ unbox

>:@*: encontre n ^ 2 + 1

}. e pegue tantos números da lista

Experimente online!


1
você consideraria escrever o mesmo código que uma nversão baseada em zero ? por exemplo *:{.;@([:(i:@*_1&^)&.>i.).. a especificação permite que
jayprich 28/05

"n = 1 daria 0 1 0 -1 -2"
FrownyFrog

@FrownyFrog - Hmm, eu não verifiquei. Voltei à minha primeira solução. Obrigado pela observação!
Galen Ivanov

1
25 Use $para o cut-off, não há necessidade &.>porque *é o rank 0.
FrownyFrog


3

Java 8, 85 83 79 bytes

n->{for(int p=0,i=0;i<=n*n;p+=1-(int)Math.sqrt(i++)%2*2)System.out.println(p);}

-6 bytes graças a @ OlivierGrégoire .

Experimente online.

Explicação:

n->{                            // Method with integer parameter and no return-type
  for(int p=0,                  //  Set both `p` to 0
      i=0;i<=n*n;               //  Loop `i` in the range [0, `n*n`]
      p+=                       //    After every iteration, increase `p` by:
         1-                     //     1, minus:
           (int)Math.sqrt(i++)  //     The square-root of `i`, truncated to its integer
           %2*2)                //     Modulo 2, and multiplied by 2
     System.out.println(p);}    //   Print integer `p` with a trailing new-line

Boa abordagem. Eu estava trabalhando nessa abordagem agora, para melhorar minha resposta, mas você me venceu (apesar da sua reunião), muito bem! ;-)
Olivier Grégoire

1
83 bytes (acabei de remover j).
Olivier Grégoire

1
79 bytes : eu fiz isubir em vez de descer para remover um redundante n*n.
Olivier Grégoire

Oi. Escrevendo isso para me informar que basicamente rasguei sua resposta. (porta para JavaScript). Espero que esteja tudo bem #
Muhammad Salman

@MuhammadSalman Sure, np. Também recebo respostas de outras pessoas com bastante frequência. :) Contanto que a resposta original seja mencionada, como você fez, tudo bem por mim.
Kevin Cruijssen

3

R , 48 46 42 bytes

for(i in 1:scan())F=c(F,-(-1)^i*(2-i):i);F

Experimente online!

Uma porta do Ruby responde por Kirill L. - e salvou 6 bytes graças ao mesmo Kirill L.! Agora menor que a solução de Giuseppe ;)

Um porto dessa resposta de Oitava de Luis Mendo usando approxé menos golfe. n=n^2+1pode ser substituído por ,,n^2+1; ou por 0:n^2+1(argumento posicional xout) para a mesma contagem de bytes:

R , 56 bytes

f=function(n)approx((0:n)^2+1,-(-1)^(0:n)*0:n,n=n^2+1)$y

Experimente online!


Acho que approxfuncionará aqui de maneira semelhante à solução Octave de Luis Mendo.
Giuseppe

@Giuseppe Thanks! Funciona embora seja mais longo. Eu aprendi diffinve approxa partir desta pergunta ...
Jayce

Embora eu também não conheça uma maneira mais eficiente de fazer -1 de energia (no R ~não funciona como um operador de complemento :(), você ainda pode salvar outros 2 bytes alternando para um programa completo.
Kirill L.

... e como é um programa completo, também podemos usar e estragar um built-in predefinido: 42 bytes - finalmente, mais curto que o de Giuseppe!
precisa

3

APL (Dyalog Unicode) , 17 bytes

+\01*⍳(/⍨)1+2×⍳

Experimente online!

Golpeou 2 bytes graças a @FrownyFrog convertendo-o em um trem. Veja a resposta mais antiga e sua explicação abaixo.


APL (Dyalog Unicode) , 19 bytes

+\0,∊⊢∘-\⍴1¨1+2×⍳⎕

Experimente online!

(Usos ⎕IO←0)

Minha primeira abordagem foi construir vários intervalos e concatená-los juntos, isso facilmente ultrapassou os 30 bytes. Então eu comecei a analisar a sequência

      +\⍣¯10  1  0 ¯1 ¯2 ¯1  0  1  2  3  2  1  0 ¯1 ¯2 ¯3 ¯4
0 1 ¯1 ¯1 ¯1 1 1 1 1 1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1

+\⍣¯1 denota a soma cumulativa inversa

Existe um padrão de repetição de 1s e ¯1s, em que o comprimento de cada sequência consecutiva de 1s ou ¯1s é 1 + 2 × n. E cada subsequência alterna entre 1 e ¯1. O que posso fazer agora é criar a lista 1s e ¯1s e, em seguida, digitalizar com +

      4  creates range 0..4
0 1 2 3
      2×⍳4
0 2 4 6
      1+2×⍳4
1 3 5 7
      ⍴∘1¨1+2×⍳4  for-each create that many 1s
┌─┬─────┬─────────┬─────────────┐
11 1 11 1 1 1 11 1 1 1 1 1 1
└─┴─────┴─────────┴─────────────┘
      ⊢∘-\⍴1¨1+2×⍳4  alternate signs
┌─┬────────┬─────────┬────────────────────┐
1│¯1 ¯1 ¯11 1 1 1 1│¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
└─┴────────┴─────────┴────────────────────┘
      ∊⊢∘-\⍴1¨1+2×⍳4  flatten
1 ¯1 ¯1 ¯1 1 1 1 1 1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
      0,∊⊢∘-\⍴1¨1+2×⍳4
0 1 ¯1 ¯1 ¯1 1 1 1 1 1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
      +\0,∊⊢∘-\⍴1¨1+2×⍳4  cumulative sum
0 1 0 ¯1 ¯2 ¯1 0 1 2 3 2 1 0 ¯1 ¯2 ¯3 ¯4

Verificando outras respostas agora, vejo que muitas também usam o método + \, mas gere a sequência de 1s e 1s com ¯1 * ⌊.5 * ⍨ × ⍨⍳, que passa a ser pelo menos 3 bytes mais curto.
Kritixi Lithos

+\0,¯1*⍳(/⍨)1+2×⍳é 17
FrownyFrog

Eu sabia que minha solução parecia longa
Zacharý 20/05/19



2

MATL , 17 15 bytes

-2 bytes graças a Luis Mendo!

0i:oEqG:EqY"Ysh

Experimente online!

Explicação para n=3:

0		% push 0
 i:		% read input as integer, push range
		% stack: [0, [1 2 3]]
   o		% modulo 2, stack: [0, [1 0 1]]
    Eq		% double and decrement, stack: [0, [1 -1 1]]
      G:	% push input and range again
		% stack: [0, [1 -1 1], [1 2 3]]
        Eq	% double and decrement,
		% stack: [0, [1 -1 1], [1 3 5]]
	  Y"	% run-length decoding
		% stack: [0, [1 -1 -1 -1 1 1 1 1 1]]
	    Ys	% cumulative sum
		% stack: [0, [1  0 -1 -2 -1  0  1  2  3]]
	      h	% horizontally concatenate
		% end of program, automatically print the stack


2

Ruby , 52 47 bytes

f=->n{n<1?[0]:f[n-1]+(2-n..n).map{|x|-~0**n*x}}

Experimente online!

Abaixo está a versão original de 52 bytes, com uma explicação:

f=->n{n<1?[0]:f[n-1]+[(r=*2-n..n).map(&:-@),r][n%2]}

Experimente online!

Passo a passo

f=->n{           #Recursive approach
 n<1?[0]         #Init with 0 if n=0
 :f[n-1]         #else make a recursive call
 +               #and append an array of numbers
 [(r=*2-n..n)    #Init r as splatted range from 2-n to n
 .map(&:-@)      #"-@" is unary minus, so this a fancy way to do map{|x|-x} for -1 byte
                 #For even n use this negated r, e.g. for n=4: [2, 1, 0, -1, -2, -3, -4]
 ,r]             #For odd n use r directly, e.g. for n=3: [-1, 0, 1, 2, 3]
 [n%2]           #Odd/even selector
}

Eu não sei Ruby - você pode explicar o que isso faz especialmente a map(&:-@)parte?
21418 JayCe

@JayCe Adicionada uma explicação. Basicamente, isso é apenas negação, o que em R seria simplesmente -r.
19418 Kirill L.

Obrigado pela explicação - que me ajudou a porta isso R.
Jayce


1

Python 3, 83 bytes

def c(n):print([(-1)**j*(abs(j-i)-j)for j in range(n+1)for i in range(2*j)][:-n+1])


1

Carvão , 19 bytes

F⊕NI×∨﹪ι²±¹…·∧ι⁻²ιι

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

  N                 Input as a number
 ⊕                  Increment
F                   Loop over implicit range
                ²   Literal 2
                 ι  Current index
               ⁻    Subtract
              ι     Current index
             ∧      Logical And
                  ι Current index
           …·       Inclusive range
       ι            Current index
        ²           Literal 2
      ﹪             Modulo
          ¹         Literal 1
         ±          Negate
     ∨              Logical Or
    ×               Multiply
   I                Cast to string and implicitly print

Explicação alternativa:

F⊕N

Faça um loop sobre os números inteiros de 0para a entrada inclusive.

Transforme os resultados em sequência antes de imprimir.

×∨﹪ι²±¹

Negue conjuntos alternativos de resultados.

…·∧ι⁻²ιι

Forme uma lista do índice anterior para o índice atual, excluindo o índice anterior.


1

Geléia ,  11  12 bytes

Bah, eu pensei que tinha 11 wih _2+ỊrN)N;¥/

_2+ỊrN×-*$)Ẏ

Experimente online!

Quão?

_2+ỊrN×-*$)Ẏ - Main Link: n           e.g. 4
          )  - for x in [1...n]:           1       2          3               4
_2           -   subtract 2 from x        -1       0          1               2
   Ị         -   is x insignificant?       1       0          0               0
  +          -   add                       0       0          1               2
     N       -   negate x                 -1      -2         -3              -4
    r        -   inclusive range          [0,-1]  [0,-1,-2]  [1,0,-1,-2,-3]  [2,1,0,-1,-2,-3,-4]
         $   -   last two links as a monad:
       -     -     minus one              -1      -1         -1              -1
        *    -     raised to the power x  -1       1         -1               1
      ×      -   multiply                 [0,1]   [0,-1,-2]  [-1,0,1,2,3]    [2,1,0,-1,-2,-3,-4]
           Ẏ - tighten                    [0,1,0,-1,-2,-1,0,1,2,3,2,1,0,-1,-2,-3,-4]


1

Scala, 119 bytes

def a(n: Int)={lazy val s:Stream[Int]=0#::Stream.from(0).map{x=>s(x)+1 -2*(Math.sqrt(x).toInt%2)}
s.take(n*n+1).toList}

Ungolfed:

def a(n: Int)={
  lazy val s:Stream[Int]= 0#::Stream.from(0).map //Give the starting point and indexing scheme
  {
    x=>
    {
      val sign = 1-2*(Math.sqrt(x).toInt%2) //Determine whether we are adding or subtracting at the current index
      s(x)+sign
    }
  }
  s.take(n*n+1).toList //Take the desired values
}

Provavelmente isso pode ser bem melhor, mas eu queria uma solução utilizando Streams preguiçosos.



1

Empilhados , 44 bytes

[~>0\:2%\#,2*1-tr[...rep]flatmap,$sumonpref]

Experimente online! Já faz um tempo desde que eu programei no Stacked, mas acho que ainda entendi.

Alternativas

73 bytes: [0\|>:2%tmo*2 infixes[:...|>\rev...|>rev#,$#'sortby 1#behead]flatmap 0\,]

Isso ocorre com a abordagem "varia de índices gerados" usada na minha resposta do Attache. Isso provou ser bastante longo, uma vez que o Stacked não possui embutidos para intervalos invertidos ou colapso. (Isso é o que :...|>\rev...|>rev#,$#'sortby 1#beheadfaz.)

53 bytes: [0\|>:2%tmo _\tpo#,tr[...rep]flatmap 0\,inits$summap]

... então eu decidi ir para uma abordagem que ao invés disso encontra a soma cumulativa ( inits$summap) ao longo 1e -1repetido pelos inteiros ímpares, como na resposta R .

46 bytes: [~>0\:2%\#,2*1-tr[...rep]flatmap,inits$summap]

... mas percebi que os números inteiros negativos e os números ímpares podiam ser feitos de uma só vez, multiplicando as duas matrizes geradas (os valores do mod 2 do intervalo e o próprio intervalo) 2subtraindo-os 1. Isso fornece 1s e s alternados -1para o primeiro intervalo e números inteiros ímpares para o segundo!

44 bytes: [~>0\:2%\#,2*1-tr[...rep]flatmap,$sumonpref]

... e então lembrei que tinha um builtin para mapear prefixos. ^ - ^


1

Julia 0.6 , 44 bytes

n->[(i%2*2-1)*[0:i;(n>i)*~-i:-1:1]for i=1:n]

Experimente online!

Como o OP menciona "o formato de saída é flexível", isso imprime uma matriz de sub-matrizes, por exemplo. U (3) => [[0, 1], [0, -1, -2, -1], [0, 1, 2, 3]].

i%2*2-1 decide o sinal da sub-matriz atual - negativo para números pares, positivo para ímpar.

[0:i;(n>i)*~-i:-1:1]está em duas partes. 0: i é direto, o intervalo de valores de 0 ao atual i. Na próxima parte, ~ -i: -1: 1 é o intervalo decrescente de i-1 a 1. Mas queremos anexar isso apenas se ainda não estivermos no valor final, portanto, multiplique o limite superior do intervalo por (n> i), para que quando n == i, o intervalo seja 0: -1: 1, que acabe vazio (para que o array pare em n corretamente).


E aqui está uma versão que pode oferecer suporte ao acesso aleatório - o lambda interno aqui retorna o i-ésimo termo da sequência sem precisar ter armazenado nenhum dos termos anteriores. Este também fornece a saída como uma única matriz pura.

49 47 bytes

n->map(i->((m=isqrt(i))%2*2-1)*(m-i+m^2),0:n^2)

Experimente online!

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.