Um número Cullen é qualquer número que esteja contido na sequência gerada usando a fórmula:
C (n) = (n * 2 ^ n) +1.
Sua tarefa:
Escreva um programa ou função que receba uma entrada e emita um valor de verdade / falsidade com base no fato de a entrada ser um número Cullen.
Entrada:
Um número inteiro não negativo entre 0 e 10 ^ 9 (inclusive).
Saída:
Um valor de verdade / falsidade que indica se a entrada é um número Cullen.
Casos de teste:
Input: Output:
1 ---> truthy
3 ---> truthy
5 ---> falsy
9 ---> truthy
12 ---> falsy
25 ---> truthy
Pontuação:
Isso é código-golfe , então a pontuação mais baixa em bytes vence.
code-golf
number
decision-problem
Gryphon - Restabelecer Monica
fonte
fonte
n
parece ser baseado em 0.Ḷ
ouR
nele :-)Respostas:
Pitão,
65 bytesexperimente online
fonte
código de máquina x86_64 ( ABI do sistema V ),
2827 bytes-1 byte graças a @Cody Gray, obrigado!
Um algoritmo de tempo constante!
Explicação:
Seja y um número inteiro e
x=y*2^y + 1
. Tomando logs, temosy + log2(y) = log2(x-1)
, assimy=log2(x-1)-log2(y)
. Conectando de volta o valor de y, obtemosy=log2(x-1)-log2(log2(x-1)-log2(y))
. Fazendo isso mais uma vez, obtém-se:y=log2(x-1)-log2[log2(x-1)-log2(log2(x-1)-log2(log2(x-1)-log2(y)))]
.Vamos remover os últimos termos (da ordem de
log2(log2(log2(log2(x))))
, isso deve ser seguro!) E supor quex-1≈x
, obtemos:y≈log2(x)-log2[log2(x)-log2(log2(x))]
Agora, deixando
f(n) = floor(log2(n))
, pode ser verificado manualmente quey
pode ser recuperado exatamente por:,y=f(x)-f[f(x)-f(f(x))]
para y <26 e, portanto, x ⩽ 10 ^ 9 , conforme especificado pelo desafio (1) .O algoritmo consiste simplesmente em calcular y dado x e verificar se x == y * 2 ^ y + 1 . O truque é que
f(n)
pode ser simplesmente implementado como absr
instrução (reversão de verificação de bits), que retorna o índice do primeiro bit de 1 em n ey*2^y
comoy << y
.Código detalhado:
(1) De fato, essa igualdade parece valer para valores de y até 50000.
fonte
eax
permitiria eliminar omovzbl
byte de economia de 1 byte. Você precisaria fazer o XOR antes do XOR,cmpl
para que ele não derrube as bandeiras, é claro, mas tudo bem, porque nada depois disso dependeeax
. Ou, você pode simplesmente decidir que o método retornará um Booleano apenas nos 8 bits inferiores, salvando todos os 3 bytes!Geléia ,
76 bytesExperimente online!
Recebe entrada como um argumento de linha de comando. Se dado um número Cullen C ( n ), gera n +1 (que é verdadeiro em Jelly, sendo um número inteiro diferente de zero; observe que temos n ≥0 porque a entrada é um número inteiro e os números Cullen com n negativo nunca são inteiros) . Se for fornecido um número que não seja Cullen, retornará 0, que é falsey em Jelly.
Explicação
Basicamente, forme uma matriz de números Cullen menos um, depois procure a entrada menos um. Se a entrada for um número Cullen, nós a encontraremos, caso contrário, não. Observe que a matriz é necessariamente longa o suficiente para alcançar a entrada, porque C ( n ) é sempre maior que n .
fonte
JavaScript (ES6),
3735 bytesEconomizou 2 bytes graças a Neil
Demo
Mostrar snippet de código
fonte
x<n?f(n,k+1):x==n
?undefined+1===NaN
mas-~undefined===1
. Você pode ler mais sobre isso aqui .Haskell, 28 bytes
Experimente online!
fonte
Ohm , 8 bytes
Experimente online!
fonte
PHP , 43 bytes
Experimente online!
fonte
$argn
uma variável especial? Mudá-lo para$a
se salvar 6 bytes: tio.run/##K8go@G9jX5BRwKWSaKtkaGaoZP0/...$argn
está disponível se você executar o PHP a partir da linha de comando com a-R
opção05AB1E , 7 bytes
Experimente online!
Explicação:
fonte
R ,
535146 bytesFunção anônima. Verifica se
x
é gerado na sequência C (n) por n em [0, x].3 bytes jogados por Giuseppe.
Experimente online!
fonte
x%in%...
vez deany(x==...)
; isso deixará você com 4 byteslapply
simplesmente para verificar o vetor e usar emscan
vez de usar argumentos de função - recebo a resposta do @giuseppe. Obrigado por publicá-lo separadamente, para que eu possa ver o que estou perdendo - eu aprendo mais tentando algo sozinho, mesmo que geralmente perco.C, C ++, Java, C #, D: 70 bytes
Devido às semelhanças entre todos esses idiomas, esse código funciona para cada
fonte
i=30;i--;)if(i<<i==n-1)
vez dei=0;i<30;++i)if((1<<i)*i+1==n)
Python, 40 bytes
Experimente online!
fonte
Python 2 , 36 bytes
Experimente online!
Resultados por não travar / travar, conforme atualmente permitido por este meta-consenso .
Python 2 , 42 bytes
Experimente online!
Saídas via código de saída
fonte
R , 26 bytes
Experimente online!
Uma abordagem ligeiramente diferente da outra resposta R ; lê
stdin
e desde que a entrada é garantida entre 0 e 10 ^ 9, basta verificarn
entre 0 e 26.fonte
scan()
. Bom trabalho.APL (Dyalog) , 9 bytes
Para cobrir o caso de n = 1, requer
⎕IO←0
qual é o padrão em muitos sistemas.Experimente online!
⊢
[is] n (o argumento)∊
um membro de1
1+
mais⍳
os i ntegers 0 ... ( n -1)×
vezes2
dois*
ao poder de⍳
os i ntegers 0 ... ( n -1)fonte
⎕IO←0
não-padrão, pois muitos de fato sempre o definem assim, sem nenhuma especificação necessária a cada vez.⎕IO←0
,.Python 2 , 32 bytes
Experimente online!
Cria a lista de números de Cullen até
10^9
e conta quantas vezes a entrada aparece nela. Obrigado a Vincent por apontar, emn<<n|1
vez de(n<<n)+1
, salvar 2 bytes.fonte
n<<n|1
(n<<n
sendo mesmo);)838860801
. Você precisarange(26)
, porque o intervalo não é inclusivo.D, 65 bytes
Esta é uma porta do algoritmo de @ HatsuPointerKun para D (o original já era código D, mas isso é com truques específicos de D)
Quão? (D truques específicos)
O sistema de modelos de D é mais curto que o de C ++ e pode inferir tipos. E D também inicializa suas variáveis para o padrão na declaração.
fonte
Mathematica, 30 bytes
Função pura, recebendo um número inteiro não negativo como entrada e retornando
True
ouFalse
. Se a entrada forn
,(r=Range@#-1)
defina a variávelr
como sendo{0, 1, ..., n-1}
er2^r+1
calcula vetorialmente os primeirosn
números de Cullen.MemberQ[...,#]
depois verifica sen
é um elemento da lista.fonte
Mathematica, 32 bytes
fonte
Excel VBA, 45 bytes
Função de janela imediata do VBE anônima que leva a entrada da célula
[A1]
e sai para a janela imediata do VBEDeve ser executado em um módulo limpo ou ter valores para i, j ser redefinido para o valor padrão de 0 entre execuções
Entrada / Saída
E / S como visto na janela imediata do VBE
fonte
Swi-Prolog, 69 bytes
f(X)
obtém êxito se puder encontrar um valor I em que X = I * 2 ^ I + 1. A dica de intervalo impede que fique sem espaço na pilha, mas é suficiente para o intervalo de números de Cullen de até 10 ^ 9 na especificação da pergunta.por exemplo
fonte
cQuents , 9 bytes
Experimente online!
Explicação
fonte
TI-BASIC, 17 bytes
Explicação
fonte
QBIC , 24 bytes
Explicação
fonte
k , 19 bytes
Experimente online. Truthy é uma matriz com um número:
,3
or,0
eteter. Falsey é uma matriz vazia:()
ou!0
dependendo do seu intérprete.fonte
Java (OpenJDK 8) , 56 bytes
Experimente online!
fonte
Pari / GP , 25 bytes
Experimente online!
fonte