Nous voici arrivés à l'endroit où le sable est censé être livré. Censé. Parce qu'il n'y a pas de sable, évidemment.
Partie 1
Par un heureux hasard, aujourd'hui est organisée une régate, dont le gagnant aura la chance de bénéficier d'un voyage tous frais payés vers l'île du désert. C'est sûrement de là que devrait venir le sable ! Il faut absolument gagner cette course, Noël en dépend.
Les bateaux utilisés sont des jouets, qui ont un bouton sur le dessus. Au départ de la régate, il faut appuyer dessus un certain temps pour charger son bateau, puis le relâcher pour qu'il parte ; il ira d'autant plus vite qu'il aura été chargé longtemps. Seulement, la course est en temps limité et il s'agit de parcourir la plus grande distance, donc il ne faut pas non plus passer tout son temps à charger le bateau.
Pour être sûr de gagner, nous devons compter sur notre intelligence et sur les archives des courses précédentes, par exemple :
Time: 7 15 30
Distance: 9 40 200
Cela indique que la première régate a duré 7 millisecondes et que le gagnant avait réussi à parcourir 9 millimètres. La seconde course a dûré 15 millisecondes et le gagnant avait parcouru 40 millimètres. Etc.
Il s'agit pour nous de déterminer, pour chaque régate passée, combien de possibilités de temps de charge nous auraient permis de dépasser le gagnant.
Partie 2
En fait le document d'archive était très mal créné. Il ne donnait pas l'historique de plusieurs régates passées, mais simplement le record historique de la course, dont la durée ne change pas d'une année sur l'autre. Bref, il faut lire les nombres comme un seul nombre, en ignorant les espaces.
Évidemment, ça fait une course vachement plus longue, de plusieurs dizaines de milliers de millisecondes. Oui, je sais, ça fait juste quelques dizaines de secondes, seulement on est à la milliseconde près pour le temps de charge de notre bateau. Et ça va faire pas mal de possibilités, d'ailleurs.
# Maths
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 6. Dernière modification le 06 décembre 2023 à 11:06.
Pour moi, à la lecture de l'énoncé, je n'y ai pas vu un problème d'algorithmique, mais de mathématiques. Une régate avec un temps de charge qui donne la vitesse pour dépasser la distance record en un temps limité, c'est une inéquation polynomiale de second degré.
Un polynôme de second degré
Soit la durée de la course, la distance record et t le temps de charge (notre variable). La vitesse atteinte est d'après l'énoncé égale au temps de charge. Sur la durée de la course, il ne reste plus que pendant lequel le bateau parcourra .
On charge à battre le record, soit :
Cela se normalise en :
La partie gauche est un polynôme de second degré, en forme de cloche vers le haut. Ça tombe bien, si les données sont bien construites il devrait s'annuler en deux points, et être négatif entre les deux. Je sais très bien résoudre ça.
Résolution
Le discriminant de ce polynôme vaut :
Comme je disais, si les données sont bien construites, ça devrait être strictement positif et donner les racines suivantes :
En chargeant notre bateau pendant exactement ou , on égale le record. Entre et , on le dépasse.
Retour à la
réalitéfictionBon, c'est bien joli ça, on peut déterminer des temps minimum et maximum qui sont des réels, mais on nous demande un nombre de durées de charge possible, entières à la milliseconde près, pour dépasser strictement le record.
Si le temps minimum, par exemple, n'est pas entier, c'est facile, il faut charger pendant une durée supérieur ou égale à son arrondi à l'entier supérieur. Mais les cas limites sont importants, qu'en est-il si le temps minimum est entier ? Il faut charger pendant une durée supérieure ou égale à l'entier suivant.
En fait, la borne inférieure à considérer est l'entier inférieur au temps minimum, augmenté d'une unité. Mutatis mutandis pour le temps maximum.
Les bornes incluses de notre intervalle de durées possibles seront donc :
Quand au nombre d'options, c'est par conséquent la longueur de cet intervalle :
Partie 1, partie 2
Ce calcul s'applique aussi bien à la première qu'à la deuxième partie. Et c'est rapide, genre vraiment rapide puisque c'est simplement du calcul. Mieux encore, alors que pour la première partie il faut traiter trois ou quatre régates, pour la seconde il n'y en a plus qu'une seule, donc c'est trois ou quatre fois plus rapide. :-)
En pratique, en Python 3 ça prend dans les 50 millisecondes pour la première comme pour la seconde partie, mais je soupçonne que ce soit essentiellement la compilation et le temps de chargement de la machine virtuelle Python.
[^] # Re: Maths
Posté par barmic 🦦 . Évalué à 2. Dernière modification le 10 décembre 2023 à 16:35.
J'ai enfin le temps d'avancer. Comme toi j'ai même hésité à coder. Pour la diversité je poste ma réponse rust
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
# Un zest de math, pas de modélisation
Posté par Yth (Mastodon) . Évalué à 4. Dernière modification le 06 décembre 2023 à 11:10.
Ça fait en effet pas mal de possibilités, puisque ma réponse est de plus de 34 millions de façon de gagner.
En fait, la meilleure course c'est simplement d'appuyer sur le bouton la moitié du temps et de laisser filer l'autre moitié.
Mais c'est pas ça qu'on demande, on demande juste de calculer les racines d'un polynome du second degré, et de mesurer l'intervalle entre les deux.
Ok, pour l'exercice 1, on modélise quand même, parce que ça a l'air plus simple que de réfléchir :
Après, on prend peur, et on se dit que ça va être énorme, les chiffres sont gros, blabla, donc résolution de polynôme, cas limites, soustraction, résultat :
Bon, et puis au final on se dit que 35 millions c'est pas si lourd, alors on tente la force brute :
Et… des petites comparaisons :
PyPy3, polynôme : 0,171s
PyPy3, force brute : 0,268s
Python3, polynôme : 0,031s
Python3, force brute : 12,634s
D'accord, PyPy a un surcoût au démarrage, environ 0.15 secondes, donc la solution efficace en python3 est plus rapide.
Mais la force brute, bigre, quelle différence, dans les 50 fois plus rapide !
Et bref, dans tous les cas, on peut y aller comme un bourrin, ou intelligemment, ya rien de difficile dans ces exercices.
# Python et math
Posté par alberic89 🐧 . Évalué à 1.
Très clairement un exos de math qui pourrait être donné à des secondes, il fallait que ça tombe le jour où je n'avais pas le temps avant le soir.
Ma solution :
L'informatique n'est pas une science exacte, on n'est jamais à l'abri d'un succès
# en mode brute, et c'est passé
Posté par steph1978 . Évalué à 2. Dernière modification le 08 décembre 2023 à 16:02.
j'ai énuméré toutes les unités de temps.
je pensais que ça allait coincer pour la partie 2, car ça sentait le gros chiffre pour exploser le cpu ou la mémoire.
mais il n'est est rien.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.