Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Coding challenge : maman les petits avions

Aujourd'hui, je vous propose de jouer aux petits avions, et de vérifier quel prototype vole le mieux.

Pour les départager, nous allons nous appuyer sur la Suite de Syracuse :
En partant d'un nombre initial (entier positif), pour obtenir le suivant :

  • s’il est pair, on le divise par 2 ;
  • s’il est impair, on le multiplie par 3 et on ajoute 1.

On répète l'opération jusqu'à obtenir le nombre 1 (la suite est convergente).

On définit ensuite les termes suivants :

  • le temps de vol total : c'est la longueur de la séquence obtenue.
  • le temps de vol en altitude : c'est la période continue, à partir du décollage, pendant laquelle l'avion reste à une altitude supérieure ou égale à l'altitude initiale (voir exemple ci-dessous).
  • l'altitude maximale : c'est la valeur maximale de la séquence.

Prenons l'exemple du nombre initial 15.

  • Sa séquence est [15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
  • Son temps de vol total est de 18
  • Son temps de vol en altitude est de 11 ([15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20] = 11 éléments)
  • Son altitude maximale est de 160

Voyons maintenant comment tester nos différents prototypes d'avions.
Chaque prototype a évidemment un nom de code top secret, comme "Enterprise" ou "FauconMillenium". En additionnant les valeurs des lettres qui composent leurs noms, nous sommes capables de déterminer leur nombre initial.
Ainsi : "Enterprise" vaut 1057, et "FauconMillenium" vaut 1544.

Je vous laisse calculer quel modèle vole le mieux, et inventer vos propres prototypes !

Idéalement, il suffirait d'appeler une méthode en lui passant le nom du prototype, pour calculer (et éventuellement afficher) les trois indicateurs.
(Tous les langages bienvenus, utilisez Gist, Pastebin ou autre si votre code est volumineux)

-


Commentaires

1. Le lundi 18 février 2013, 14:15 par Clément

Un petit essai quick&dirty en haskell.

https://raw.github.com/gist/4977250...

Pour tester :
ghc --make avions.hs

Ensuite ./avions en on tape un nom par ligne.

2. Le lundi 18 février 2013, 14:42 par Clément

Le lien est mal passé: http://paste.pound-python.org/raw/3...

3. Le lundi 18 février 2013, 14:45 par yohan

Une version en Scala: http://pastebin.com/bmZtBpcF

4. Le lundi 18 février 2013, 14:59 par Airmanbzh

Une version en PHP : http://pastebin.com/Sjm1FCtF

5. Le lundi 18 février 2013, 15:00 par Florian

Version en C# (non, ne me tappez pas !) : https://gist.github.com/anonymous/8...

R2D2 est plutôt performant en vol pour un Droïde :
Avion R2D2
Séquence : [250,125,376,188,94,47,142,71,214,107,322,161,484,242,121,364,182,91,
274,137,412,206,103,310,155,466,233,700,350,175,526,263,790,395,1186,593,1780,89
0,445,1336,668,334,167,502,251,754,377,1132,566,283,850,425,1276,638,319,958,479
,1438,719,2158,1079,3238,1619,4858,2429,7288,3644,1822,911,2734,1367,4102,2051,6
154,3077,9232,4616,2308,1154,577,1732,866,433,1300,650,325,976,488,244,122,61,18
4,92,46,23,70,35,106,53,160,80,40,20,10,5,16,8,4,2,1]
Temps total de vol : 110
Temps total de vol en altitude : 68
Altitude maximale : 9232

6. Le lundi 18 février 2013, 17:32 par Antoine Rouaze

Version en PL/SQL ;) : https://gist.github.com/Erouan50/49...

7. Le lundi 18 février 2013, 18:08 par Frank Pavageau

Voilà une closure Groovy (avec un bug de coloration syntaxique de gist en prime), utilisable dans la console : https://gist.github.com/fpavageau/4...

8. Le lundi 18 février 2013, 18:28 par XtlCnslt

Une version en perl https://gist.github.com/ggtools/497...

9. Le mardi 19 février 2013, 15:24 par Pierre Chapuis

Quick&Dirty en Lua : https://gist.github.com/catwell/498...

Évidemment aucun soin apporté à la lisibilité hein :)

10. Le mardi 19 février 2013, 15:55 par Pierre Chapuis

@Florian Tu as mal compris la notion de vol en altitude, relis l'énoncé. Le temps de vol en altitude de R2D2 est 1. J'ai fait la même erreur initialement, corrigée maintenant :)

11. Le mardi 19 février 2013, 17:05 par Pierre Chapuis

Pas grand monde aime l'altitude, en fait...

Airmanbzh -> même problème que Florian, on cherche la longueur d'une séquence continue

Antoine Rouaze -> tu comptes à partir de l'altitude max, WTF ? (mais à part ça j'adore l'implémentation PL/SQL :p)

Frank Pavageau -> bon toi tu le calcules pas, c'est plus simple :)

12. Le mardi 19 février 2013, 17:09 par Olivier Croisier

Oui, beaucoup ont fait un simple "filter" sur les valeurs, sans avoir respecté la définition.

13. Le mardi 19 février 2013, 18:44 par Frank Pavageau

J'ai mis mon gist Groovy à jour pour le calcul du vol en altitude, avec une petite astuce de closure capturant le contexte. C'est toujours à https://gist.github.com/fpavageau/4... .

@Pierre : c'était bien calculé, mais de la même manière fausse que les autres. J'ai changé le retour pour renvoyer une Map au lieu d'une List, comme ça les valeurs sont nommées et c'est plus explicite.

14. Le mardi 19 février 2013, 18:57 par error3

Clojure version

(defn syracuse n

 (loop [n n res '()] 
   (cond
     (= n 1) (cons 1 res)
     (even? n) (recur (quot n 2) (cons n res))
     :else (recur (+ (* 3 n) 1) (cons n res)))))

(defn temps-vol n (count (syracuse n)))
(defn temps-vol-en-alt n

 (loop [syr_list (syracuse n), 
        res 0 ,
        max_res 0]
   (if (empty? syr_list) max_res
   (if (>= (first syr_list) n) 
     (recur (rest syr_list) (inc res) (max max_res (inc res)))
     (recur (rest syr_list) 0 (max max_res 0))))))

(defn alt-max n (reduce max (syracuse n)))



(defn str-to-ints s

 (loop [c s res '()]
   (if (empty? c) 
     res
     (recur (rest c) (cons (int (first c)) res)))))

(defn info avion

 (let [avion (reduce + (str-to-ints avion))]
   (println (temps-vol avion))
   (println (temps-vol-en-alt avion))
   (println (alt-max avion))))
15. Le mercredi 20 février 2013, 10:22 par error3

<quote>

 On répète l'opération jusqu'à obtenir le nombre 1 (la suite est convergente).

</quote>

=> c'est pas une conjecture ?

ça fait très Fermat indiqué comme ça entre parenthèse :-)

16. Le mercredi 20 février 2013, 11:19 par Alexandre

La voici avec OCaml encore une fois:

https://gist.github.com/agrison/499...

17. Le mercredi 20 février 2013, 11:28 par Olivier Croisier

@Alexandre Je ne connais pas OCaml, mais ça a l'air vraiment proche de Haskell. En tout cas c'est lisible.

18. Le mercredi 20 février 2013, 12:49 par Alexandre

@Olivier

C'est un langage que j'ai appris à l'université et que j'aime beaucoup utiliser (malheureusement pas assez, et non plus professionnellement). Il a quelques points faible et la librairie standard manque de fonctions, c'est pourquoi l'utilisations de Batteries1 (on peut voir ça comme une grosse surcouche à la librairie standard) par exemple est assez importante.

D'ailleurs j'ai updaté le Gist car j'avais oublié que take_while (Haskell takeWhile) est implémenté dans Batteries, ce qui fait économiser encore 5 lignes.

C'est aussi un langage que je qualifierai de Cocorico (développé à l'INRIA) :-)

1: http://batteries.forge.ocamlcore.or...

19. Le mercredi 20 février 2013, 14:01 par yohan

Nouvelle version Scala améliorée en utilisant une lazy list: http://pastebin.com/EK7CtLj8
Une petit bémol: Scala propose une méthode takeWhile mais pas de takeUntil sur les collections, du coup la suite générée ne contient pas la valeur 1...
Il y aurait bien un moyen d'ajouter cette valeur manuellement mais l'idée me révulse tellement que je ne l'ai pas implémenté!

20. Le mercredi 20 février 2013, 15:53 par David

En ruby : https://gist.github.com/dgageot/499...
Je croyais l'avoir posté la semaine derniere, mais non...

21. Le mercredi 20 février 2013, 17:54 par error3

https://gist.github.com/error3/4990... cette version est un peu plus courte que celle du commentaire.

22. Le vendredi 22 février 2013, 15:27 par LDI

Ma version en Haskell (sûrement moyen d'améliorer, je suis nouveau dans ce langage, y'a quelques odeurs de Scala dans mon code ^^).

http://pastebin.com/pEU0sj44

23. Le dimanche 10 mars 2013, 23:07 par Deluxe

Je commence le Clojure, soyez indulgents... =) : https://gist.github.com/deluxe/5130...

24. Le samedi 23 mars 2013, 15:45 par deltheil

En C : https://gist.github.com/deltheil/52...

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.