Problema:
Encontre o número de zeros à esquerda em um número inteiro assinado de 64 bits
Regras:
- A entrada não pode ser tratada como sequência; pode ser qualquer coisa em que operações matemáticas e bit a bit conduzem o algoritmo
- A saída deve ser validada com relação à representação inteira assinada de 64 bits do número, independentemente do idioma
- Aplicam-se as regras de código padrão de golfe
- O menor código em bytes ganha
Casos de teste:
Esses testes assumem números inteiros assinados pelo complemento de dois. Se seu idioma / solução não possui ou usa uma representação diferente de números inteiros assinados, chame isso e forneça casos de teste adicionais que possam ser relevantes. Incluí alguns casos de teste que abordam precisão dupla, mas fique à vontade para sugerir outros que devem ser listados.
input output 64-bit binary representation of input (2's complement)
-1 0 1111111111111111111111111111111111111111111111111111111111111111
-9223372036854775808 0 1000000000000000000000000000000000000000000000000000000000000000
9223372036854775807 1 0111111111111111111111111111111111111111111111111111111111111111
4611686018427387903 2 0011111111111111111111111111111111111111111111111111111111111111
1224979098644774911 3 0001000011111111111111111111111111111111111111111111111111111111
9007199254740992 10 0000000000100000000000000000000000000000000000000000000000000000
4503599627370496 11 0000000000010000000000000000000000000000000000000000000000000000
4503599627370495 12 0000000000001111111111111111111111111111111111111111111111111111
2147483648 32 0000000000000000000000000000000010000000000000000000000000000000
2147483647 33 0000000000000000000000000000000001111111111111111111111111111111
2 62 0000000000000000000000000000000000000000000000000000000000000010
1 63 0000000000000000000000000000000000000000000000000000000000000001
0 64 0000000000000000000000000000000000000000000000000000000000000000
False
vez de0
?Respostas:
Linguagem de máquina x86_64 no Linux, 6 bytes
Requer processador Haswell ou K10 ou superior com
lzcnt
instruções.Experimente online!
fonte
Hexagonia ,
7870 bytesExperimente online!
Esse desafio não é trivial demais para uma linguagem prática? ;)
comprimento lateral 6. Não consigo encaixá-lo em um hexágono de comprimento lateral 5.
Explicação
fonte
Python , 31 bytes
Experimente online!
O expresson é o bit a bit
&
de duas partes:O
67-len(bin(-n))
fornece a resposta correta para entradas não negativas. Ele pega o comprimento do bit e subtrai de 67, que é 3 a mais que 64 para compensar o-0b
prefixo. A negação é um truque para ajustar aon==0
usar essa negação que não produz um-
sinal na frente.Em
& ~n>>64
vez disso, a resposta é0
negativan
. Quandon<0
,~n>>64
é igual a 0 (em números inteiros de 64 bits), e assim por diante0
. Quandon>=0
, o~n>>64
avalia-1
e o fazer&-1
não tem efeito.Python 2 , 36 bytes
Experimente online!
Alternativa aritmética.
fonte
Java 8,
3226 bytes.Long::numberOfLeadingZeros
Builtins FTW.
-6 bytes graças a Kevin Cruijssen
Experimente online!
fonte
numberOfLeadingZeros
. Você pode jogar com 28 bytes de btw:n->n.numberOfLeadingZeros(n)
Long::numberOfLeadingZeros
é ainda mais curto (26 bytes).C (gcc) , 14 bytes
Funciona bem em tio
C (gcc) ,
3529 bytesExperimente online!
Than Dennis por 6 bytes
Sinalizadores do compilador C (gcc) , 29 bytes por David Foerster
Experimente online!
fonte
__builtin_clzl
com o qual eu possa criar .long
32 bits (incluindo Windows x64), é necessário__builtin_clzll
(sem assinatura por muito tempo). godbolt.org/z/MACCKf . (Diferentemente dos intrínsecos da Intel, os embutidos do GNU C são suportados, independentemente da operação ser executável com uma instrução de máquina. No x86 de 32 bits, o clzll compila em uma ramificação ou cmov para fazerlzcnt(low half)+32
oulzcnt(high half)
. Ou,bsr
selzcnt
não estiver disponível.__builtin_clz(l)(l)
comportamento é indefinido para zero: "Se x for 0, o resultado será indefinido."Perl 6 ,
35 2826 bytes-2 bytes graças a nwellnhof
Experimente online!
Bloco de código anônimo que pega um número e retorna um número. Isso converte o número em uma string binária e conta os zeros iniciais. Funciona para números negativos porque o primeiro caractere é um
-
exemplo-00000101
, portanto, não há zeros à esquerda.Explicação:
fonte
JavaScript (Node.js) , 25 bytes
Recebe a entrada como um literal BigInt.
Experimente online!
fonte
n=>n<1?0:n.toString(2)-64
o mesmo?n=>n<1?0:n.toString(2).length-64
, mas isso não funcionaria de qualquer maneira. Isso seria , eu acho..toString()
abordagem funcionando, mas ainda precisamos de um literal BigInt como entrada. Caso contrário, temos apenas 52 bits de mantissa, levando a resultados inválidos quando a precisão é perdida .Python 3 , 34 bytes
Experimente online!
fonte
J , 18 bytes
Experimente online!
J , 19 bytes
Experimente online!
Explicação:
fonte
1#.[:*/\1-_64{.#:
(17) está próximo, mas não funciona para números negativos :(Perl 6 , 18 bytes
-2 bytes graças a Jo King
Experimente online!
fonte
Ruby , 22 bytes
Experimente online!
fonte
05AB1E ,
109 bytesE / S são números inteiros
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Haskell , 56 bytes
Obrigado xnor por detectar um erro!
Pode alocar bastante memória, experimente online!
Talvez você queira testá-lo com uma constante menor: tente 8 bits!
Explicação
mapM(pure[0,1])[1..64]
mapM(pure[1,0])[1..64]
sum.fst.span(>0)
fonte
Powershell, 51 bytes
Script de teste:
Resultado:
fonte
Java 8, 38 bytes
Entrada como
long
(número inteiro de 64 bits), saída comoint
(número inteiro de 32 bits).Porta da resposta C (gcc) de @44m2 .
Experimente online.
Explicação:
EDIT: Pode ter 26 bytes usando o built-
Long::numberOfLeadingZeros
in conforme exibido na resposta Java 8 do @lukeg .fonte
APL + WIN, 34 bytes
Explicação:
fonte
C # (compilador interativo do Visual C #) , 42 bytes
Experimente online!
C # (compilador interativo do Visual C #) , 31 bytes
Ainda mais curto, com base na resposta C (gcc) de l4m2. Nunca soube que você poderia declarar funções assim, obrigado @Dana!
Experimente online!
fonte
Geléia ,
109 bytes-1 graças a um puro truque de Erik, o Outgolfer (agora não é negativo, agora é simplesmente
AƑ
)Um link monádico que aceita um número inteiro (dentro do intervalo) que gera um número inteiro.
Experimente online! Ou veja a suíte de testes .
O 10 foi
ḤBL65_ɓ>-×
Aqui está outra solução de 10 bytes, que eu gosto, pois diz que é "BOSS" ...
Conjunto de teste aqui
...
BoṠS63r0¤i
,BoṠS63ŻṚ¤i
ouBoṠS64ḶṚ¤i
também funcionaria.Outro 10 byter (de Dennis) é
æ»64ḶṚ¤Äċ0
(novamenteæ»63r0¤Äċ0
eæ»63ŻṚ¤Äċ0
também funcionará)fonte
Ƒ
rápido, muito bom!AƑ
há algum tempo agora. Esteja avisado de que não se vetoriza! ;-) Na verdade, é "achatar e depois verificar se todos os elementos não são negativos".Perl 5 , 37 bytes
Experimente online!
Ou 46 bytes se a "stringification" não for permitida: sub z
fonte
s/length$&/$+[0]/
(-3 bytes);)sub
palavra-chave das respostas que contêm funções do Perl 5.sub
de respostas para outros idiomas, perl6, powershell e muito mais.sub{}
criar um sub (anônimo?), O que explica por que é omitido nas respostas do Perl6. Concordo com o @nwellnhof que você não deve removersub
. (quando eu ainda estava ativo, há mais ou menos um ano, essa era a regra) #$+[0]
.Swift (em uma plataforma de 64 bits), 41 bytes
Declara um fechamento chamado
f
que aceita e retorna umInt
. Esta solução funciona apenas corretamente em plataformas de 64 bits, para ondeInt
étypealias
editadaInt64
. (Em uma plataforma de 32 bits,Int64
pode ser usado explicitamente para o tipo de parâmetro do fechamento, adicionando 2 bytes.)No Swift, mesmo o tipo inteiro fundamental é um objeto comum declarado na biblioteca padrão. Isso significa que
Int
pode ter métodos e propriedades, comoleadingZeroBitCount
(que é necessário em todos os tipos em conformidade com oFixedWidthInteger
protocolo da biblioteca padrão ).fonte
Haskell , 24 bytes
Experimente online!
Isso é basicamente o mesmo que a solução Java de Kevin Cruijssen, mas eu a achei de forma independente.
O argumento deve ter um tipo
Int
para uma compilação de 64 bits ouInt64
para qualquer coisa.Explicação
Se o argumento for negativo, o resultado será imediatamente 0. Caso contrário, mudamos para a esquerda, preenchendo um , até chegar a um número negativo. Esse preenchimento nos permite evitar um caso especial para 0.
Apenas para referência, aqui está a maneira óbvia / eficiente:
34 bytes
fonte
Limpo , 103 bytes
Usa o mesmo "embutido" que a resposta do tetocat.
Experimente online!
Limpo , 58 bytes
Experimente online!
fonte
Stax , 10 bytes
Execute e depure
É uma porta da solução 05AB1E de Kevin.
fonte
Perl 5
-p
, 42 bytesExperimente online!
Mais do que uma solução baseada em bitstring, mas uma solução decente baseada em matemática.
fonte
int
ligação que deveria resolver o problema.APL (NARS), 15 caracteres, 30 bytes
teste alguns números para ver como usar:
fonte
Ferrugem, 18 bytes
Experimente online!
fonte
K (ngn / k) , 6 bytes
Experimente online!
2\
codificar o argumento em binário#
comprimento64-
subtrair de 64fonte
# = length
... parece baseado em cadeia de caracteres2\
fornece uma lista de números inteiros e#
encontra seu comprimento. aqui não há cordas envolvidas.PHP,
5046 bytesExecute como pipe
-R
ou experimente on-line ,<?=$argn<0?0:0|64-log($argn+1,2);
tem problemas de arredondamento; então eu segui o longo caminho.fonte
Wolfram Language (Mathematica) , 41 bytes
A fórmula para números positivos é justa
63-Floor@Log2@#&
. Regras de substituição são usadas para casos especiais de entrada zero e negativa.A entrada não precisa ser um número inteiro assinado de 64 bits. Isso levará efetivamente o piso da entrada para transformá-la em um número inteiro. Se você inserir um número fora dos limites normais para um número inteiro de 64 bits, ele retornará um número negativo indicando quantos bits mais seriam necessários para armazenar esse número inteiro.
Experimente online!
A solução da @ LegionMammal978 é um pouco menor em 28 bytes. A entrada deve ser um número inteiro. De acordo com a documentação: "
BitLength[n]
é efetivamente uma versão eficiente deFloor[Log[2,n]]+1
". Ele lida automaticamente com o caso de zero relatório correto em0
vez de-∞
.Wolfram Language (Mathematica) , 28 bytes
Experimente online!
fonte
Boole[#>=0](64-BitLength@#)&
é um pouco menor em 28 bytes. Ele usa o mesmo conceito básico que o seu, mas aplicaBitLength
eBoole
.bitNumber - math.ceil (math.log (número) / math.log (2))
por exemplo, 64 bits NÚMERO: 9223372036854775807 math.ceil (math.log (9223372036854775807) / math.log (2)) ANS: 63
fonte