Saviez-vous qu'un petit nombre peut emprunter des bits à un plus grand nombre? Voici un exemple. Disons nos deux nombres 5 et 14. Tout d'abord, écrivez-les en binaire:
5 14
000101 001110
D' abord , nous prenons le plus petit sur peu loin du plus grand nombre, et nous donnons au plus petit de peu sur l'autre numéro. Donc
This bit turns off
|
v
000101 001110
^
|
This bit turns on
Maintenant nous avons
000111 001100
et nos nombres sont 7 et 12. Le premier nombre est encore plus petit, alors nous continuons.
000111 001100
001111 001000
Nous avons maintenant 15 et 8, donc nous pouvons arrêter. Nous appellerons cet ensemble d'opérations "emprunt de bits" deux nombres. Faisons un autre exemple. 20 et 61.
20 61
010100 111101
010101 111100
010111 111000
111111 100000
63 32
Donc, notre résultat final est 32, 63. Faisons-en un de plus. 31 et 12. 31 est déjà plus grand que 12, donc il n'y a rien à faire! L'emprunt de bits 31 et 12 donne 31 et 12, aucun changement.
Le défi
Votre défi est d'écrire un programme ou une fonction qui prend deux nombres et les emprunte en bits. Les deux nombres seront toujours des entiers positifs. Vos entrées et sorties peuvent être dans n'importe quel format raisonnable.
Test IO:
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
Les failles standard s'appliquent et la réponse la plus courte en octets gagne!
Python, 42 octets
Merci à @ jimmy23013 pour avoir joué au golf sur 4 octets! Merci à @LeakyNun d'avoir joué au golf sur 2 octets!
Testez-le sur Ideone .
la source
Mathematica, 46 octets
Même méthode que celle utilisée dans ma solution dans J.
Merci à @ Martin d' avoir sauvé 1 octet et de me rappeler l'application infixe
~
.Usage
L'entrée se compose de deux arguments entiers et la sortie est une liste avec les valeurs empruntées en bits.
la source
#//.{x_,y_}/;x<y:>{BitOr[x,x+1],BitAnd[y,y-1]}&
(peut-être avez-vous une idée comment le raccourcir cependant)/.
et la condition/;
. Souhaite que Mathematica puisse basculer entre booléen et bit à bit en inspectant les types d'arguments vers&&
et tels.Pyth,
292725222120191816 octetsSuite de tests.
la source
05AB1E,
1615 octetsEssayez-le en ligne
la source
Labyrinthe ,
3734 octetsEssayez-le en ligne!
Explication
Primaire Quick Labyrinth:
Le programme utilise le même algorithme que les autres réponses: nous remplaçons
(a, b)
par(a | a+1, b & b-1)
aussi longtemps quea < b
. J'ajouterai une explication complète après avoir essayé de jouer au golf un peu plus.L'IP commence dans le coin supérieur gauche, va à droite.
?
lit un entiera
. Ensuite, il"
n'y a pas d'opération, mais il est nécessaire d'empêcher l'IP de descendre immédiatement. C'est aussi une impasse, donc l'IP se retourne et s'exécute à?
nouveau pour lireb
.}
passe ensuiteb
de main à Aux , alors maintenant nous avons:Le
|
ne fait alors rien, car il prend le OU au niveau du bit dea
et0
. Puisque nous savons quea
c'est toujours positif, l'IP tourne vers l'est (parce qu'il ne peut pas tourner vers l'ouest). Cela commence la boucle principale du programme. Nous commençons par une courte section linéaire afin de comparera
etb
:L'IP est maintenant à une autre jonction. Considérons d'abord le cas où le résultat est positif. Cela signifie
b > a
et nous devons effectuer une autre itération. Cette itération est également complètement linéaire. Notez que les piles sont actuellement:Et puis nous revenons au début de la boucle (depuis
a
étant à nouveau positif, l'IP tourne à nouveau vers l'est).Si, à un moment donné, il
b-a
n'est plus positif, l'IP prendra l'un des deux autres chemins. Notez que dans les deux cas, nous allons cherchera
avec{
, puis frappons un coin où l'IP suit le virage, puis imprimonsa
avec!
. Maintenant, le haut de la pile est à nouveau,b-a
ce qui signifie que dans les deux cas, l'IP finira par se déplacer vers l'est. Il ne reste plus qu'un petit morceau linéaire:la source
Java 7, 73 octets
Cas non testés et testés:
Essayez-le ici.
Production:
Anciennes règles de contestation [
126125123 octets]:REMARQUE: les anciennes règles de défi utilisaient deux tableaux entiers en entrée, au lieu de deux entiers lâches.
la source
while
boucle comme cecifor(;x<y;x|=x+1,y&=y-1);
-_-
Je souhaite que je l'avais mieux écrit depuis le début. Heureusement, ce n'est pas un changement déraisonnable ou radical. De plus, oui, je n'ai pas commenté chaque réponse, mais j'ai informé chaque utilisateur. Je n'avais pas envie d'informer le même utilisateur plusieurs fois. Je n'ai pas commenté le post de Dennis, mais c'est parce qu'il était l'un des utilisateurs qui m'a encouragé à le changer initialement.JavaScript (ES6), 33 octets
Port simple des réponses par @miles.
la source
f=
début: PJulia, 27 octets
Essayez-le en ligne!
Comment ça fonctionne
Nous définissons l'opérateur binaire
<|
pour nos besoins. Il n'est pas défini dans les versions récentes de Julia, mais est toujours reconnu comme opérateur par l'analyseur. Bien que\
(non explicitement défini pour les entiers) soit un octet plus court, sa priorité élevée nécessiterait de remplacerx|-~x<|y&~-y
par(x|-~x)\(y&~-y)
, augmentant ainsi le nombre d'octets.<|
vérifie si son premier argument est strictement inférieur au second. Si c'est le cas, il s'appelle récursivement avec des arguments x | - ~ x = x | (x + 1) et y & ~ -y = y & (y - 1) .Depuis l'ajout de 1 à x, tous les bits de fin et le bit non défini le plus bas basculent, x | (x + 1) bascule le bit non défini le plus bas (et aucun autre bit). De même, puisque la soustraction de 1 à y bascule tous les bits non définis de fin et le bit le plus bas défini, y & (y + 1) bascule le bit le plus bas défini.
Enfin, lorsque l'inégalité x <y ne tient plus,
<|
retourne la paire [x, y] .la source
MATLAB,
6766 octetsboucle:
récursif (67 octets):
Même approche pour changer les bits que beaucoup d'autres réponses.
la source
Clojure, 63 octets
Même méthode que celle utilisée dans ma solution dans J.
Usage
la source