A sequência contém a representação decimal dos números binários da forma:, em 10101...
que o n-ésimo termo tem n bits.
A sequência é provavelmente mais fácil de explicar, mostrando apenas os relacionamentos entre as representações binária e decimal dos números:
0 -> 0
1 -> 1
10 -> 2
101 -> 5
1010 -> 10
10101 -> 21
101010 -> 42
Desafio:
Pegue um número inteiro de entrada n
e retorne os primeiros n números na sequência. Você pode optar por ter a sequência indexada em 0 ou 1.
Casos de teste:
n = 1 <- 1-indexed
0
n = 18
0, 1, 2, 5, 10, 21, 42, 85, 170, 341, 682, 1365, 2730, 5461, 10922, 21845, 43690, 87381
As explicações são incentivadas, como sempre.
Este é o OEIS A000975 .
[85,[42,[21,[10,[5,[2,[1,0]]]]]]]
?Respostas:
Python 2 , 36 bytes
Experimente online! Explicação: A representação binária de éassim, resta simplesmente multiplicá-lo por uma potência apropriada de 2 e tomar a parte inteira.23
0.101010101...
fonte
05AB1E , 4 bytes
2 bytes salvos usando o truque 2/3 de Neil
Experimente online!
Explicação
05AB1E , 6 bytes
Experimente online!
Explicação
fonte
Gelatina ,
...4 bytesGraças milhas por -1 byte!
Experimente online!
Explicação:
Gelatina , 4 bytes
Versão de Jonathan Allan.
Experimente online!
Uma versão baseada no truque 2/3 de Neil fornece 5 bytes, consulte o histórico de revisões.
fonte
ḶḂḄƤ
o prefixo quick foi criado para issoḶ€ḂḄ
também funcionaria.MATL , 5 bytes
Baseado na resposta de Neil .
Explicação
Experimente online!
MATL , 9 bytes
Experimente online!
Explicação
fonte
Python 2 ,
453736 bytes-3 bytes graças a user202729
-1 byte graças a mathmandan
Experimente online!
fonte
s
é o mesmo que adicionars
a si próprio, por isso acredito que você poderia fazers+=s+~s%2
para salvar um byte.Python 3,
6861544843 bytesAgradecemos a user202729 por ajudar a salvar 19 bytes e ovs por ajudar a salvar 6 bytes.
Experimente Online
fonte
x == 0
é equivalente anot x
sex
for um número inteiro, troque os operandos (isto é,x if c else y
=y if not c else x
) economizarão mais alguns bytes.i%2
e usar em1-r%2
vez dissoi
.Casca , 7 bytes
Experimente online!
Com base em 1, a entrada n fornece os primeiros n resultados.
Explicação
fonte
APL (Dyalog Unicode) , 11 bytes SBCS
Assume
⎕IO
( I ndex O rigin) como sendo0
, o padrão em muitos sistemas. Função de prefixo tácito anônimo. 1 indexado.Experimente online!
⍳
ɩ ndices 0 ... n-1(
…)¨
Aplique a seguinte função tácita a cada⍴∘1 0
remodelar ciclicamente a lista[1,0]
com esse comprimento2⊥
converter do número base-2 (binário) para o normalfonte
Perl
v5.10
-n
, 24 + 1 bytes-3 bytes graças a Nahuel Fouilleul !
Experimente online!
Mesma lógica da minha versão do Ruby, mas mais curta porque o perl é mais conciso. Por alguma estranha razão,
print
não faria um separador (caramba!), Então eu tive que usarsay
fromv5.10;
para que isso funcionasse, não sei como pontuar isso, então estou deixando de fora por enquanto ?. ..Explicação
fonte
-n
) = 28 bytes, porque para executar um liner perl, deve-se usar-e
e usar 5.10, você só precisa usar-E
, que é do mesmo comprimento$|--
vez de($.^=1)
Haskell , 33 bytes
Experimente online!
fonte
APL (Dyalog) , 7 bytes
Experimente online!
APL (Dyalog) , 11 bytes
Experimente online!
Usos
⎕IO←0
.fonte
⎕IO←0
(mas afirme que é 1 indexado!) E mude0,
para1+
:(2⊥2|⍳)¨1+⍳
C ,
81 5559 bytes1 indexado.
Programa completo, menos golfe:
Experimente online!
EDIÇÃO 2: Eu assumi que as funções não precisavam ser reutilizáveis agora que penso nisso; faz todo o sentido que elas precisem ser reutilizáveis: P
Edição: Eu estava sob o equívoco de que eu tinha que incluir todo o programa na resposta, acontece que eu só precisava da função que faz isso. Isso é bom.
Tenho certeza de que posso raspar alguns bytes aqui e ali. Eu já empreguei alguns truques. Uma grande parte do programa é dedicada a obter o argumento e transformá-lo em um int. Este é o meu primeiro código de golfe. Se estou fazendo algo errado, diga-me: P
fonte
i++
e alterandoi&1
parai++&1
. Além disso, embora como variáveis globaisi
ej
sejam inicializadas com zero inicialmente, elas precisam ser inicializadas dentro da função, porque os envios de funções precisam ser reutilizáveis .i,j;f(c){for(i=j=0;i<c;)printf("%d ",j+=j+i++%2);}
Experimente online!Haskell ,
47405349444034 bytes-4 bytes graças ao usuário202729
-6 bytes graças a Laikoni
Experimente online!
fonte
otherwise
por exemplo1>0
(otherwise == True
))Ruby , 26 bytes
Experimente online!
Supera todas as respostas ruby mais antigas.
Explicação
1/3
em binário parece0.01010101...
, então, se você o multiplicar por potências de dois, obtém:Mas Ruby calcula os números na divisão int, fornecendo a sequência que eu preciso.
fonte
J , 9 bytes
Como funciona?
i.
- lista 0..n-12|
- os itens da lista mod 2\
- todos os prefixos#.
- para decimal[:
- bata o garfo (como eu tenho o número par (4) de verbos)Experimente online!
fonte
Retina , 28 bytes
Experimente online!
Com base em 0, então a entrada n fornece os primeiros n + 1 resultados.
Explicação
Usa a recursão do OEIS:
Vamos seguir o programa:
Este é um estágio constante: descarta a entrada e define a cadeia de trabalho como
0
o valor inicial da sequência. O)
quebra esta fase em um grupo. Esse grupo em si não faz nada, mas quase todas as etapas (incluindo as de grupo) registram o resultado em um log, e precisaremos de duas cópias0
desse log para que o programa funcione.Há várias configurações aqui:
"$+"+
envolve o palco em um loop. O"$+"
é tratado como uma substituição e$+
refere-se à entrada do programa, ou seja, n . Isso significa que o loop é executado n vezes.Em seguida,
¶<
agrupa cada iteração em um estágio de saída, que imprime a entrada do estágio com um avanço de linha à direita (para que a primeira iteração imprima o zero, a segunda iteração imprima o resultado da primeira iteração e assim por diante).O estágio em si substitui toda a cadeia de trabalho pela substituição na última linha. Esse utiliza um parêntese de fechamento implícito e argumentos implícitos para o operador de repetição
*
, portanto, é realmente a abreviação de:O material dentro dos parênteses pode ser dividido em três partes:
$&*_
: fornece uma sequência de a (n-1)_
s._
: dá um único_
.2*$-1*_
: fornece uma sequência de 2 * a (n-1)_
. O$-1
refere-se ao penúltimo resultado no log de resultados, ou seja, a iteração do loop antes do último. É por isso que precisamos fazer cópias do zero no log, caso contrário, isso se refere à entrada do programa na primeira iteração.Em seguida,
$.(…)
mede o comprimento da sequência resultante. Em outras palavras, calculamosa(n) = a(n-1) + 1 + 2*a(n-2)
passando por unário (na verdade, não:$.(…)
é preguiçoso e, na verdade, não avalia seu conteúdo, se é possível determinar o comprimento resultante diretamente por meio da aritmética, portanto isso é bastante eficiente).O resultado da iteração final do loop (o n + 1 o elemento da sequência) é impresso devido à saída implícita de Retina no final do programa.
fonte
Brain-Flak , 36 bytes
Experimente online!
Explicação:
O próximo número na sequência é obtido por
n*2+1
oun*2+0
.fonte
Ruby
42 41 43 41 37 35 31 3330 bytes-2 bytes graças ao Unihedron
-3 bytes graças a GB
Experimente online!
fonte
->x{a=0;x.times{a-=~a+p(a)%2}}
> <> , 22 + 3 bytes (sinalizador -v)
Experimente online!
Explicação
A pilha é inicializada com o contador de loop.
fonte
Java 8,
115818052 bytesPorto da resposta Python 2 de @Neil .
1 indexado e emitido diretamente, cada valor em uma linha separada.
Explicação:
Experimente online.
Resposta antiga de 80 bytes:
Entrada indexada em 1 e
String
saída delimitada por espaçoExplicação:
Experimente online.
fonte
Perl 6 ,
35 30 27 2520 bytesExperimente (35)
Experimente (30)
Experimente (30)
Experimente (27)
Experimente (25)
Experimente (20)
Expandido:
fonte
Python 2 , 33 bytes
Experimente online!
Python 2 , 34 bytes
Experimente online!
Retorna na ordem inversa.
fonte
C,
4746 bytesO acumulador
a
começa com zero. Em cada etapa, dobramos (a+=a
) e adicionamos um se o bit menos significativo anterior era zero (!(a%2)
ou equivalente-(~a)%2
).Programa de teste
Resultados
fonte
Japonês ,
10976 bytesTodos derivados independentemente de outras soluções.
1 indexado.
Tente
Explicação
Tente
Versão de 7 bytes
Tente
Versão de 9 bytes
Tente
fonte
Haskell , 52 bytes
Experimente online!
fonte
MATL , 7 bytes
Experimente online!
Explicação:
A saída seria
0, 1, 2, 5 ...
seP
foi adicionada ao final (flip
), tornando-o em 8 bytes.fonte
&+
Ruby
-n
,32.30 + 1 bytesComo temos exatamente 1 linha de entrada,
$.
é muito conveniente!EDIT: Estou surpreso por ter conseguido me superar, mas parece usar o
-n
que conta como 1 (pela regra 2 em condições especiais padrão , pois o Ruby pode ser executado comruby -e 'full program'
(portanto,-n
é 1) todas as instânciasgets
usadas apenas uma vez Seja um jogador de golfe dessa maneira; acredito que esse é um marco para o ruby, fale se você não concorda com essa linha de pensamento antes de reutilizá-la repetidamente no futuro)Experimente online!
Explicação
fonte
AWK
a=0
, 31 bytesExperimente online!
Usa a fórmula roubada descaradamente desta outra resposta Ruby.
Apesar de não ter
a=0
iria trabalhar (awk trata "vazio" como 0), o primeiro elemento de 0 não vai ficar impresso e em vez disso ser umaempty
linha, que enquanto eu diria é uma saída válida provavelmente não vai passar, então não háa=0
o que pode ser inserido como argumento de linha de comando.fonte
C, 52 bytes
Indexado 1
Experimente online!
fonte
brainfuck , 40 bytes
Experimente online!
Indexado a 0. Entrada como código de caractere, saída como unário com bytes nulos que separam séries de códigos de caracteres 1s. Assume células de 8 bits, a menos que você queira inserir mais de 255. Assume células negativas, embora isso possa ser corrigido à custa de vários bytes.
Anteriormente, 50 bytes
Experimente online!
Entradas como código de caracteres, saídas como código de caracteres. 1 indexado. Provavelmente poderia jogar um pouco de golfe.
O @Unihedron aponta que eu esqueci de especificar que isso precisa de células de tamanho infinito, caso contrário, ele chega ao 8º número.
fonte