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 0
e faz incrementos 1
até 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é n
ser alcançado. A sequência terminará em positivo n
se n
for ímpar e negativo n
se n
for 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 = 1
daria então 0 1 0 -1 -2
.
Isso é código-golfe , então o código mais curto em cada idioma vence! As explicações são incentivadas como sempre!
Respostas:
R ,
5854504843 bytes-2 bytes graças ao MickyT
Experimente online!
fonte
Perl 6 ,
6026 bytesTente
Tente
Expandido:
(-1,-*...*)Z*0..$_
gera a sequência0 1 -2 3 -4 5
fonte
Python 2 ,
695756 bytesExperimente online!
Para cada um
n
até oinput
orange(-n,n)
(inclusive), é calculado, invertida quandon
é um número par, tem o punho dois números (após a inversão) removido, e, em seguida, anexado à saída.fonte
05AB1E ,
97 bytesGuardado 2 bytes graças a @Emigna
Experimente online!
Minha primeira resposta 05AB1E (eu acho), então posso estar perdendo alguns truques ...
Explicação
Tenho que agradecer @ Dennis para o uso original de
Ÿ
, caso contrário eunão pode, provavelmente, nunca teria conhecido sobre isso ...fonte
ÝεDÈi®*}}Ÿ
sem checar,ā®sm
é louco haha inteligente.05AB1E ,
1514 bytesExperimente online!
Explicação
fonte
JavaScript (ES6), 56 bytes
Experimente online!
Comentado
fonte
Haskell , 43 bytes
Experimente online!
Calcula as somas acumuladas negadas da lista
[(-1)^k|k<-[1..n],_<-[2..2*k]]
, que são as primeirasn
linhas defonte
Geléia ,
119 bytesExperimente online!
Como funciona
fonte
Haskell ,
4842 bytesExperimente online!
Graças a Οurous por -1 byte
Mesmo sendo óbvio em retrospectiva, demorei um pouco para chegar a
(-1)^i*x
qual éx
quandoi
é par e-x
quandoi
é estranho. Iterações anteriores em que:fonte
1-i
vez de-i+1
na..
expressão.C # (.NET Core) ,
300167 bytesEu 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.
Experimente online!
fonte
using
instruçõ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).[](){};.
) e(n-1)*2
apenas,2*n-2
com algum rearranjo, você pode remover os parênteses.!=
tem precedência menor que a de%
que você pode remover um par de parênteses. E você pode usar em>0
vez de `! = 0, salva um byte.static int[] f(int n)
pode tornar-sef=n=>
usando um lambda (recursivo) e(n-1)*2
pode~-n*2
economizar entre parênteses. Eu reduzi para 155 (137 + 18) bytes: Experimente online . Os 18 bytes são parausing System.Linq;
, porque as importações necessárias são obrigatórias para a contagem de bytes. Aproveite sua estadia!J , 25 bytes
-5 bytes graças ao FrownyFrog!
Experimente online!
J , 30 bytes
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 ai
potê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 listaExperimente online!
fonte
n
versão baseada em zero ? por exemplo*:{.;@([:(i:@*_1&^)&.>i.)
.. a especificação permite que$
para o cut-off, não há necessidade&.>
porque*
é o rank 0.Python 2 ,
6556 bytesO formato de saída é um pouco feio. : /
Experimente online!
fonte
Java 8,
858379 bytes-6 bytes graças a @ OlivierGrégoire .
Experimente online.
Explicação:
fonte
j
).i
subir em vez de descer para remover um redundanten*n
.R ,
48 4642 bytesExperimente 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+1
pode ser substituído por,,n^2+1
; ou por0:n^2+1
(argumento posicionalxout
) para a mesma contagem de bytes:R , 56 bytes
Experimente online!
fonte
approx
funcionará aqui de maneira semelhante à solução Octave de Luis Mendo.diffinv
eapprox
a partir desta pergunta ...~
não funciona como um operador de complemento :(), você ainda pode salvar outros 2 bytes alternando para um programa completo.APL (Dyalog Unicode) , 17 bytes
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
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
+\⍣¯1
denota a soma cumulativa inversaExiste 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 +
fonte
+\0,¯1*⍳(/⍨)1+2×⍳
é 17Haskell , 47 bytes
Experimente online!
fonte
Java (JDK 10) , 98 bytes
Experimente online!
fonte
MATL ,
1715 bytes-2 bytes graças a Luis Mendo!
Experimente online!
Explicação para
n=3
:fonte
Oitava ,
444241 bytes2 bytes removidos graças a @StewieGriffin e 1 byte adicional removidos graças a @Giuseppe!
Experimente online!
fonte
Ruby ,
5247 bytesExperimente online!
Abaixo está a versão original de 52 bytes, com uma explicação:
Experimente online!
Passo a passo
fonte
map(&:-@)
parte?-r
.Prolog (SWI) , 113 bytes
Experimente online!
fonte
Python 3, 83 bytes
fonte
Casca ,
1817 bytesExperimente online!
fonte
Carvão , 19 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Explicação alternativa:
Faça um loop sobre os números inteiros de
0
para 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.
fonte
Geléia ,
1112 bytesBah, eu pensei que tinha 11 wih
_2+ỊrN)N;¥/
Experimente online!
Quão?
fonte
Stax , 10 bytes
Execute e depure
fonte
Scala, 119 bytes
Ungolfed:
Provavelmente isso pode ser bem melhor, mas eu queria uma solução utilizando Streams preguiçosos.
fonte
APL (Dyalog Unicode) ,
3432 bytesExperimente online!
Requer
⎕IO←0
-2 bytes graças a @FrownyFrog
fonte
Empilhados , 44 bytes
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#behead
faz.)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 longo1
e-1
repetido 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)
2
subtraindo-os1
. Isso fornece1
s e s alternados-1
para 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. ^ - ^
fonte
Julia 0.6 , 44 bytes
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.
4947 bytesExperimente online!
fonte