Sam & Max » fizzbuzz http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 FizzBuzz en Python 104 http://sametmax.com/fizzbuzz-en-python/ http://sametmax.com/fizzbuzz-en-python/#comments Tue, 29 Jan 2013 10:11:52 +0000 http://sametmax.com/?p=4309 rendu populaire par Imran Ghory et ayant pour but de gagner du temps dans l'embauche de développeurs.]]> Le FizzBuzz est un type de test qui a été rendu populaire par Imran Ghory et ayant pour but de gagner du temps dans l’embauche de développeurs.

Son constat est alarmant : une grande majorité des gens qui venaient aux entretiens pour un poste de programmeur, diplôme / CV / beau discours à l’appui, ne savaient pas… programmer. Il faut dire que c’est tellement facile de trouver un job pour dev.

Ayant l’impression de perdre son temps, il a créé des exercices simples, qui sont facilement solvables sans stress par n’importe quel programmeur digne de ce ce nom en quelques minutes. À sa surprise, 90 % des candidats s’y cassent les dents, ce qui lui permet de ne passer du temps qu’avec le reste.

Fais tourner le FizzBuzz

Exemple d’un énoncé :

Écrire un programme qui affiche les nombres de 1 à 199. Mais pour les multiples de 3, afficher “Fizz” au lieu du nombre et pour les multiples de 5 afficher “Buzz”. Pour les nombres multiples de 3 et 5, afficher “FizzBuzz”.

Voici ce que ça donne si vous le faites en entretien pour du Python en quelques minutes histoire de pouvoir passer à la suite :

for x in xrange(1, 200):
 
    fizz = not x % 3
    buzz = not x % 5
 
    if fizz and buzz :
        print "FizzBuzz"
    elif fizz:
        print "Fizz"
    elif buzz:
        print "Buzz"
    else:
        print x

S’amuser un peu

Ce qui est marrant avec les fizzbuzz, c’est de sortir de la solution classique pour faire des trucs tordus. Je suis notamment tombé sur deux one-liners très choupi pour résoudre le problème en Python :

for x in xrange(1, 200): print "Fizz"[x % 3 * 4:] + "Buzz" [x % 5 * 4:] or x

Et :

print '\n'.join('Fizz' * (not i % 3) + 'Buzz' * (not i % 5) or str(i) for i in xrange(1, 200))

C’est blindé d’astuces.

Pour la première solution, on fait une boucle normale et on print la concaténation de la chaîne "Fizz" et la chaîne "Buzz". MAIS on fait un slicing dessus en prenant en compte une particularité de "Fizz" et "Buzz" : les deux mots font 4 lettres. Or x % 3 (ou x % 5) sera égal à 0 si x est multiple de 3 (ou de 5). Donc si x est un multiple, on aura 0 * 4, soit un slicing de [0:] qui veut dire va du début à la fin. A l’inverse, si x n’est pas multiple, on aura un slicing de [4:], ce qui sur un mot de 4 lettres veut dire va de la fin à la fin, résultant en une chaîne vide.

Donc on peut avoir "Fizz" de vide ou "Buzz" de vide, ce qui va faire la chaîne “Fizz” ou “Buzz”, selon que x est le multiple de 3 ou 5. Si x est multiple des deux, on aura "Fizz" et "Buzz", qui concaténés va donner "FizzBuzz". Enfin, si x n’est multiple ni de 3, ni de 5, on concatène deux chaînes vides, ce qui donne une chaîne vide.

Une caractéristique de l’opérateur or en Python est qu’il ne retourne PAS un booléen. Il retourne le premier élément vrai, ou le dernier élément faux :

>>> 1 or 2
1
>>> 0 or 2
2
>>> 0 or False
False

Donc si il y a "Fizz" or x, "Buzz" or x ou "FizzBuzz" or x, il va retourner la chaîne. Par contre si il y a '' or x, il va retourner x.

Pour la deuxième solution, on créé une expression génératrice qui va être joinée sur '\n', donc un saut de ligne. On aura donc le listing attendu. Les valeurs sont générées par concaténation également, comme dans le premier exemple. La différence est qu’au lieu de choisir le slicing pour afficher ou non la chaîne, il utilise l’opérateur splat, qui sur une chaîne la multiplie :

>>> "Fizz" * 2
'FizzFizz'
>>> "Fizz" * 3
'FizzFizzFizz'
>>> "Fizz" * 1
'Fizz'
>>> "Fizz" * 0
''

Or, True vaut 1 en Python, et False vaut zéro. Du coup :

>>> "Fizz" * True
'Fizz'
>>> "Fizz" * False
''

not i % 5 et not i % 5 vont retourner True si x est multiple, sinon False :

>>> 15 % 5
0
>>> not 15 % 5
True

Du coup "Fizz" et "Buzz" vont être multiplié par True ou False selon que x est un multiple de 3 ou 5, et la chaîne résultante sera la bonne. Après on utilise le or de la même façon que dans le code du premier one-liner.

Mais quand même

Je trouve ça un peu déprimant que l’on ait autant de personnes qui se vendent comme codeurs et qui ne savent pas coder. Ok, je veux bien que dans une situation de stress les bouts de codes sortent plus difficilement, mais là c’est volontairement hyper simple. Personne ne demande le one-liner, c’est juste pour le fun. Mais la majorité des candidats ne peuvent même pas produire le tout premier code.

C’est aussi mon constat dans les boîtes dans lesquelles j’ai travaillé : énormément de flan.

Se pose alors un autre problème : la rareté de la main d’œuvre. Je discutais avec un CTO dernièrement. Il me disait que quand il tombait sur un bon candidat, il lui déroulait le tapis rouge car il avait trop peur qu’il se barre. C’était très dur pour lui de trouver un dev potable.

À côté de ça, on voit des annonces sur Popole emploi où il demande de maîtriser vingt-douze technos pour le SMIC.

C’est là qu’on voit que la grande majorité des gens ne pigent toujours rien à l’informatique. Ils n’ont aucune idée des échelles de valeur et de qualité.

On se retrouve avec une situation de loose-loose :

  • Les boîtes non-tech se retrouvent avec le fond du panier car elles embauchent en aveugle et les utilisateurs se retrouvent en mode dégradé en permanence. Une personne qui travaille chez Colissimo m’a parlé dernièrement de l’enfer du développement de leur système de gestion de paie fait en interne par un mec qui visiblement ne pige rien.
  • Les boîtes technos en chie un max pour trouver des bons dev. Ils sont souvent en sous-effectifs et se plaignent d’enchaîner les entretiens depuis un an sans rien trouver.
  • Les devs se sentent insultés par la plupart des annonces de job et les bons trouvent rarement (en France) un salaire et des conditions de travail qui correspondent à leurs qualifications. Car un bon dev aujourd’hui est quelqu’un de TRES qualifié. Or il est souvent classé selon son diplôme plutôt que ses compétences.
]]>
http://sametmax.com/fizzbuzz-en-python/feed/ 104