vmontagn.fr

devblog

Code Golf, car c’est la taille (du code) qui compte !



Après avoir passé la majorité de son temps à applique les bonnes pratiques de développement, certains developpeur ont un secret inavouable aux plus férues des softwares craftsmanship, une pratique plus vieille que le code spaghettis, la participation aux concours de Code Golf !

Le principe du Code Golf est basé sur la Complexité de Kolmogorov qui dit que la complexité d’un objet (qui peut être du texte, une image, des nombres, etc…) est la taille du plus petit algorithme qui engendre cet objet. L’objectif est de faire un programme informatique qui permet d’avoir le résultat espéré en codant ce dernier avec le moins de caractère possible.

Le nom de cette pratique vient tout simplement du sport mondialement connu du même nom, le golf, ou les joueurs essayes de faire rentrer une balle dans le trou en moins de coups possible. Les joueurs de golf utilise différents clubs en fonctions du terrains de la partie pour améliorer leur score. Aux code golf, l’utilisation de certains langage et leur fonctionnement en fonction de l’exercice permet un meilleur score.

L’article contient du code informatique, avoir des notions en python 3 est un plus pour le comprendre.

L’exercice de chauffe

Pour un premier pas, nous allons s’essayer à la tâche avec l’exercice le plus utilisé en entretien d’embauche, l’exercice du FizzBuzz.

Le principe est simple: écrire un programme qui affiche les nombres de 1 à 100. Mais pour les multiples de 3, afficher “Fizz” au lieu du nombre et pour les multiples de 5 afficher “Buzz”. Pour les nombres qui sont multiples de 3 et de 5, afficher “FizzBuzz”.

Step 1

Le code suivant est une solution de base pour cette exercice en python3, un langage adapte au code golf:
Taille actuelle: 202 caracteres.

for i in range(1, 101):
   if (i % 3 == 0 and i % 5 == 0):
       print("FizzBuzz")
   elif (i % 3 == 0):
       print("Fizz")
   elif (i % 5 == 0):
       print("Buzz")
   else:
       print(i)

Step 2

Maintenant utilisons des méthodes pour simplifier au maximum la taille du code:
Utilisation de la multiplication de chaîne et la valeur des booleans: En python, et comme en C, les valeurs du mot-clef boolean est soit 1 quand la condition est valide, et 0 quand la condition est invalide. Il suffit d’utiliser une multiplication la chaine de caractere pour trouver l’effet voulu:

Taille actuelle: 143 caracteres.

for i in range(1, 101):
   if (i % 3 == 0 and i % 5 == 0):
       print("Fizz"*(i % 3 == 0) + "Buzz"*(i % 5 == 0))
   else:
       print(i)

Step 3

Le mot-clef ’or’ : Si l’objet précédent est une valeur nulle, il est possible de la changer par une valeur par défaut. En python, le langage étant très faiblement typé, il est possible d’utiliser un nombre au lieu d’une chaine de caractere.
Taille actuelle: 77 caracteres.

for i in range(1, 101): print("Fizz"*(i % 3 == 0) + "Buzz"*(i % 5 == 0) or i)

Step 4

Le changement de condition: utiliser inférieur à 1 dans ce cas permet d’économiser deux caractères.
Taille actuelle: 77 caracteres.

for i in range(1, 101): print("Fizz"*(i % 3 < 1) + "Buzz"*(i % 5 < 1) or i)

Step 5

La suppressions d’espace: car ces derniers comptent !
Taille actuelle: 62 caracteres.

for i in range(1,101):print("Fizz"*(i%3<1)+"Buzz"*(i%5<1)or i)

Nous arrivons donc à un résultat de 62 points !
Apres de nombreuses recherches, le plus petit score trouve pour cette exercice en python 3 est de 59 points. Notre code est donc très proche du plus petit score.

Le dessous du décors

En quête d’avoir le meilleurs score possible, des super-héros barbus ont eu l’idée de créer des langages de programmations exclusivement dédiée à la pratique du code golf !

Voici une petite liste de langage exotique trouve pour le code golf:
Golf Script: http://www.golfscript.com/golfscript/
05ab1e: https://github.com/Adriandmen/05AB1E
Paradoc: https://github.com/betaveros/paradoc
Jelly: https://github.com/DennisMitchell/jellylanguage

Comment y participer ?

Il existe une multitude de site pour participer à ces concours, le plus connu est le stack exchange dédié aux code golf de stack overflow: https://codegolf.stackexchange.com/