fév.
2013
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
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.
Le lien est mal passé: http://paste.pound-python.org/raw/3...
Une version en Scala: http://pastebin.com/bmZtBpcF
Une version en PHP : http://pastebin.com/Sjm1FCtF
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
Version en PL/SQL ;) : https://gist.github.com/Erouan50/49...
Voilà une closure Groovy (avec un bug de coloration syntaxique de gist en prime), utilisable dans la console : https://gist.github.com/fpavageau/4...
Une version en perl https://gist.github.com/ggtools/497...
Quick&Dirty en Lua : https://gist.github.com/catwell/498...
Évidemment aucun soin apporté à la lisibilité hein :)
@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 :)
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 :)
Oui, beaucoup ont fait un simple "filter" sur les valeurs, sans avoir respecté la définition.
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.
Clojure version
(defn syracuse n
(defn temps-vol n (count (syracuse n)))
(defn temps-vol-en-alt n
(defn alt-max n (reduce max (syracuse n)))
(defn str-to-ints s
(defn info avion
<quote>
</quote>
ça fait très Fermat indiqué comme ça entre parenthèse :-)
La voici avec OCaml encore une fois:
https://gist.github.com/agrison/499...
@Alexandre Je ne connais pas OCaml, mais ça a l'air vraiment proche de Haskell. En tout cas c'est lisible.
@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...
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é!
En ruby : https://gist.github.com/dgageot/499...
Je croyais l'avoir posté la semaine derniere, mais non...
https://gist.github.com/error3/4990... cette version est un peu plus courte que celle du commentaire.
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
Je commence le Clojure, soyez indulgents... =) : https://gist.github.com/deluxe/5130...
En C : https://gist.github.com/deltheil/52...