11/09/2012

Project Euler

Ce post, n'est qu'un petit Cocorico personnel pour montrer au monde que, malgré l'orientation que prend ma carrière, je peux encore être un hard-tech.

Mien amiUn mien ami (ci à droite mal symbolisé) me disait il y a quelques jours que je devrais me plonger dans ceci.

Du coup, je me suis dit : je vais jouer. et comme à coté de ça, un mien collègue me vante depuis plusieurs mois les plaisirs du Python, je me suis dis : je vais jouer en Python.

Les premiers exercices sont assez simples (et je ne dis pas seulement qu'ils sont facile à bruteforcer, je dis qu'ils sont faciles à bien concevoir), du coup : j'ai été tenté d'aller jouer avec les derniers problèmes. Et, quitte à jouer avec les derniers, autant jouer avec LE dernier.

Et bien, ce fut une grande leçon d'humilité : plus de 8 heures de boulot et 7 méthodes différentes pour arriver à mes fins. Au final, un programme qui s'exécute en un peu moins de 30 minutes alors que la limite théorique est de 1 minute.

1 in a hundred Mais j'ai quand même réussi à décrocher cette médaille (à gauche), que nous sommes (à peine) moins de 1000 à avoir au moment où j'écris ce post, et qui précise que j'étais parmi les 100 premières bonnes réponses (75e je crois).

Cela dit, et malgré la légitime fierté que me donne cet exploit, j'ai aussi pris ma leçon d'humilité en regardant les réponses des premiers qui ont conçu, en moins de 20 minutes un programme qui donne le même résultat en 0.3 secondes que le mien en 30 minutes. En ce domaine comme dans les autres, je ne manque pas de maîtres à dépasser.

10/08/2011

L'équipe de Génitech Tunisie

GTTeam.png

L'équipe de Génitech Tunisie pas tout à fait au complet : il manque une dizaine de personnes.

12/09/2010

Point théorique Java : Initialisations de variables

1) champs finaux.
Les champs finaux non-statiques d'une classe doivent être initialisés :
- soit lors de leur déclaration
- soit dans tous les constructeurs
- soit dans un bloc initialiseur

Les champs finaux statiques d'une classe doivent être initialisés :
- soit lors de leur déclaration
- soit dans un bloc initialiseur

2) Exceptions
Les initialisations des champs finaux non-statiques d'une classe ne sont pas autorisés à lancer des exceptions, sauf si celles-ci sont déclarées dans tous les constructeurs.
Les initialisations des champs finaux statiques d'une classe ne sont pas autorisés à lancer des exceptions. Pas du tout.

3) Utilisation de champs non-déclarés
3.1) principe
- Lors de l'initialisation d'un champ non-statique d'une classe, il est interdit de faire référence à des champs non-statiques non-finaux non-encore déclarés via leurs noms simples, sauf à gauche d'un opérateur d'assignation simple.
cette phrase peut s'écrire :
- Lors de l'initialisation d'un champ non-statique d'une classe, il est presque toujours interdit de faire référence à des champs non-statiques.
les cas où cela est autorisé sont détaillés ci-après.
Ainsi le code suivant n'est pas légal :

class R{
float f3 = f1;
float f1 = 4;
}


- De la même façon : lors de l'initialisation d'un champ statique d'une classe, il est interdit de faire référence à des champs statiques non-finaux non-encore déclarés via leurs noms simples, sauf à gauche d'un opérateur d'assignation simple.
Ainsi le code suivant n'est pas non plus légal :
class R{
static {f1++;};
static float f1 = 4;
}



- Ces règles s'appliquent aussi aux blocs d'initialisation.
Ainsi le code suivant n'est pas non plus légal :
class R{
{f1++;};
float f1 = 4;
}


3.2) utilisation de champs statiques pour initialiser des champs non-statiques
Il est parfaitement légal d'utiliser des champs statiques non-encore déclarés pour initialiser des champs non-statiques.
class R{
float f3 = f1; // ici f3 vaut bien 4
static float f1 = 4;
}


3.3) "nom simple"
L'utilisation d'un champ via un nom non-simple est autorisée. Ce code, par exemple, est autorisé :
class R{
float f3 = this.f1;
float f4 = getF1(); // à supposer que getF1 renvoie f1;
float f1 = 4;

static double d3 = R.d1;
static double d1 = 4;
}

Attention, le fait que cette utilisation soit autorisée n'implique pas que les initialisations se font dans un ordre hiérarchique.
Dans le code précédent, f3, f4 et d3 valent 0

3.4) champs finaux
L'utilisation de champs finaux non-encore déclarés pour l'initialisation de champs est légale.
Qui plus est, les champs finaux sont initialisés avant les autres.
Ainsi le code suivant est autorisé :
class R{
float f3 = f1; // ici f3 vaut 4
final float f1 = 4;
}


3.5) utilisation à gauche d'un opérateur d'assignation simple
Vocabulaire : l'opérateur d'assignation simple est l'opérateur = (par opposition aux opérateurs d'assignation composés : += *= %= >>= ...)
Cette utilisation est acceptée. Le code suivant, par exemple est légal :
class R{
float f3 = f1 = 4;
float f1 = 5;
}