La secuencia Baum-Sweet (A086747 con un toque)
Tome un entero positivo n
e imprima los enteros de 1 a n para los cuales la secuencia Baum-Sweet devuelve verdadero. La secuencia Baum-Sweet debería devolver falso si la representación binaria del número contiene un número impar de ceros consecutivos en cualquier parte del número, y la verdad es lo contrario. Para más información, haga clic en el enlace. Aquí hay un par de ejemplos:
1 -> 1 -> Truthy
2 -> 10 -> Falsy
3 -> 11 -> Truthy
4 -> 100 -> Truthy (Even run of zeros)
Aquí hay un ejemplo dado n=32
Paso 1: La secuencia 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)
Entonces, después de calcular la secuencia Baum-Sweet para n, tome los números que fueron verdaderos para la secuencia y recójalos para el resultado final. Porque n=32
tendríamos:
[1, 3, 4, 7, 9, 12, 15, 16, 19, 25, 28, 31]
Como la respuesta final.
Este es el código de golf , el conteo de bytes más corto gana.
code-golf
sequence
base-conversion
binary
Urna de pulpo mágico
fuente
fuente
Respuestas:
05AB1E ,
109 bytesSalvó un byte gracias a Adnan
Pruébalo en línea!
Explicación
fuente
ƒ
Funciona en lugar de>G
?.¡
usada;).JavaScript (ES6),
706863 bytesSolución recursiva un poco más interesante:
67 bytes gracias a @Neil.
g
es la función para llamar.fuente
f
es similar a una función que uso ocasionalmente para contar el número de 1 bits en un número.f
falla cuandon=0
? Además, comof
solo devuelve 0 o 1, puede reducir dos bytes mediante el uson&f(n>>1)
.n = 0
no es un 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
Comprueba corridas impares de 1 en la representación binaria al dividir
00
y comprobar si quedan ceros en la representación de cadena de la lista resultante. Molesto, los números binarios comienzan con0b
un cero que debe eliminarse para evitar un falso positivo.La enumeración se realiza recurriendo hacia abajo.
fuente
Golpetazo,
5846 bytesEDICIONES:
Golfed
Prueba
Explicado
cáscara
sed
¡Pruébelo en línea!
fuente
Lote, 143 bytes
fuente
Perl 6 , 40 bytes
Intentalo
(
[]
se usan para la agrupación sin captura, con las<[]>
usadas para las clases de caracteres)fuente
PowerShell ,
7961 bytesPruébalo en línea!
Me inspiré esta mañana para cambiar la forma en que realizo la
-split
operación, luego vi que es similar a cómo se construye la respuesta de xnor , así que, ¿creo que las grandes mentes piensan igual?Realizamos un bucle desde
1
arriba hasta la entrada$args[0]
, y utilizamos unWhere-Object
operador para extraer los números apropiados|?{...}
. La cláusula es un valor booleano simple: nos aseguramos de que0
sea-notin
el resultado de(...)
.Dentro de los parens, tenemos
[convert]::
el número actual$_
ToString
con la base2
(es decir, lo convertimos en una cadena binaria). Luego-split
colocamos la cadena en la expresión regular1|00
: esta es una coincidencia codiciosa y da como resultado una serie de cadenas (por ejemplo,100010
se convertiría en'','','0','','0'
y así sucesivamente).Por lo tanto, si cada ejecución de
0
s en la cadena binaria es par (lo que significa que la expresión regular los ha dividido en cadenas vacías), entonces0
será-notin
el resultado, por lo que laWhere
cláusula es verdadera y se selecciona el número. Esos números se dejan en la tubería y la salida es implícita.fuente
Python 2 ,
6747 bytes¡Gracias a @xnor por jugar golf en 20 (!) Bytes!
Devuelve una lista desordenada. Es bastante eficiente: la entrada 100,000 toma aproximadamente 40 ms en TIO.
Pruébalo en línea!
fuente
[1][n:]or
. Además,x-~x
por2*x+1
.f=lambda n,k=1:n/k*[1]and[k]+f(n,k-~k)+f(n,4*k)
suponiendo que las salidas pueden estar en cualquier orden.Mathematica, 59 bytes
Respuesta de Mathematica número 4 ...
fuente
MATL ,
1211 bytesPruébalo en línea!
Explicación
Para detectar si un número es válido, esto se convierte en binario, aplica codificación de longitud de ejecución, mantiene solo ejecuciones de longitud impar y comprueba si no sobrevive ninguna ejecución de ceros.
fuente
R, 75 bytes
Lee la entrada de stdin y utiliza la
bin
función delmiscFuncs
paquete para convertir de decimal a binario. En consecuencia, realiza la codificación de longitud de ejecución para verificar que los valores== 0
y las longitudes sean impares.fuente
Apilado , 69 bytes
Pruébalo aquí!
O, sin competencia a 67 bytes:
Y, aún más sin competencia a 49 bytes:
Todos toman la entrada como TOS y dejan la salida en TOS.
Explicación
La función:
Explicación de la no competencia:
Es igual que el anterior, con algunas diferencias clave:
fuente
Befunge,
845149 bytesDespués de un poco de experimentación, me di cuenta de que podía hacerlo bastante mejor que mi solución original al usar una técnica similar a la respuesta de Batch que se le ocurrió a Neil .
Pruébalo en línea!
Al igual que con mi solución original, hay dos bucles: el bucle externo que itera sobre los números que queremos probar y un bucle interno que prueba la secuencia de bits para cada número. La forma en que funciona la prueba es examinando dos bits a la vez (módulo 4 del valor actual). Si es igual a 2, tenemos una secuencia impar de ceros y podemos abortar el ciclo interno y pasar al siguiente número.
Si el módulo 4 no es igual a 2, debemos continuar probando los bits restantes, por lo que cambiamos los bits que ya se han probado. Esto se hace dividiendo el valor, llamémoslo n , por
2+2*!(n%2)
. Esto significa que si el primer bit fue un 1, dividimos por 2 (eliminando ese 1 bit), pero si era un 0, dividimos entre 4, por lo que siempre eliminaremos pares de ceros.Si finalmente llegamos a cero, eso significa que no hubo secuencias impares de bits cero, por lo que escribimos el número.
fuente
Visual Basic (.net 4.5) 163 bytes
Primero respondo aquí, así que estoy seguro de que he arruinado algo. Avísame y lo arreglaré. ¿Se permiten las lambdas de Visual Basic?
Gracias a MamaFunRoll por la idea de eliminar ceros consecutivos
R (32) salidas
fuente
Java,
144130128 BytesEsto no es tan divertido como creo que puede ser, pero pensé que sería una linda solución usar un Regex, a pesar de nunca haberlo usado.
Golfizado:
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;}
Sin golf:
Editar: pude guardar 14 bytes al hacer la expresión regular 00 | 1 en lugar de 00, y eliminar ".replace (" 1 "," ")" entre replaceAll e isEmpty!
Edición 2: pude guardar 2 bytes al convertir i en un número entero y hacer referencia a Integer.toString con i.toString.
fuente
Clojure, 103 bytes
No creo que este sea el camino más corto ...
Usos
re-seq
para encontrar ceros consecutivos, los mapas de sus longitudes de módulo 2 a unaset
, los descartes si el número1
se encuentra en el conjunto.fuente
Maravilla , 38 bytes
Uso:
Explicación
Más legible:
rng 1 +1 #0
: Rango de 1 a entrada.fltr@ ...
: Rango de filtro con el siguiente predicado.bn #0
: Convierte el elemento actual a binario. (Esto tendrá un liderazgo0b
).Rstr #["00"]
: Pode recursivamente cualquier aparición de00
en la cadena.len iO 0
: Cuenta las cantidades de0
s en la cadena.=1
: Verifique si la cantidad es igual a 1. Si lo único que0
queda en la cadena después de la poda está al frente0b
, entonces esto devuelve verdadero; de lo contrario, esto devuelve falso.fuente
Rubí,
786968 bytesVersiones anteriores:
fuente
Mathematica, 81 bytes
Calcula, para cada ejecución de dígitos consecutivos en un número, {el dígito común en esa ejecución más (1 si la longitud es impar, 2 si la longitud es par)}; Si alguna de las respuestas es {1}, el número no está en la secuencia.
fuente
Mathematica, 75 bytes
#~IntegerDigits~2
calcula la lista de dígitos binarios de la entrada#
.Split
esa lista en series de elementos idénticos, tome laCases
coincidencia{0..}
, tome laLength
de cada uno de ellos, tomeEvenQ
las longitudes y luego devuelvaAnd
los resultados.fuente
!Or@@OddQ/@...
Python 3,
8682 bytesGolf en progreso ...
Golfé 4 bytes cambiando
bin(x)[2:]
a solobin(x)
: esto se va0b
al comienzo de la cadena, pero me di cuenta de que esto no afecta los cálculos :)fuente
Python, 142 bytes
Esto es principalmente para practicar golf en mi Python.
fuente
Jalea , 10 bytes
Terriblemente ineficiente. Pruébalo en línea!
fuente
Ruby,
545348 bytesNo pensé que la expresión regular para esto fuera tan básica.
editar 1: se cambió a rechazar para deshacerse de la negación de -1.
editar 2: cambiado
match
a=~
-5.fuente
C #
159157155 bytesGuardado 2 x dos bytes gracias a TuukkaX.
Nota: imprime las entradas en orden inverso.
Explicación:
fuente
c%2==0
podría serc%2<1
.N
.b[i++] == '0'
podría serb[i++]==48
, pero dado que el otro carácter posible es '1' (ASCII 49), puede verificar sib[i++]<49
.Mathematica, 69 bytes
La misma longitud:
fuente
Rubí, 53 bytes
fuente
Jalea,
151310 bytesahorró dos bytes después de mirar otras respuestas, otros 3 bytes gracias a Dennis
Explicación
fuente