Un número de Cullen es cualquier número que está contenido en la secuencia generada usando la fórmula:
C (n) = (n * 2 ^ n) +1.
Tu tarea:
Escriba un programa o función que reciba una entrada y genere un valor verdadero / falso basado en si la entrada es un Número Cullen.
Entrada:
Un entero no negativo entre 0 y 10 ^ 9 (inclusive).
Salida:
Un valor verdadero / falso que indica si la entrada es un número Cullen.
Casos de prueba:
Input: Output:
1 ---> truthy
3 ---> truthy
5 ---> falsy
9 ---> truthy
12 ---> falsy
25 ---> truthy
Tanteo:
Este es el código de golf , por lo que gana la puntuación más baja en bytes.
code-golf
number
decision-problem
Gryphon - Restablece a Monica
fuente
fuente
n
Parece estar basado en 0.Ḷ
oR
:-)Respuestas:
Pyth,
65 bytespruébalo en línea
fuente
Código de máquina x86_64 ( System V ABI ),
2827 bytes-1 byte gracias a @Cody Gray, ¡gracias!
¡Un algoritmo de tiempo constante!
Explicación:
Deje y un número entero y
x=y*2^y + 1
. Tomando registros, tenemosy + log2(y) = log2(x-1)
, por lo tantoy=log2(x-1)-log2(y)
. Volviendo a conectar el valor de y, obtenemosy=log2(x-1)-log2(log2(x-1)-log2(y))
. Hacer esto una vez más, se obtiene:y=log2(x-1)-log2[log2(x-1)-log2(log2(x-1)-log2(log2(x-1)-log2(y)))]
.Eliminemos los últimos términos (del orden de
log2(log2(log2(log2(x))))
, ¡esto debería ser seguro!), Y supongamos quex-1≈x
obtenemos:y≈log2(x)-log2[log2(x)-log2(log2(x))]
Ahora, dejando
f(n) = floor(log2(n))
, se puede verificar manualmente quey
se puede recuperar exactamente por:,y=f(x)-f[f(x)-f(f(x))]
para y <26 , y por lo tanto x ⩽ 10 ^ 9 , como se especifica en el desafío (1) .El algoritmo simplemente consiste en calcular y dado x , y verificar que x == y * 2 ^ y + 1 . El truco es que
f(n)
simplemente se puede implementar como labsr
instrucción (exploración de bits inversa), que devuelve el índice del primer 1 bit en n , yy*2^y
comoy << y
.Código detallado:
(1) De hecho, esta igualdad parece mantenerse para valores de y hasta 50000.
fuente
eax
le permitiría eliminar elmovzbl
, ahorrando 1 byte. Tendría que hacer el XOR antes delcmpl
para que no golpee las banderas, por supuesto, pero eso está muy bien porque nada de eso dependeeax
. O bien, podría decidir que el método devuelve un valor booleano solo en los 8 bits inferiores, ¡guardando los 3 bytes!Gelatina ,
76 bytesPruébalo en línea!
Toma entrada como un argumento de línea de comando. Si se le da un número de Cullen C ( n ), genera n +1 (que es verdad en Jelly, siendo un número entero distinto de cero; tenga en cuenta que tenemos n ≥0 porque la entrada es un número entero, y los números de Cullen con n negativo nunca son números enteros) . Si se le da un número que no es Cullen, devuelve 0, que es falsey en Jelly.
Explicación
Básicamente, forma una matriz de números de Cullen menos uno, luego busca la entrada menos uno. Si la entrada es un número de Cullen, lo encontraremos, de lo contrario no lo haremos. Tenga en cuenta que la matriz es necesariamente lo suficientemente larga como para llegar a la entrada, porque C ( n ) siempre es mayor que n .
fuente
JavaScript (ES6),
3735 bytesGuardado 2 bytes gracias a Neil
Manifestación
Mostrar fragmento de código
fuente
x<n?f(n,k+1):x==n
?undefined+1===NaN
pero-~undefined===1
. Puedes leer más sobre esto aquí .Haskell, 28 bytes
Pruébalo en línea!
fuente
Ohm , 8 bytes
Pruébalo en línea!
fuente
PHP , 43 bytes
Pruébalo en línea!
fuente
$argn
una variable especial? Cambiarlo a$a
ahorraría 6 bytes: tio.run/##K8go@G9jX5BRwKWSaKtkaGaoZP0/…$argn
está disponible si ejecuta PHP desde la línea de comandos con la-R
opción05AB1E , 7 bytes
Pruébalo en línea!
Explicación:
fuente
R ,
535146 bytesFunción anónima. Comprueba si
x
se genera en la secuencia C (n) para n en [0, x].3 bytes de golf de Giuseppe.
Pruébalo en línea!
fuente
x%in%...
lugar deany(x==...)
; eso te dejará 4 byteslapply
al simplemente verificar el vector y usarlo enscan
lugar de tomar argumentos de función, obtengo la respuesta de @giuseppe. Gracias por publicarlo por separado para que pueda ver lo que me falta: aprendo más probando algo por mi cuenta, aunque generalmente pierdo.C, C ++, Java, C #, D: 70 bytes
Debido a las similitudes entre todos estos idiomas, este código funciona para cada
fuente
i=30;i--;)if(i<<i==n-1)
lugar dei=0;i<30;++i)if((1<<i)*i+1==n)
Python, 40 bytes
Pruébalo en línea!
fuente
Python 2 , 36 bytes
Pruébalo en línea!
Salidas por no estrellarse / bloquearse, según lo permitido actualmente por este metaconcenso .
Python 2 , 42 bytes
Pruébalo en línea!
Salidas a través del código de salida
fuente
R , 26 bytes
Pruébalo en línea!
Un enfoque ligeramente diferente que la otra respuesta R ; lee desde
stdin
y dado que la entrada está garantizada entre 0 y 10 ^ 9, solo tenemos que verificarn
entre 0 y 26.fuente
scan()
. Buen trabajo.APL (Dyalog) , 9 bytes
Para cubrir el caso de n = 1, requiere
⎕IO←0
cuál es el valor predeterminado en muchos sistemas.Pruébalo en línea!
⊢
[es] n (el argumento)∊
un miembro de1
uno+
más⍳
los i ntegers 0 ... ( n -1)×
veces2
dos*
al poder de⍳
los i ntegers 0 ... ( n -1)fuente
⎕IO←0
no estándar, ya que muchos siempre lo tienen configurado así, sin necesidad de especificarlo cada vez.⎕IO←0
.Python 2 , 32 bytes
Pruébalo en línea!
Crea la lista de números de Cullen hasta
10^9
, luego cuenta cuántas veces aparece la entrada en ella. Gracias a Vincent por señalar enn<<n|1
lugar de(n<<n)+1
guardar 2 bytes.fuente
n<<n|1
(n<<n
siendo par);)838860801
. Necesitasrange(26)
, porque el rango no es inclusivo.D, 65 bytes
Este es un puerto del algoritmo de @ HatsuPointerKun a D (el original ya era código D, pero esto es con trucos específicos de D)
¿Cómo? (D trucos específicos)
El sistema de plantillas de D es más corto que el de C ++ y puede inferir tipos. Y D también inicializa sus variables al valor predeterminado tras la declaración.
fuente
Mathematica, 30 bytes
Función pura que toma un entero no negativo como entrada y regresa
True
oFalse
. Si la entrada esn
,(r=Range@#-1)
establece la variabler
para que sea{0, 1, ..., n-1}
, y luegor2^r+1
computa vectorialmente los primerosn
números de Cullen.MemberQ[...,#]
luego verifica sin
es un elemento de la lista.fuente
Mathematica, 32 bytes
fuente
Excel VBA, 45 bytes
Función de ventana inmediata anónima de VBE que toma la entrada de la celda
[A1]
y las salidas a la ventana inmediata de VBEDebe ejecutarse en un módulo limpio o tener valores para i, j restablecerse al valor predeterminado de 0 entre ejecuciones
De entrada y salida
E / S como se ve en la ventana inmediata de VBE
fuente
Swi-Prolog, 69 bytes
f(X)
tiene éxito si puede encontrar un valor I donde X = I * 2 ^ I + 1. La sugerencia de rango evita que se quede sin espacio de pila, pero es suficiente para el rango de números de Cullen hasta 10 ^ 9 en la especificación de la pregunta.p.ej
fuente
cQuents , 9 bytes
Pruébalo en línea!
Explicación
fuente
TI-BASIC, 17 bytes
Explicación
fuente
QBIC , 24 bytes
Explicación
fuente
k , 19 bytes
Pruébalo en línea. La verdad es una matriz con un número:
,3
o,0
etcétera. Falsey es una matriz vacía:()
o!0
depende de su intérprete.fuente
Java (OpenJDK 8) , 56 bytes
Pruébalo en línea!
fuente
Pari / GP , 25 bytes
Pruébalo en línea!
fuente