Escreva um programa que verifique se o número inteiro é uma potência de 2.
Entrada de amostra:
8
Saída de amostra:
Yes
Entrada de amostra:
10
Saída de amostra:
No
Regras:
Não use
+
,-
operações.Use algum tipo de fluxo de entrada para obter o número. A entrada não deve ser inicialmente armazenada em uma variável.
O código mais curto (em bytes) vence.
Você pode usar qualquer resposta de verdade / falsidade (por exemplo, true
/ false
). Você pode assumir que o número de entrada é maior que 0
.
code-golf
restricted-source
decision-problem
integer
gthacoder
fonte
fonte
pred
função, quando aplicada a um número inteiro n, retorna n - 1. São também funções como essa, que são disfarces finos em torno do operador proibido?)
, ou a maioria dos idiomas baseados em c '--
.Respostas:
GolfScript, 6 caracteres, sem decréscimos
Aqui está uma solução que não usa o
x & (x-1)
método de nenhuma forma. Ele usa em seux & (x/3)
lugar. ;-) Saídas0
se false,1
se true.Explicação:
~
avalia a sequência de entrada para transformá-la em um número,.
duplica (para o subsequente&
),3/
divide por três (truncando para baixo),&
calcula o AND bit a bit do valor dividido com o original, que será zero se e somente se a entrada for zero ou uma potência de dois (ou seja, tiver no máximo um bit definido), e!
nega isso logicamente, mapeando zero para um e todos os outros valores para zero.Notas:
De acordo com as regras esclarecidas, zero não é uma entrada válida ; portanto, este código está OK, mesmo que seja emitido
1
se a entrada for zero.Se o operador de decremento GolfScript
(
for permitido, a solução de 5 caracteres~.(&!
postada pelo aditsu é suficiente. No entanto, parece ir contra o espírito das regras , se não a letra.Eu inventei o
x & (x/3)
truque anos atrás na lista de discussão Fun With Perl. (Tenho certeza de que não sou o primeiro a descobri-lo, mas o (re) inventei de forma independente.) Aqui está um link para a postagem original , incluindo uma prova de que ela realmente funciona.fonte
7/3 = 2 (0010)
, para7 & 2 = 0111 & 0010 = 0010
que claramente o último bit não seja 1APL (7)
Sim, são 7 bytes . Suponha que eu esteja usando a página de códigos IBM 907 em vez de Unicode e, em seguida, cada caractere seja um byte :)
ie
0 = mod(log(input(),2),1)
fonte
Indeterminate
quando tento isso.GolfScript, 11 (para 1 (verdadeiro) e 0 (falso))
Coloque o número na pilha e depois execute.
GolfScript, 22 (para Sim / Não)
Eu amo como converter
1
/0
paraYes
/No
leva tanto código quanto o próprio desafio: DAviso: EXTREMAMENTE ineficiente;) Funciona bem para números de até 10000, mas depois que você chega tão alto, começa a notar um ligeiro atraso.
Explicação:
.,
: transforman
- se emn 0..n
(.
duplicado,,
intervalo 0..n){2\?}
: ao poder de 2%
: mapeie "poder de 2" sobre "0..n" para que se tornen [1 2 4 8 16 ...]
?0>
: verifica se a matriz contém o número (0 é maior que o índice)fonte
.,{2\?}%?0<'YesNo'3/=
:; Também acho que você está trapaceando pedindo "Coloque o número na pilha", você deve começar com a~
.Mathematica 28
Para potências inteiras de 2, o numerador do log da base 2 será 1 (o que significa que o log é uma fração da unidade).
Aqui, modificamos ligeiramente a função para exibir a entrada presumida. Usamos
#
no lugar deInput[]
e adicionamos&
para definir uma função pura. Retorna a mesma resposta que seria retornada se o usuário digitar o número na função acima.Testando vários números de cada vez.
fonte
Perl 6 (17 caracteres)
Este programa obtém uma linha da
get
função STDIN , calcula o logaritmo com base 2 nela (log(2)
) e verifica se o resultado é dividido por 1 (%%1
, onde%%
é dividido pelo operador). Não tão curto quanto a solução GolfScript, mas acho isso aceitável (o GolfScript ganha tudo de qualquer maneira), mas muito mais rápido (mesmo considerando que o Perl 6 está lento no momento).fonte
+
e-
são proibidos para esse desafio, é porque sex & (x - 1)
é igual a0
, entãox
é uma potência de 2. #x&~(~0*x)
ainda funciona. São apenas 2 caracteres a mais.Oitava (
1523)EDIT: atualizado devido ao requisito de entrada do usuário;
Permite que o usuário insira um valor e produz 1 para true, 0 para false.
Testado em oitava, também deve funcionar no Matlab.
fonte
R,
1311Baseado na solução Perl. Retorna
FALSE
ouTRUE
.O parâmetro
i
representa a variável de entrada.Uma versão alternativa com entrada do usuário:
fonte
GolfScript, 5
Saídas 1 para verdadeiro, 0 para falso. Com base na ideia de user3142747:
Nota:
(
é decrescente, espero que não conte como-
:)Se sim (e os comentários do OP sugerem que sim), consulte a solução de Ilmari Karonen .
Para saída Y / N, acrescente
'NY'1/=
no final (mais 7 bytes).fonte
Python, 31
fonte
bin(input()).rfind('1')<3
2==
porque achei que deveria funcionar para números não positivos também. Que explicitamente não é exigido pelas regras, então ...print bin(input()).count('1')<2
um total de 31 caracteres, mas é muito parecido com o seu.C, 48
fonte
*
tem precedência mais alta que binária&
, você não precisa dos parênteses. E se o valor de retorno for aceito (apenas solicitado)exit(x&x*-1)
, será muito menor.-
:x*-1
.-
é proibido.Decidi usar outra abordagem, com base na contagem da população ou na soma lateral do número (o número de 1 bits). A idéia é que todos os poderes de dois tenham exatamente um
1
bit e nenhum outro número. Eu adicionei uma versão JavaScript porque achei divertido, embora certamente não vença nenhuma competição de golfe.J,
1415 caracteres (saídas 0 ou 1)JavaScript, 76 caracteres (gera verdadeiro ou falso)
fonte
Clipe ,
987Lê um número de stdin.
Explicação:
Para começar,
Z
=0
,W
=2
eO
= 1. Isso permite a colocação deW
eO
ao lado do outro, ao passo que utilizando2
e1
seria interpretada como o número 21, sem um espaço de separação (um carácter adicional indesejada). No Clip, a função modulo (%
) funciona em não-inteiros; portanto, para descobrir se algum valorv
é um número inteiro, verifique sev
mod 1 = 0. Usando a sintaxe do Clip, isso é escrito como=0%v1
. No entanto, como os booleanos são armazenados como1
(ou qualquer outra coisa) e0
, verificar se algo é igual0
é apenas 'not'ing'. Para isso, o Clip possui o!
operador. No meu código,v
élnx2
.x
é uma entrada do stdin,n
converte uma string em um número elab
é a baseb
de log dea
. O programa traduz, portanto, (mais facilmente) para0 = ((log base 2 of parseInt(readLine)) mod 1)
.Exemplos:
saídas
e
saídas
Edit 1: substituído
0
,1
e2
comZ
,O
eW
.Editar 2: substituído
=Z
por!
.Além disso:
Pitão , 5
Compacta a versão do Clip ainda mais, pois Pyth possui Q para a entrada já avaliada e uma função log2 (a) em vez de apenas o log geral (a, b).
fonte
Javascript (37)
Script simples que apenas divide por 2 repetidamente e verifica o restante.
fonte
for
loop (também 37 caracteres)for(i=prompt();i>1;i/=2){}alert(i==1)
Mathematica (21)
Sem entrada, é um pouco menor
fonte
⌊#⌋==#&@Log2@Input[]
Log2@Input[]~Mod~1==0
.JavaScript,
4140 caracteresComo isso funciona: você usa o logaritmo na base 2 usando
l(prompt()) / l(2)
, e se o resultado do módulo 1 for igual a zero, será uma potência de 2.Por exemplo: depois de pegar o logaritmo de 8 na base
2
, você recebe3
.3 modulo 1
é igual a 0, então isso retorna verdadeiro.Depois de pegar o logaritmo de 7 na base 2, você recebe
2.807354922057604
.2.807354922057604 modulo 1
é igual a0.807354922057604
, então isso retorna false.fonte
Math.log
já fará isso : "Cada uma das seguintes funções de objeto Math aplica o operador abstrato ToNumber a cada um de seus argumentos ..."JavaScript, 35
Funciona para bytes.
Versão de 46 caracteres , funciona para números de 16 bits.
O truque funciona nas linguagens mais dinâmicas.
Explicação: Converta o número na base 2, interprete essa sequência como base 10, execute o módulo 9 para obter a soma dos dígitos, que deve ser 1.
fonte
0x2ff
, qual é a base 21111111111
?+1
!alert(!(Number.MAX_VALUE%prompt()))
Perl 5.10+, 13 + 1 = 14 caracteres
Usa o mesmo método a partir de um fio de FWP de idade como a minha entrada GolfScript . Imprime
1
se a entrada for uma potência de dois e, caso contrário, uma linha vazia.Precisa ser executado
perl -nE
; on
custo é de um caractere extra , para um total de 14 caracteres. Como alternativa, aqui está uma versão de 18 caracteres que não precisa den
:fonte
python 3, 38
python, 32
No entanto, o código não funciona em todas as versões.
Observe que a solução também funciona para 0 (imprimir False).
fonte
==
com&
?Ruby - 17 caracteres (quarta tentativa)
Meu melhor atual é uma fusão da resposta de @ steenslag com a minha. Abaixo estão minhas tentativas anteriores.
Ruby - 19 caracteres (terceira tentativa)
Ruby - 22 caracteres (segunda tentativa)
Ruby - 24 caracteres (primeira tentativa)
fonte
K / Kona (
2417)Retorna 1 se verdadeiro e 0 se falso. Qualquer potência de 2 tem um único bit igual a 1:
(isso imprime todos os poderes de 2 (de 0 a 9) em binário)
Então, resumo todos os componentes da expressão binária de
x
e vejo se é igual a 1; se simx=2^n
, então , caso contrário não.... sabia que eu poderia torná-lo menor
fonte
C # (54 caracteres)
fonte
Int32
, nãoToInt32
...int
vez deInt32
2 caracteres a menos.Rebmu (9 caracteres)
Teste
Rebmu é um dialeto restrito de Rebol. O código é essencialmente:
Alternativo
14 caracteres - Rebmu não tem um 'amassado' AND ~
Em Rebol:
fonte
GTB , 46 bytes
fonte
Python, 35
Não usa não apenas operações +/-, mas qualquer operação matemática, além de converter para a forma binária.
Outras coisas (interessantes, mas não para competição):
Eu também tenho uma versão regexp (61) :
(Adoro a ideia, mas a função de importação e correspondência a torna muito longa)
E agradável, mas chata versão de operações bit a bit (31) :
(sim, é mais curto, mas usa ~ -x para diminuir o que inclui - operação)
fonte
Python 2.7 (
30293937)EDIT: atualizado devido ao requisito de entrada do usuário;
Força bruta, tente dividir até = 1 (sucesso) ou <1 (falha)
fonte
not a%2
pode ser escrito comoa%2==0
. Concedido, isso seria mais longo em muitos idiomas, mas não no Python.a%2<1
.2.
remoção que salvaria um byte!Python (33)
fonte
int(bin(input()*2)[3:])<1
também funciona a partir do shell python com apenas 25 caracteres.Ruby,
33,28, 25fonte
APL (12 para 0/1, 27 para sim / não)
ou, se precisarmos gerar texto:
Leia em A. Forme um vetor 0..A, depois um vetor 2 0 ..2 A (sim, isso é muito mais do que necessário), depois um vetor comparando A com cada um deles (resultando em um vetor de 0 e no máximo um 1), depois xor que (não há operador xor no APL, mas ≠ aplicado aos booleanos atuará como um). Agora, temos 0 ou 1.
Para obter SIM ou NÃO: multiplique 0 ou 1 por 3, solte esse número de caracteres de 'YESNO' e, em seguida, pegue os 3 primeiros caracteres.
fonte
C, 65 bytes
fonte
main(k){...
, contando com aint
digitação implícita . Pode ser UB, mas isso é código de golfe. NUNCA use algo assim na produção, é claro.Haskell (
5250)fonte