mercredi 9 novembre 2011

tintin : oui mais bof

Samedi, direction le cinéma pour aller voir tintin avec les gars.
Pas vraiment motivé mais les filles allaient voir intouchables, impossible d'imaginer mes têtes blondes de 4,8 et 12 ans devant le même film. Donc, tintin.

bande annonce et publicité super longue, Tom (4 ans) commençait déjà à en avoir marre, il me demande plusieurs fois quand le film commence. ça part mal ! Enfin, après une petite demi heure (!), le film commence.

 Les premières images sont réellement bluffantes, le dessin hyper réaliste donne un peu le vertige. C'est tellement vrai, les expressions du visage, les effets de lumière, les mouvements... et puis, ç'est comme tout, on fini par se lasser et on se laisse uniquement porté par l'histoire.

La filiation avec Indiana Jones est évidente (ou plutôt l'inverse), on voit vraiment de Spielberg s'est largement inspiré du héro d'Hergé pour créer son personnage. Ca court, ca saute, on circule au 4 coins du monde, du tintin quoi ! Pas de déception, on est vraiment dans l'univers de la BD. Le réalisateur n'a pas pris le partie de certains réalisateurs (suivez mon regard) qui prenne une BD comme point de départ d'un film mais ce sente obligé d'inventer une histoire complètement nouvelle (non je n'ai pas parlé d'Adèle Blanc Sec !). Pas de surprise, on est en univers connu.

Au final, bilan des courses ?

  •  Simon 12 ans, bof, un peu cul-cul pour lui, après Real Steel de la semaine dernière, tintin c'est carrément bof. 
  • Tom 4 ans, trop long, s'est fait chié, m'a demandé 10 fois quand est-ce que c'est fini, 2 heures et des bananes c'est largement trop long. Et puis tintin c'est un peu bavard. Dans la tête de Tom, ça restera pas un grand souvenir. 
  • Andrea, 8 ans, lui, je crois qu'il a aimé. C'est bien simple, sitôt rentré à la maison il s'est plongé dans les albums, albums qu'il n'avait jamais touché auparavant, peut-être une vocation qui commence. 
  •  Et moi ? bof, pas passé un mauvais moment mais il ne restera pas grand chose, je ne reverrait pas ce film une seconde fois, ni mes gars non plus. 
 Par contre, juste pour signaler qu'on a vu la nouvelle bande annonce du chat Potté et là, on sent vraiment le gros gros potentiel. Les rires de Tom à coté de moi me signalant que là, tout le monde devrait être d'accord !

vendredi 4 novembre 2011

Tour de hanoi - exercice de style

Vous connaissez le problème des tours de Hanoi ? c'est un petit problème algorithmique assez marrant à résoudre. vous pouvez trouver le détail sur la page dédié sur wikipedia, pour faire simple, le problème est le suivant :

vous avez des disques empilés sur une tour de départ. Le but va être de les déplacer sur une tour d'arrivée en vous aidant d'une tour intermédiaire. Jusque là, ça va... le seul petit problème c'est qu'on :

  • ne pas déplacer plus d'un disque à la fois
  • on ne peut déplacer un disque que sur un emplacement vide ou alors sur un disque plus grand
voila, c'est le type même de beau problème. Enoncé simple, réalisation pas forcément aussi aisée.

Maintenant, prenons un exemple de résolution de ce problème avec 3 disques . Au départ, j'ai 3 disques empilés sur la 1ére tour. 1ère itération, je déplace le 1er disque sur la tour 3. Ensuite je déplace le 2nd disque sur la tour intermédiaire 2 et je peux alors dans la 3éme itération remettre mon 1er disque sur le second, tour intermédiaire.

Dans la 4éme itération, j'ai enfin mon plus grand disque disponible pour être déplacer sur la tour d'arrivée. Après, je m'aide de ma tour de départ comme tour intermédiaire pour enfin reconstituer ma pile.

Au final, 7 itérations pour arriver au but ! sur la page wikipedia on vous donne la formule du nombre d'itération, c'est 2 puissance votre nombre de disque - 1. Dans notre cas : 23-1 = 7 bingo



Nous allons maintenant voir comment résoudre ce problème grace a un algorithme récursif !

Si on regarde bien les déplacements, on peut dire que tout le problème consiste à :
  1. déplacer  les 2 premiers disques vers la tour intermédiaire
  2. déplacer le 3éme disque vers la tour d'arrivée
  3. déplacer les 2 disques de la tour intermédiaire vers la tour d'arrivée
Au final, cela nous donne la fonction suivante :
Procedure Deplacer(nbdisques,depart,arrivee,intermediaire)
  Si (nbdisques = 1) Alors
     Ecrire (depart, " -> ", arrivee)
  Sinon
     Deplacer(nbdisques-1,depart,intermediaire,arrivee)
     Deplacer(1,depart,arrivee,intermediaire)
     Deplacer(nbdisques-1,intermediaire,arrivee,depart)
  FinSi
Fin

pas compliqué, hein ?
Voici un petit exemple d'implémentation de l'algorithme des tours de Hanoi en Java. Si j'ai un peu de temps, je vous écrit le même algo en Groovy et en PHP, mes deux langages préférés (enfin, surtout ceux que je connais à peu près...). Si quelqu'un veut m'envoyer sa version dans son langage préféré. On pourrait même faire un petit benchmark ensuite.
/**
 * algorithme récursif de résolution des tours de Hanoi
 * 
 * @author olivier
 */

import java.util.*;

public class hanoi_recursive {
 static int coup = 0;

 public static void main(String[] args) {
  Scanner Entree = new Scanner(System.in);
  System.out.printf("Entrez le nombre de disques : ");
  int nbDisques = Entree.nextInt();
  Entree.close();
  System.out.printf("\n coup    déplacement\n");
  System.out.printf("---------------------\n");
  long startTime = System.currentTimeMillis();
  deplacer(nbDisques, 1, 3, 2);
  long endTime = System.currentTimeMillis();
  System.out.println("Temps d\'exécution en millisecondes :"
    + (endTime - startTime));
 }

 /**
  * procédure récursive des tours de Hanoi
  * @param nb_disques
  * @param depart
  * @param arrivee
  * @param intermediaire
  */
 static void deplacer(int nb_disques, int depart, int arrivee,
   int intermediaire) {
  if (nb_disques == 1) // déplacement d'un seul disque
   System.out.printf("%4d      %d -> %d\n", ++coup, depart, arrivee);
  else // déplacement d'une pile de disques
  {
   deplacer(nb_disques - 1, depart, intermediaire, arrivee);
   deplacer(1, depart, arrivee, intermediaire);
   deplacer(nb_disques - 1, intermediaire, arrivee, depart);
  }
 }
}

jeudi 3 novembre 2011

captain america - super-heros = super chiant

Je me fais à chaque fois avoir. Le décor, la bande annonce, l'image... Ce qui m'a décidé pour ce captain america était le coté un peu "oldies" du film. La période aussi. Un film d'avenger pendant la 2éme guerre mondiale, pourquoi pas.

Au final, quelle impression me reste de ce captain america ? Bof, pas forcément grand chose. Bon petit film à voir pour de belle image, sans plus.

Pas un mauvais moment, effectivement les décors, l'ambiance est bien marqué par ce coté rétro mais c'est pratiquement tout. Il faut s'y faire, dans un film de super-héros, le super-héros est toujours super chiant et le méchant en face est toujours très con. Je crois que c'est l'exercice de genre qui veut ça. Pour ne pas se tromper, les personnages sont pratiquement la caricature de la caricature.

 Sur la palanqué de film de super-héros ne surnage que batman begins et dark knight, mais ça c'est christopher Nolan. On peut ajouter également ironman 1, pour le 2 je ne suis pas sûr.

Bref, promis juré, je ne me fais plus avoir

mardi 1 novembre 2011

San antonio : les tontons flingueurs sur papier

C'est pas très glorieux, c'est même carrément très moyen mais il faut que j'avoue que ma première véritable découverte en littérature a été SAS de Gérard de Villiers...

mardi 20 février 2007

une classe qui simule une persistance

pour tester une application, l'étape initiale obligatoire est de lancer un serveur de base de données, de créer une connexion et d'utiliser ensuite un outil de mapping (hibernate ou autre) pour récupérer et mettre à jour des enregistrements.

hier, j'ai craqué devant ce travail (!) et je me suis créé une petit classe qui simulate la persistance sur un objet. les données sont stockées dans une HasMap en statique, cela permet de lire, mettre à jour, supprimer et ajouter des enregistrements à cette liste, comme si on était connecté à une base de données.

voici le code de cette classe

public class UserDAO {
// this hashmap simulate a db table
private static Map users = new HashMap();

// id
private static int cpt_id = 1;

// an instance of the class
private static UserDAO instance;

private UserDAO() {
// initialize the table with a record
User user = new User();
user.setId(cpt_id);
user.setCode("AAAAA");
user.setFirstname("olivier");
user.setLastname("lemoigne");
user.setBirthday(new GregorianCalendar(1967, 10, 31).getTime());
users.put(new Integer(cpt_id), user);
}

public static UserDAO getInstance() {
if (null == instance) {
instance = new UserDAO();
}
return instance;
}
public static List findAll() {
List results = new ArrayList();

//loop through the map
for(Map.Entry entry: users.entrySet())
results.add(entry.getValue());
return results;
}
public static int create(User user){
user.setId(++cpt_id);
users.put(new Integer(user.getId()), user);
return user.getId();
}
public static void update(User user){
users.put(new Integer(user.getId()), user);
}

public static void delete(int id){
users.remove(new Integer(id));
}

public static User findById(int id){
return users.get(new Integer(id));
}
}