Você sabia que um número pequeno pode emprestar bits de um número maior? Aqui está um exemplo. Digamos nossos dois números 5 e 14. Primeiro, escreva-os em binário:
5 14
000101 001110
Primeiro vamos dar a menor em pouco longe do maior número, e nós dar-lhe com o menor off pouco por outro número. tão
This bit turns off
|
v
000101 001110
^
|
This bit turns on
Agora temos
000111 001100
e nossos números são 7 e 12. O primeiro número ainda é menor, por isso continuamos.
000111 001100
001111 001000
Agora temos 15 e 8, para que possamos parar. Vamos chamar esse conjunto de operações de "empréstimo de bits" de dois números. Vamos fazer outro exemplo. 20 e 61.
20 61
010100 111101
010101 111100
010111 111000
111111 100000
63 32
Portanto, nosso resultado final é 32, 63. Vamos fazer mais um . 31 e 12. 31 já é maior que 12, então não há nada a fazer! O empréstimo de bits 31 e 12 fornece 31 e 12, sem alterações.
O desafio
Seu desafio é escrever um programa ou função que aceite dois números e os empreste pouco. Os dois números sempre serão números inteiros positivos. Sua entrada e saída podem estar em qualquer formato razoável.
Teste de E / S:
Input: 2, 3
Output: 3, 2
Input: 3, 2
Output: 3, 2
Input: 8, 23
Output: 31, 0
Input: 42, 81
Output: 63, 0
Input: 38, 41
Output: 47, 32
Input: 16, 73
Output: 23, 0
Input: 17, 17
Output: 17, 17
As brechas padrão se aplicam e a resposta mais curta em bytes vence!
Python, 42 bytes
Graças a @ jimmy23013 por jogar fora 4 bytes! Graças a @LeakyNun por jogar fora 2 bytes!
Teste em Ideone .
fonte
Mathematica, 46 bytes
O mesmo método usado na minha solução em J.
Obrigado a @ Martin por salvar 1 byte e me lembrar do aplicativo infix
~
.Uso
A entrada consiste em dois argumentos inteiros e a saída é uma lista com os valores emprestados por bits.
fonte
#//.{x_,y_}/;x<y:>{BitOr[x,x+1],BitAnd[y,y-1]}&
(talvez você tenha uma idéia de como reduzi-lo embora)/.
e condição/;
. Gostaria que o Mathematica pudesse alternar entre booleano e bit a bit, inspecionando tipos de argumento para&&
e tal.Pitão,
292725222120191816 bytesSuíte de teste.
fonte
05AB1E,
1615 bytesExperimente online
fonte
Labirinto ,
3734 bytesExperimente online!
Explicação
Primer Labirinto Rápido:
O programa usa o mesmo algoritmo que as outras respostas: substituímos
(a, b)
com(a | a+1, b & b-1)
enquantoa < b
. Vou adicionar uma explicação completa depois de tentar jogar um pouco mais.O IP começa no canto superior esquerdo, indo para a direita.
?
lê um número inteiroa
. Então"
é um no-op, mas é necessário impedir que o IP caia imediatamente. Esse também é um beco sem saída, portanto o IP se vira e executa?
novamente para lerb
.}
passab
de main para aux , então agora temos:O
|
então não faz nada, porque leva o OR bit a bit dea
e0
. Como sabemos quea
sempre é positivo, o IP vira para o leste (porque não pode virar para o oeste). Isso inicia o loop principal do programa. Começamos com uma seção linear curta para comparara
eb
:O IP está agora em outra junção. Primeiro, vamos considerar o caso em que o resultado é positivo. Isso significa
b > a
e precisamos executar mais uma iteração. Essa iteração também é completamente linear. Observe que as pilhas estão atualmente:E então voltamos ao início do loop (já que
a
é positivo novamente, o IP vira para leste novamente).Se em algum momento
b-a
não for mais positivo, o IP seguirá um dos outros dois caminhos. Note-se que em ambos os casos que buscara
com{
, em seguida, bateu um canto onde o IP segue a curva e, em seguida, imprimira
com!
. Agora, a parte superior da pilha está novamente, ob-a
que significa que, nos dois casos, o IP acabará se movendo para o leste. Tudo o que resta é um pequeno bit linear agora:fonte
Java 7, 73 bytes
Casos não testados e de teste:
Experimente aqui.
Saída:
Regras de desafio antigas [
126125123 bytes]:NOTA: As regras de desafio antigas usavam duas matrizes inteiras como entrada, em vez de dois inteiros soltos.
fonte
while
loop assimfor(;x<y;x|=x+1,y&=y-1);
-_-
Eu gostaria de ter escrito melhor desde o começo. Felizmente, não é uma mudança irracional ou drástica. Além disso, sim, não comentei todas as respostas, mas informei todos os usuários. Não queria informar o mesmo usuário várias vezes. Não comentei no post de Dennis, mas isso foi porque ele foi um dos usuários que me incentivou a alterá-lo inicialmente.JavaScript (ES6), 33 bytes
Porta simples das respostas por @miles.
fonte
f=
ath no início: PJulia, 27 bytes
Experimente online!
Como funciona
Definimos o operador binário
<|
para nossos propósitos. Ele é indefinido nas versões recentes do Julia, mas ainda é reconhecido como operador pelo analisador. Embora\
(não definido explicitamente para números inteiros) seja um byte mais curto, sua alta precedência exigiria a substituiçãox|-~x<|y&~-y
por(x|-~x)\(y&~-y)
, aumentando assim a contagem de bytes.<|
verifica se o primeiro argumento é estritamente menor que o segundo. Nesse caso, ele se chama recursivamente com argumentos x | - ~ x = x | (x + 1) e y & ~ -y = y & (y - 1) .Como a adição de 1 a x alterna todos os bits finais à direita e o menor bit não definido, x | (x + 1) alterna o bit não definido mais baixo (e nenhum outro bit). Da mesma forma, como subtrair 1 de y alterna todos os bits não definidos à direita e o bit mais baixo definido, y & (y + 1) alterna o bit mais baixo definido.
Finalmente, quando a desigualdade x <y não mais se mantém,
<|
retorna o par [x, y] .fonte
MATLAB,
6766 bytesloop:
recursivo (67 bytes):
A mesma abordagem para alterar bits como muitas outras respostas.
fonte
Clojure, 63 bytes
O mesmo método usado na minha solução em J.
Uso
fonte