Inspirado en el cuarto problema de BMO2 2009 .
Dado un entero positivo n como entrada o parámetro, devuelve el número de enteros positivos cuyas representaciones binarias se producen como bloques en la expansión binaria de n .
Por ejemplo, 13 -> 6 porque 13 en binario es 1101 y tiene subcadenas 1101, 110, 101, 11, 10, 1
. No contamos los números binarios que comienzan con cero y no contamos el cero en sí.
Casos de prueba
13 -> 6
2008 -> 39
63 -> 6
65 -> 7
850 -> 24
459 -> 23
716 -> 22
425 -> 20
327 -> 16
Puede tomar n como cualquiera de los siguientes:
- un entero
- una lista de valores de verdad / falsedad para la representación binaria
- una cadena para la representación binaria
- una cadena de base 10 (aunque no estoy seguro de por qué alguien haría esto)
Haz tu código lo más corto posible.
Respuestas:
Python 3,
5450 bytesGracias a Rod y Jonathan Allan por guardar cuatro bytes.
fuente
+1
rango desdebin(i)
n
en sí y deben siempre excluir0
de nuestra cuenta de que en lugar siempre podemos excluirn
y contar siempre0
((n) se inicia bin'0b...'
), por lo tanto, podemos eliminar el1,
y+1
completo y la licenciabin(i)
como es salvar cuatro bytes intentarlo en línea!Jalea , 4 bytes
Pruébalo en línea!
Toma entrada como lista de
0
sy1
s.¡Pruébelo en línea con números!
Explicación:
Prueba de que funciona:
Este programa recibe un número de entrada, N . Lo primero que hace este producto es, por supuesto, tomar las subcadenas de N 2 ( N en la base 2 ). Esto incluye subcadenas duplicadas que comienzan con 0 o 1 .
Después de eso, simplemente tomamos las subcadenas únicas manteniendo solo la primera aparición de cada valor en la lista de subcadenas.
Luego, este programa suma los primeros elementos de las listas, luego los segundos elementos, luego el tercero, el cuarto, etc. y si una de las listas no tiene dicho elemento,
0
se supone. Lo que el desafío pregunta es efectivamente ¿Cuántas subcadenas únicas que comienzan con 1 tiene este número en su forma binaria? . Como cada primer elemento que debe contarse es1
, simplemente podemos sumar en lugar de filtrar las subcadenas apropiadas.Ahora, el primer elemento de la lista resultante de la suma descrita anteriormente contiene el recuento de los primeros bits de las subcadenas, por lo que simplemente aparece y finalmente lo devuelve.
fuente
Octava ,
6261 bytesPruébalo en línea!
Explicación
Para la entrada
n
, el código prueba todos los números desde1
hastan
para ver si su representación binaria es una subcadena de la representación binaria de la entrada.fuente
05AB1E , 5 bytes
Toma la entrada como una cadena binaria.
El encabezado convierte la entrada entera en binario para facilitar la prueba.
Pruébalo en línea!
Explicación
fuente
bŒʒć}Ùg
pero no, eso está mejor.Perl 5 , 36 + 1 (
-p
) = 37 bytesPruébalo en línea!
Toma la entrada como una cadena binaria.
fuente
PowerShell ,
1039282 bytesPruébalo en línea!
Toma datos como una matriz de
1
y0
(verdadero y falso en PowerShell). Recorre$s
(es decir, cuántos elementos en la matriz de entrada). Dentro del ciclo, realizamos un ciclo desde el número actual (guardado como$i
) hasta$s.count
. Cada ciclo interno, dividimos-join
la matriz en una cadena. Luego,sort
con la-u
bandera de nique (que es más corta queselect
con la-u
bandera de nique y no nos importa si están ordenados o no), tomamos los que no comienzan0
y toman el total.count
. Eso queda en la tubería y la salida es implícita.fuente
JavaScript (ES6), 55 bytes
Toma la entrada como una cadena binaria.
Aquí hay un triste intento de hacerlo con números y funciones recursivas:
Enfoque antiguo, 74 bytes
También toma la entrada como una cadena binaria.
fuente
Python 2 ,
11881 bytes¡Gracias a @Rod por guardar 37 bytes!
Toma la entrada como una cadena binaria.
Pruébalo en línea!
Python 2 , 81 bytes
Gracias a @Rod!
Toma la entrada como una cadena binaria.
Pruébalo en línea!
fuente
set(...)
con{...}
yxrange
conrange
+1
rango desde el rango hasta el segmento, y cambiar el modos.startswith
aint(s,2)
esteJalea , 5 bytes
Pruébalo en línea!
Toma la entrada como una lista de 1s y 0s. El pie de página en el enlace aplica la función a cada uno de los ejemplos en la publicación.
Jonathan Allan señaló que
ẆḄQTL
es una alternativa de 5 bytes que utiliza elT
átomo que encuentra los índices de todos los elementos de verdad.Explicación
Tome bin (13) = 1101 como ejemplo. La entrada es
[1,1,0,1]
Tomó la idea de "verdad" (firmar en este caso) de la respuesta 05AB1E
fuente
T
, conẆḄQTL
R ,
8877 bytesPruébalo en línea!
Toma la entrada como una cadena binaria.
utilizando
mapply
, genera una matriz de todas las subcadenas de la entrada.strtoi
los convierte como2
enteros base , y tomo la suma de la conversión lógica (!!
) de entradas en el resultado.fuente
Retina ,
3729 bytesPruébalo en línea! Solo tuve que probar el
w
modificador de Retina 1.0 . Editar: guardado 8 bytes gracias a @MartinEnder. Explicación:Convierte de decimal a unario.
Convierta de unario a binario, utilizando
#
for0
y_
for 1.Generar subseries que comienzan con
1
, quiero decir,_
. Elw
modificador continuación, coincide con todas las subcadenas, no sólo la más larga en cada partida_
, mientras que elp
deduplica modificadoras los partidos. Finalmente, como esta es la última etapa, el recuento de coincidencias se devuelve implícitamente.fuente
q
(op
) además dew
. Tampoco necesita especificarC
explícitamente, porque es el tipo de etapa predeterminado si solo queda una fuente única.M
ser el tipo de escenario predeterminado!C
un poco es lo queM
solía ser. :)Pyth , 8 bytes
Pruébalo aquí!
Toma la entrada como una cadena binaria.
.:
genera todas las subcadenas,vM
evalúa cada una (es decir, las convierte de binarias),{
deduplica,<space>#
filtra por identidad yl
obtiene la longitud.fuente
Wolfram Language (Mathematica) , 35 bytes
Contando subsecuencias únicas de la representación binaria que comienzan con una, aunque no estoy seguro de que este código incluso necesite una explicación.
Pruébalo en línea!
fuente
___
hacer?Perl 6 , 47 bytes
Pruébalo en línea!
fuente
Julia 0.6 , 37 bytes
Pruébalo en línea!
Juliafication de la respuesta de Python por J843136028 usando
.
para la aplicación de función de elementos sabios con difusión. ( enlace )fuente
Java, 232 bytes
Donde n es la entrada, b es la representación binaria y l es una lista de todas las subcadenas. Publicar aquí por primera vez, definitivamente necesita mejorar, ¡y siéntase libre de señalar cualquier error! Ligeramente editado para facilitar la lectura.
fuente
String b=...,t
yint i=...,j,k
para guardar caracteres para declaraciones repetidas del mismo tipo. Su código tampoco calificaría como entrada porque es un fragmento, ni un programa completo ni un fragmento funcional, debe escribir una función o envolver su código en forma lambdaAdjunto , 35 bytes
Pruébalo en línea!
Equivalentemente:
Explicación
Explicaré la segunda versión, ya que es más fácil de seguir (siendo explícito):
fuente
Ruby
41 3627 bytesToma una cadena binaria como entrada
Es ultra ineficiente
En parte inspirado por esta respuesta de Python 3
Pruébalo en línea!
fuente
Java 8,
160159158 bytesEntrada como cadena binaria.
Debe haber un camino más corto ..>.>
Explicación:
Pruébalo en línea.
fuente
C ++, 110 bytes
Esta es una función recursiva. Utilizamos a
std::set
para contar valores, ignorando duplicados. Las dos llamadas recursivas enmascaran bits de la izquierda (f(n&i)
) y de la derecha (f(n/2)
), produciendo eventualmente todas las subcadenas como enteros.Tenga en cuenta que si desea volver a llamarlo,
s
debe borrarse entre llamadas.Programa de prueba
Resultados
fuente
J , 34 bytes
Pruébalo en línea!
fuente
J , 15 bytes
La entrada es una lista binaria. Pruébalo en línea!
fuente
Perl 6 , 34 bytes
Pruébalo
Expandido:
fuente