A sequência Baum-Sweet (A086747 com um toque)
Pegue um número inteiro positivo n
e imprima os números inteiros de 1 a n para os quais a sequência Baum-Sweet retorna verdadeira. A sequência Baum-Sweet deve retornar falso se a representação binária do número contiver um número ímpar de zeros consecutivos em qualquer lugar do número e, na verdade, de outra forma. Para mais informações, clique no link. Aqui estão alguns exemplos:
1 -> 1 -> Truthy
2 -> 10 -> Falsy
3 -> 11 -> Truthy
4 -> 100 -> Truthy (Even run of zeros)
Aqui está um exemplo dado n=32
Etapa 1: a sequência Baum-Sweet visualizada para n=32
1 1 (1)
1 0 0 (2)
11 1 (3)
1 00 1 (4)
1 0 1 0 (5)
11 0 0 (6)
111 1 (7)
1 000 0 (8)
1 00 1 1 (9)
1 0 1 0 0 (10)
1 0 11 0 (11)
11 00 1 (12)
11 0 1 0 (13)
111 0 0 (14)
1111 1 (15)
1 0000 1 (16)
1 000 1 0 (17)
1 00 1 0 0 (18)
1 00 11 1 (19)
1 0 1 00 0 (20)
1 0 1 0 1 0 (21)
1 0 11 0 0 (22)
1 0 111 0 (23)
11 000 0 (24)
11 00 1 1 (25)
11 0 1 0 0 (26)
11 0 11 0 (27)
111 00 1 (28)
111 0 1 0 (29)
1111 0 0 (30)
11111 1 (31)
1 00000 0 (32)
Portanto, depois de calcular a sequência Baum-Sweet para n, pegue os números que eram verdadeiros para a sequência e colete-os para o resultado final. Pois n=32
teríamos:
[1, 3, 4, 7, 9, 12, 15, 16, 19, 25, 28, 31]
Como a resposta final.
Isso é código-golfe , a menor contagem de bytes ganha.
code-golf
sequence
base-conversion
binary
Urna de polvo mágico
fonte
fonte
Respostas:
05AB1E ,
109 bytesGuardou um byte graças a Adnan
Experimente online!
Explicação
fonte
ƒ
vez de>G
?.¡
usado;).JavaScript (ES6),
706863 bytesSolução recursiva um pouco mais interessante:
67 bytes graças a @Neil.
g
é a função a ser chamada.fonte
f
é semelhante a uma função que uso ocasionalmente para contar o número de 1 bits em um número.f
falha quandon=0
? Além disso, comof
retorna apenas 0 ou 1, você pode cortar dois bytes usandon&f(n>>1)
.n = 0
não é um caso;).filter
:n=>[...Array(n+1).keys()].filter(f=n=>n<2?n:n%4?n&f(n>>1):f(n/4))
Python 2, 62 bytes
Verifica execuções ímpares de 1s na representação binária dividindo
00
e verificando se há zeros na representação de string da lista resultante. Irritantemente, os números binários começam com0b
um zero que precisa ser removido para evitar um falso positivo.A enumeração é feita recorrendo para baixo.
fonte
Bater,
58., 46 bytesEDITAS:
Golfe
Teste
Explicado
Concha
sed
Experimente Online!
fonte
Lote, 143 bytes
fonte
Perl 6 , 40 bytes
Tente
(
[]
são usados para agrupamento sem captura, com<[]>
usado para classes de caracteres)fonte
PowerShell ,
7961 bytesExperimente online!
Tive inspiração nesta manhã para mudar a maneira como realizo a
-split
operação, e depois ver que é semelhante à forma como a resposta do xnor é construída, então, acho que as grandes mentes pensam da mesma forma?Fazemos loop
1
até a entrada$args[0]
e usamos umWhere-Object
operador para obter os números apropriados|?{...}
. A cláusula é um valor booleano simples - estamos garantindo que esse0
é-notin
o resultado de(...)
.Dentro das parênteses, temos
[convert]::
o número atual$_
ToString
com a base2
(ou seja, transformamos em uma sequência binária). Em seguida, colocamos-split
a string no regex1|00
- esta é uma correspondência gananciosa e resulta em uma matriz de strings (por exemplo,100010
seria transformada em algo'','','0','','0'
assim).Portanto, se todas as execuções de
0
s na cadeia binária forem pares (o que significa que a regex as dividiu em cadeias vazias),0
será-notin
o resultado, portanto aWhere
cláusula é verdadeira e o número é selecionado. Esses números são deixados no pipeline e a saída é implícita.fonte
Python 2 ,
6747 bytesGraças a @xnor por jogar 20 (!) Bytes!
Retorna uma lista não ordenada. É bastante eficiente: a entrada 100.000 leva aproximadamente 40 ms no TIO.
Experimente online!
fonte
[1][n:]or
. Além disso,x-~x
para2*x+1
.f=lambda n,k=1:n/k*[1]and[k]+f(n,k-~k)+f(n,4*k)
supondo que as saídas possam estar em qualquer ordem.Mathematica, 59 bytes
Número 4 da resposta do Mathematica ...
fonte
MATL ,
1211 bytesExperimente online!
Explicação
Para detectar se um número é válido, isso se converte em binário, aplica a codificação de comprimento de execução, mantém apenas execuções de comprimento ímpar e verifica se nenhuma execução de zeros sobrevive.
fonte
R, 75 bytes
Lê a entrada do stdin e usa a
bin
função domiscFuncs
pacote para converter do vetor decimal para o binário. Conseqüentemente, executa a codificação de execução para verificar se os valores== 0
e comprimentos são ímpares.fonte
Empilhados , 69 bytes
Experimente aqui!
Ou, não competindo em 67 bytes:
E ainda mais não-competitivo em 49 bytes:
Todos recebem a entrada como TOS e deixam a saída no TOS.
Explicação
A função:
Explicação de não-concorrentes:
É o mesmo que acima, com algumas diferenças importantes:
fonte
Befunge,
845149 bytesDepois de um pouco de experimentação, percebi que poderia me sair um pouco melhor do que minha solução original usando uma técnica semelhante à resposta em lote que Neil apresentou.
Experimente online!
Como na minha solução original, existem dois loops - o loop externo repetindo os números que queremos testar e um loop interno testando a sequência de bits para cada número. A maneira como o teste funciona é examinando dois bits de cada vez (módulo 4 do valor atual). Se for igual a 2, temos uma sequência ímpar de zeros e podemos abortar o loop interno e prosseguir para o próximo número.
Se o módulo 4 não for igual a 2, precisamos continuar testando os bits restantes, portanto aumentamos os bits que já foram testados. Isso é feito dividindo o valor, vamos chamá-lo de n , por
2+2*!(n%2)
. Isso significa que se o primeiro bit for 1, dividimos por 2 (diminuindo esse 1 bit), mas se for 0, dividimos por 4, portanto, sempre eliminamos pares de zeros.Se finalmente chegarmos a zero, isso significa que não houve seqüências ímpares de zero bits, então escrevemos o número.
fonte
Visual Basic (.net 4.5) 163 bytes
A primeira vez que respondo aqui, tenho certeza de que estraguei tudo. Deixe-me saber e eu vou consertar. As lambdas do Visual Basic são permitidas?
Agradecimentos a MamaFunRoll pela idéia de remover zeros consecutivos
Saídas R (32)
fonte
Java,
144130128 bytesIsso não é tão eficiente quanto eu acho que pode ser, mas achei que seria uma solução interessante usar um Regex, apesar de nunca ter usado um.
Golfe:
static String a(int n){String s="";for(Integer i=0;i++<n;)if(i.toString(i,2).replaceAll("00|1","").isEmpty())s+=i+" ";return s;}
Ungolfed:
Editar: Consegui salvar 14 bytes criando o regex 00 | 1 em vez de 00 e removendo ".replace (" 1 "," ")" entre o replaceAll e o isEmpty!
Edição 2: Consegui salvar 2 bytes, transformando-o em um inteiro e referenciando Integer.toString a i.toString.
fonte
Clojure, 103 bytes
Eu não acho que este é o caminho mais curto ...
Usa
re-seq
para encontrar zeros consecutivos, mapeia seus comprimentos do módulo-2 para aset
, descarta-os se o número1
for encontrado no conjunto.fonte
Maravilha , 38 bytes
Uso:
Explicação
Mais legível:
rng 1 +1 #0
: Faixa de 1 a entrada.fltr@ ...
: Intervalo de filtro com o seguinte predicado.bn #0
: Converte o item atual em binário. (Isso terá uma vantagem0b
).Rstr #["00"]
: Apaga recursivamente qualquer ocorrência de00
na sequência.len iO 0
: Conte as quantidades de0
s na string.=1
: Verifique se a quantidade é igual a 1. Se a única0
esquerda da sequência após a remoção estiver na liderança0b
, isso retornará verdadeiro; caso contrário, isso retornará falso.fonte
Rubi,
786968 bytesVersões mais antigas:
fonte
Mathematica, 81 bytes
Calcula, para cada execução de dígitos consecutivos em um número, {o dígito comum nessa execução mais (1 se o comprimento for ímpar, 2 se o comprimento for par)}; se alguma das respostas for {1}, o número não estará na sequência.
fonte
Mathematica, 75 bytes
#~IntegerDigits~2
calcula a lista de dígitos binários da entrada#
.Split
essa lista em execuções de elementos idênticos, faça aCases
correspondência{0..}
, escolha aLength
cada um deles, escolhaEvenQ
os comprimentos e retorneAnd
os resultados.fonte
!Or@@OddQ/@...
Python 3,
8682 bytesGolfe em andamento ...
Jogou 4 bytes mudando
bin(x)[2:]
para apenasbin(x)
- isso sai0b
no início da string, mas percebi que isso não afeta os cálculos :)fonte
Python, 142 bytes
Isto é principalmente apenas para praticar golfe no meu Python.
fonte
Gelatina , 10 bytes
Terrivelmente ineficiente. Experimente online!
fonte
Ruby,
545348 bytesEu não acho que o regex para isso fosse tão básico.
edit 1: mudou para rejeitar e se livrar da negação para -1.
editar 2: comutada
match
para=~
a -5.fonte
C #
159157155 bytesEconomizou 2 x dois bytes graças ao TuukkaX.
Nota: imprime as entradas na ordem inversa.
Explicação:
fonte
c%2==0
poderia serc%2<1
.N
.b[i++] == '0'
poderia serb[i++]==48
, mas como o outro caractere possível é '1' (ASCII 49), você pode apenas verificar seb[i++]<49
.Mathematica, 69 bytes
O mesmo comprimento:
fonte
Ruby, 53 bytes
fonte
Gelatina,
151310 bytessalvou dois bytes depois de procurar outras respostas, outros 3 bytes graças a Dennis
Explicação
fonte