Desafio
Dado um número inteiro no formato de complemento de dois bits de 32 bits , retorne o índice do segundo dígito zero menos significativo na representação binária, em que um índice 0
representa o bit menos significativo e um índice 31
representa o bit mais significativo.
Se não houver um segundo zero, você pode retornar 0, qualquer número negativo, qualquer valor falso ou relatar um erro de uma maneira que faça sentido no seu idioma.
Você pode usar a indexação 1, se preferir, mas os casos de teste abaixo usarão a indexação 0.
Você pode usar números inteiros não assinados, se preferir; Se o fizer, você deve manipular números inteiros no intervalo [0, 2^32)
. Se você usar números inteiros assinados, deverá manipular números inteiros no intervalo [-2^31, 2^31)
. Os casos de teste aqui usarão números inteiros assinados, mas observe que -x
(assinado) é 2^32 - x
(não assinado).
Casos de teste
0 (0b00) -> 1 1 (0b001) -> 2 10 (0b1010) -> 2 11 (0b01011) -> 4 12 (0b1100) -> 1 23 (0b010111) -> 5 -1 (0b11..11) -> nenhum -2 (0b11..10) -> nenhum -4 (0b11..00) -> 1 -5 (0b11..1011) -> nenhum -9 (0b11..10111) -> nenhum 2 ^ 31-2 (0b0111..1110) -> 31
Pontuação
Isso é código-golfe , então a resposta mais curta em cada idioma vence!
[0, 2^32)
.0b...
como entrada?2^32-1
porque não deveria voltar33
.Respostas:
Python 2 , 45 bytes
Experimente online!
Usa indexação 0, números não assinados e gera um erro no segundo zero.
Simplesmente cria uma lista de índices de bits não definidos, do menor para o maior, e retorna a segunda entrada.
fonte
JavaScript (ES6), 34 bytes
Retorna um índice com base em 0 ou
-1
se nenhum segundo zero for encontrado.Casos de teste
Mostrar snippet de código
Expressão alternativa
Versão recursiva, 42 bytes
Retorna um índice com base em 0 ou
false
se nenhum segundo zero for encontrado.Como?
Casos de teste
Mostrar snippet de código
Versão alternativa sugerida por Neil, 41 bytes
Retorna um índice baseado em 0 ou gera um erro de recursão em excesso se nenhum segundo zero for encontrado.
fonte
f=(n,c=1)=>n%2?1+f(~-n/2,c):c&&1+f(n/2,0)
Geléia , 7 bytes
Experimente online!
Ele gera algo que não está no intervalo [1,31] se não houver o segundo zero. Isso inclui
32
33
e(-inf+nanj)
. Eu acho que isso faz algum sentido.Calcula
log(((x|(x+1))+1)&~x)/log(2)
.fonte
-inf+nanj
Eu não acho que poderia mesmo existir(-inf+nanj)
uma entrada2147483647
com uma representação binária de 31 1s; portanto, não existe um segundo zero na notação assinada de 32 bits (é por isso que é muito mais curto do que o meu e as respostas de Erik).(-inf+nanj)
?Java, ...
194191186bytes-159 Bytes por usar nomes de variáveis menores e remover espaços em branco
-25 Bytes, depois de pegar variáveis ainda mais curtas e graças às dicas do @KevinCruijssen
-18 Bytes, mais espaços em branco, nome da função
-3 Bytes, graças ao @KevinCruijssen, reduzindo a condição
-5 Bytes , Graças a @Arnold Palmer, @KevinCruijssen, encurtando o loop
Ungolfed
fonte
static
pode ser removido;if(n<0||n>o){return 0;}
pode serif(n<0|n>o)return 0;
(em|
vez de||
e sem colchetes);bs
,bsa
etc. podem ser caracteres únicos (nunca use nomes de variáveis / métodos de vários bytes no code-golf); Você pode combinarint
s, como este:int o=2^32-2,c=0,i=x.length,l=i-1;
. E há mais algumas coisas para jogar golfe. Dicas para jogar golfe em Java e Dicas para jogar golfe em todos os idiomas podem ser interessantes para ler. Mais uma vez bem-vindo, e aproveite a sua estadia! :)if(c[i]=='0'){j++;}
ainda pode ser jogadoif(c[i]==48)j++;
para -3 bytes :) EDIT: Ou melhor ainda:while(j<2&&i>0){i--;if(c[i]=='0'){j++;}}
pode serfor(;j<2&i>0;j+=c[i--]==48?1:0);
para -8 bytes.for(;j<2&i>0;j+=c[--i]==48?1:0);
, deve funcionar. O erro vem doi
comprimento da string, então, inicialmente, você está tentando indexar além dos limites da matriz. Se você fizer um pré-decréscimo (conforme mostrado no snippet atualizado), na primeira vez em que o usar, ele será acessadoc[c.length-1]
como no seu código original.Java (OpenJDK 8) ,
4438 bytesExperimente online!
Retorna 0 se nenhum segundo bit zero existir.
fonte
Código de máquina IA-32,
1413 bytesHexdump:
Lista de desmontagem:
Recebe entrada
ecx
; saída é emal
. Retorna 0 em erro.Antes de tudo, inverte a entrada, para poder usar as instruções de verificação de bits para procurar por bits definidos. Ele procura o bit de conjunto menos significativo, redefine-o, procura o bit de conjunto menos significativo novamente e retorna o resultado.
Se a instrução bit-scan não encontrar nenhum bit definido, a documentação da Intel diz que a saída é indefinida. No entanto, na prática, todos os processadores deixam o registro de destino inalterado nesse caso (conforme observado por Cody Gray, a documentação da AMD descreve esse comportamento como obrigatório).
Portanto, existem os seguintes casos:
not
e permanece 0btr
e permanece 0 apósbsf
bsf
fonte
SALC
+DEC
seja extremamente inteligente, você pode cortar um byte usando apenas o que estiver naECX
segundaBSF
instrução. A única coisa que requer é um byteXCHG
para obter o resultado,EAX
para que possa ser retornado. Em outras palavras,not ecx; bsf eax, ecx; btr ecx, eax; bsf ecx, ecx; xchg eax, ecx; ret
ECX
como registro de entrada, precisamos informar ao GCC para usar a convenção de chamada de chamada rápida.Dyalog APL, 20 bytes
Usa indexação 1, lança
INDEX ERROR
em caso de nenhum segundo zero.Como?
⍵⊤⍨
- codificar⍵
como32⍴2
- sequência binária de comprimento 32⌽
- marcha ré~
- negar (0 → 1, 1 → 0)(⍳32)/⍨
- comprimir com o intervalo de 1 a 32 (deixando índices de zeros)2⊃
- escolha o segundo elementofonte
⍸
)Gelatina , 13 bytes
Experimente online!
Usa indexação 1, obtém um número inteiro sem sinal como entrada. Retorna
0
para não encontrado.fonte
33
para a entrada4294967295
(2^32-1
, o equivalente sem sinal de 32 bits do-1
)Gelatina , 12 bytes
Um link monádico, usando um número inteiro, usando a opção não assinada e retornando o resultado indexado em 1 (retorna 0 quando não existe).
Experimente online!
ou
Tente isso
Como?
1
2)
fonte
código de máquina x86_64,
3432 bytesNão tenho certeza se essa é a abordagem correta, muitos bytes (acontece que não é ):
Experimente online!
Obrigado @CodyGray pelos
-2
bytes.fonte
BSF
,BSR
,POPCNT
,BT
, etc. Anatolyg tem apresentado uma solução ao longo destas linhas . Ainda não determinei se pode ser derrotado. :-por ecx, -1
,. São 3 bytes, 1 byte menor que XOR + NEG. Este não é um bom truque quando não está jogando golfe, pois introduz uma dependência de leitura falsa no registro de destino, mas você apenas usamov ecx, -1
e gasta os 5 bytes.8o , 149 bytes
Código comentado
Uso e saída
fonte
R , 66 bytes
lê de stdin; retorna
0
para nenhum segundo zero e o local, caso contrário.Experimente online!
fonte