Le hack FizzBuzz en Ruby
Voici ce qui trainait sur le net aujourd’hui, un jeu de FizzBuzz en une ligne de Ruby:
Ce qui donne:
Pour celles et ceux qui ne pigent pas cette ligne de code Ruby, on va la déconstruire petit à petit.
Nous avons affaire à une boucle (j’ai remplacé les {}
par do end
):
a.upto(b)
itère de a
jusqu’à b
:
Regardons de plus près l’intérieur de la boucle, là où c’est intéressant. Ruby permet d’appeler les méthodes sans utiliser de parenthèses. Ici je les ai simplement rajouter pour tenter de clarifier le code:
Maintenant qu’on est bien sûr qu’il s’agit de la méthode puts
avec un
argument bizarre dedans, je sépare les différents éléments de la grammaire de
Ruby par des espaces. Toujours pour essayer d’y voir plus clair:
Arrêtons nous un peu sur les sous-ensembles de chaîne [a, b]
.
Le premier chiffre est la position de départ, le second est le nombre de
caractères:
Ruby permet de donner une position de départ pas rapport à la fin:
Pour la suite, notez bien que si on va chercher des caractères avant le début ou après la fin de la chaîne, on se retrouve avec nil
. Ça n’est pas une erreur, c’est le comportement attendu:
Maintenant essayons de décrypter la formule mathématique. Utilisons une variable temporaire pour l’isoler:
En Ruby, **
est l’opérateur de puissance:
Quant à %
, c’est l’opérateur de la division modulaire, souvent appelé
modulo. Si vous avez plein de temps devant vous il y a la page wikipédia sur
l’arithmétique modulaire.
Sinon voici une explication rapide du modulo: c’est le reste de la division
entière. Donc 9 % 4 == 1
.
Sauf qu’ici on utilise le modulo avec un nombre négatif. Et là les maths se compliquent un peu, et surtout différents langages de programmation auront différents comportements.
Essayons plutôt de sentir la formule en l’appliquant aux nombres de 1 à 16:
J’imagine qu’à ce moment précis, vous êtes plusieurs à crier «Ha ha !».
Cette formule, en Ruby, a donc 4 solutions possibles:
- Quand n est un multiple de 3, la solution est -9.
- Quand n est un multiple de 5, la solution est -5.
- Quand n est un multiple de 15 (c’est à dire à la fois multiple de 3 et de 9), la solution est 0.
- Dans les autres cas, la solution est -14.
Voyons ce qu’il se passe avec 'FizzBuzz '
quand o
vaut respectivement -9, -5, 0 puis -14:
Peut-être vous demandez vous pourquoi il y a un espace après FizzBuzz ? En pratique, voici la raison:
En théorie, je vous laisse faire les calculs ;)
Pour finir, il reste à expliquer le ||
, un exemple vaut mieux qu’un long
discours:
Voilà, si vous voulez ajouter d’autres explications, les commentaires sont fait pour ça ;)