On se retrouve aujourd'hui pour la solution du précédent #KataOfTheWeek proposé par Thomas en début de semaine !

Bon j'espère que vous vous en êtes sorti ! D'abord, parlons de l'algorithme en lui-même : il s'agit ni plus ni moins que de l'algorithme du code de gray. Je vous laisse la page wikipédia qui saura mieux vous en parler que moi !

Le piège ici était de partir sur une implémentation de l'algorithme comme il a été décrit dans le briefing. Il fallait écrire ses propres cas de test et comprendre comment l'algorithme fonctionnait réellement. Pour l'encodage, il ne s'agit que d'un XOR entre le nombre donné en paramètre et ce même nombre décalé d'un bit vers la droite. Pour le décodage, c'est un peu plus compliqué. Il faut faire un XOR par rapport au nombre décalé vers la droite pour chaque bit.

En ce qui concerne la solution la voici :

public class GrayCode {
    // M(x)
    public static long encode(long x) {
        return x ^ x >> 1;
    }

    // I(x)
    public static long decode(long num) {
        long mask = num >> 1;
        while (mask != 0) {
            num ^= mask;
            mask >>= 1;
        }
        return num;
    }
}

A bientôt pour un nouveau #KataOfTheWeek !