Dado um número inteiro , você precisa encontrar o número mínimo de bits que precisam ser invertidos em para transformá-lo em um número quadrado . Você só pode inverter bits abaixo do mais significativo .N
Exemplos
- já é um número quadrado ( ), portanto a saída esperada é . 0
- pode ser transformado em um número quadrado invertendo 1 bit: ( ), portanto a saída esperada é . 25 = 5 2 1
- não pode ser transformado em um número quadrado invertendo um único bit (os resultados possíveis são , , e ), mas isso pode ser feito invertendo 2 bits: ( ), portanto a saída esperada é .20 18 30 10110 → 10 0 0 0 16 = 4 2 2
Regras
- Tudo bem se o seu código for muito lento ou gerar um erro para os casos de teste maiores, mas deve, no mínimo, suportar em menos de 1 minuto.
- Isso é código-golfe !
Casos de teste
Input | Output
----------+--------
4 | 0
22 | 2
24 | 1
30 | 3
94 | 4
831 | 5
832 | 1
1055 | 4
6495 | 6
9999 | 4
40063 | 6
247614 | 7 (smallest N for which the answer is 7)
1049310 | 7 (clear them all!)
7361278 | 8 (smallest N for which the answer is 8)
100048606 | 8 (a bigger "8")
Ou no formato amigável de copiar / colar:
[4,22,24,30,94,831,832,1055,6495,9999,40063,247614,1049310,7361278,100048606]
100048606
no TIO, isso é um problema?Respostas:
Ruby, 74 bytes
Experimente online!
Isso simplesmente gera a sequência (que é muito mais que suficiente), XORs com e, em seguida, recebe o número de 1s em seu binário representação se o número de bits for menor ou igual a , ou caso contrário. Leva então o número mínimo de bits invertidos. Retornar vez do número de bits invertidos quando o bit mais alto invertido for maior que impede que esses casos sejam escolhidos como o mínimo, pois sempre será maior que o número de bits que possui. n log 2 nnn log 2 nn[12,22,…,n2] n log2n n n log2n n
Agradecemos a Piccolo por salvar um byte.
fonte
(n^x*x).to_s 2;...
vez de(n^x*x).to_s(2);...
Gelatina , 12 bytes
Experimente online!
Confira uma suíte de testes!
Link monádico. Deve ser jogável.
Mas sou burra demais para pensar em uma maneira de me livrar dosÉ a minha primeira resposta na qual uso com êxito o filtro / mapeamento / loop em geral, juntamente com uma cadeia diádica \ o /³
s.Explicação
fonte
Casca , 20 bytes
Experimente online!
Explicação
fonte
▼mΣfo¬←ṠMz≠ȯfo£İ□ḋπŀ2Lḋ
economiza 2 bytes. RIP você pontuação quadrada perfeita.Perl 6 , 65 bytes
Experimente online!
Eu me sinto um pouco suja por testar um quadrado perfeito, procurando por um período na representação de seqüência de caracteres da raiz quadrada do número, mas ... qualquer coisa para raspar bytes.
fonte
05AB1E ,
2015 bytes-5 bytes graças a @ Mr.Xcoder usando uma porta de sua resposta Jelly .
Experimente on-line ou verifique todos os casos de teste (os três maiores casos são removidos porque atingem o tempo limite após 60 segundos; ainda leva cerca de 35 a 45 segundos com os outros casos de teste).
Explicação:
fonte
Lnʒ‚b€gË}^b€SOß
. Ele quebra o seu conjunto de testes, infelizmente, emboraJava (JDK 10) , 110 bytes
Experimente online!
fonte
&
, em vez de lógica e&&
Gaia , 18 bytes
Perto do porto da minha resposta Jelly .
Experimente online!
Demolir
fonte
Braquilog ,
5641 bytesNão vai quebrar nenhum recorde, mas pensei em publicá-lo de qualquer maneira
Experimente online!
fonte
montagem x86-64, 37 bytes
Bytecode:
Bem, isso calcula até o exemplo mais alto em menos de um segundo.
O coração do algoritmo é xor / popcount, como de costume.
fonte
mov
s por umxchg
mov %ecx,%eax
) e não posso deixar% ecx morrer lá.Wolfram Language (Mathematica) , 67 bytes
Experimente online!
BitLength
Pick
BitXor
Min
DigitCount
1
fonte
Carvão , 31 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
fonte
Gelatina , 20 bytes
Experimente online!
fonte
Python 2 , 82 bytes
Experimente online!
fonte
Japonês
-g
, 20 bytesIsso pode ser jogado para baixo.
Experimente online!
fonte
C (gcc) ,
9391 bytesExperimente online!
Edit: Eu acho que minha solução original ( Experimente on-line! ) Não é válida, porque uma das variáveis
m
, global para salvar alguns bytes por não especificar o tipo, foi inicializada foraf(n)
e, portanto, teve que ser reinicializada entre as chamadasCódigo não comentado e comentado:
Edições:
fonte