J'étudie depuis quelques temps sur le site France IOI, que je vous recommande fortement si vous commencez à coder, et malheuresement je bloque sur un probleme mettant en jeu les connaissances sur les conditions boléenes et l'analyse graphique de rectangles.
J'ai reussi a créer un programmes répondant à 2 tests sur 8 mais je pense fortement que j'ai oublie une conditions ce qui bloque totelemnt la suite des tests.
Aussi, voila les resultats donnés par l'algorithme de france IOI
Alors pour la théorie, voici comment on procède. Soit 2 rectangles R1 et R2. On accède à l'abscisse minimum avec la notation T1.left et la maximum avec R1.right. Pour l'ordonnée minimum on aura R1.bottom et pour l'ordonnée max on aura R1.top.
Voici la clé du succès. Il suffit de se rendre compte que si R1.left > R2.right, alors peu import l'ordonnée de l'un ou de l'autre, il ne pourront jamais avoir d'intersection. Je peux recommencer le raisonnement pour R1.right < R2.left et à nouveau, il n'y aura jamais d'intersection. Tu auras compris que ça s'applique aussi à R1.top < R2.bottom et R1.bottom > R2.top.
Si n'importe laquelle de ces 4 précédente condition n'est pas satisfaite, alors il y a forcément collision.
EDIT: désolé mais mes signes plus petits et plus grands sont une fois de plus horriblement mutilés par le forum. Tu auras compris que < c'est plus petit que et > c'est plus grand que.
Si quelqu'un a un petit conseil, je crois que je me complique la vie avec ma façon de faire. Ce ne serait pas moins compliqué si je faisais l'inverse ? C'est à dire définir les moments ou ça ne se croise pas plutôt que ce ou ça se croise ? Le code n'est pas fini, je pense qu'il peut fonctionner en continuant sur cette voie si je continue de réfléchir, mais je ne suis pas contre exemple plus simple.
Merci !
nbPaires = int(input())
for loop in range(nbPaires):
xMin1 = int(input())
xMax1 = int(input())
yMin1 = int(input())
yMax1 = int(input())
xMin2 = int(input())
xMax2 = int(input())
yMin2 = int(input())
yMax2 = int(input())
if ((xMax1 > xMin2) and (yMax1 > yMin2)):
if ((xMin1 < xMin2) and (yMin1 < yMin2)):
print("OUI")
if ((xMax2 > xMin1) and (yMax2 > yMin1)):
if ((xMin2 < xMin1) and (yMin2 < yMin1)):
print("OUI")
if ((xMax1 > xMin2) and (yMin1 < yMax2)):
if ((xMin1 < xMin2) and (yMax1 > yMax2)):
print("OUI")
if ((xMax2 > xMin1) and (yMin2 < yMax1)):
if ((xMin2 < xMin1) and (yMax2 > yMax1)):
print("OUI")
else:
print("NON")
Tu rencontreras en effet des soucis avec ton code actuel puisque le else n'est valable que pour la condition ligne 20, et s'affichera dans tous les cas si cette condition est fausse (même si la condition ligne 17 ou celle ligne 21 sont vraies par exemple).
Et sinon, pour limiter les conditions, dans un premier temps je te propose de classer tes rectangles de façon à ce que les coordonnées 1 correspondent toujours à celui le plus à gauche par exemple.
Et sinon, pour limiter les conditions, dans un premier temps je te propose de classer tes rectangles de façon à ce que les coordonnées 1 correspondent toujours à celui le plus à gauche par exemple.
Mais si pendant la saisie je décide que mon 1 est a droite et que mon 2 est a gauche (ce qui pourrait arriver) Je ne peux pas utiliser cette méthode, si ?
Merci pour le retour rapide !
edit: Tu me conseils de rajouter une condition au debut qui permet de trier ca automatiquement si je comprend bien ?
- Edité par Heisenberg-2.0 11 août 2019 à 19:05:18
Tu n'as pas besoin, d'ailleurs, il serait plus approprié d'utiliser les fonctions min ou max de Python (comme on te l'a suggéré).
Si on prend mal l'exo, on peut se noyer dans de multiples cas. En particulier raisonner sur des maximums ou minimums n'est pas forcément utile.
Tout revient à traduire la chose suivante : on dispose de 4 entiers a, b, c, et d tels que
a<=b et c<=d (c'est l'énoncé qui le suppose)
et on doit trouver une condition pour que les segments [a, b) et [c,d) aient au moins un point commun (faire un dessin peut aider ). En réalité, il est beaucoup plus simple (me semble-t-il) de répondre à la question de quand les deux segments n'ont pas d'intersection (*). Et de même pour l'exercice, il est plus simple de répondre quand les deux rectangles NE s'intersectent PAS.
(*) quand l'un est complètement à gauche de l'autre.
C'est un très bon exercice.
Par ailleurs, une solution à base d'intersection de set ne marchera pas (dépassement du temps limite).
Voici la clé du succès. Il suffit de se rendre compte que si R1.left > R2.right, alors peu importe l'ordonnée de l'un ou de l'autre, il ne pourront jamais avoir d'intersection. Je peux recommencer le raisonnement pour R1.right < R2.left et à nouveau, il n'y aura jamais d'intersection. Tu auras compris que ça s'applique aussi à R1.top < R2.bottom et R1.bottom > R2.top.
Si n'importe laquelle de ces 4 précédentes conditions n'est pas satisfaite, alors il y a forcément collision.
Donc tu devrais avoir 4 if avec un print("NON") et à la fin un else avec un print("OUI").
J'ai du mal à visualiser, en fait top et bottom sont les lignes du haut et du bas d'un rectangle et left et right sont les ligne gauche et droite de celui ci ?
Dan737 a écrit:
Mon conseil reste le même qu'il y a deux ans :
Dan737 a écrit:
Voici la clé du succès. Il suffit de se rendre compte que si R1.left > R2.right, alors peu importe l'ordonnée de l'un ou de l'autre, il ne pourront jamais avoir d'intersection. Je peux recommencer le raisonnement pour R1.right < R2.left et à nouveau, il n'y aura jamais d'intersection. Tu auras compris que ça s'applique aussi à R1.top < R2.bottom et R1.bottom > R2.top.
Si n'importe laquelle de ces 4 précédentes conditions n'est pas satisfaite, alors il y a forcément collision.
Donc tu devrais avoir 4 if avec un print("NON") et à la fin un else avec un print("OUI").
Oui c'est ça. Ce ne sont que des noms dans mon exemple. Toi tu les as appelés xMax, yMax et xMin, yMin.
Pour prendre la première condition R1.left > R2.right ça se lit : si le bord gauche du premier rectangle est plus grand (à droite) du bord droit du deuxième rectangle, alors il est impossible qu'il y ait une collision. Tu peux te prendre deux objets rectangulaire. Tu appelles l'un R1 et l'autre R2. Tu places le bord gauche de R1 à droite du bord droit de R2 et tu bouges le rectangle comme bon te semble, ils ne se toucheront jamais.
Tu m'es définitivement d'une aide précieuse j'ai appliqué ce que tu écrivais dans ton message du 18/11/2017 à 14h56 (et ai même réalisé un dessin afin d'illustrer et de mieux comprendre tes propos) ainsi que celui du 03/09/2019 en réponse à JulienFrancois1 toutefois le programme n'aboutit pas comme je le souhaiterais, saurais tu m'expliquer ce qui cloche dans mon code 1 ainsi que dans mon code 2 ?
Code 1 :
nbPaires = int(input())
for loop in range(nbPaires):
xMin1 = int(input())
xMax1 = int(input())
yMin1 = int(input())
yMax1 = int(input())
xMin2 = int(input())
xMax2 = int(input())
yMin2 = int(input())
yMax2 = int(input())
if xMin1 > xMax2:
print("NON")
if xMax1 < xMin2:
print("NON")
if yMax1 < yMin2:
print("NON")
if yMin1 > yMax2:
print("NON")
else:
print("OUI")
Code 2 :
nbPaires = int(input())
for loop in range(nbPaires):
xMin1 = int(input())
xMax1 = int(input())
yMin1 = int(input())
yMax1 = int(input())
xMin2 = int(input())
xMax2 = int(input())
yMin2 = int(input())
yMax2 = int(input())
if xMin1 > xMax2:
print("NON")
if xMax1 < xMin2:
print("NON")
if yMax1 < yMin2:
print("NON")
if yMin1 > yMax2:
print("NON")
else:
print("OUI")
Après avoir vu tes explications Dan, j'ai essayer de me pencher sur un code qui correspondait à tes explications. Il me semble Clara qu'il ressemble au tient. Quelque chose ne fonctionne pas dedans non plus, et je ne sais pas où :/
Pour pouvoir vous aider, il faut nous fournir les données entrées, le résultat attendu et le résultat du programme. Sans ça, à moins d'avoir recours une fois de plus à la boule de cristal, ça va être difficile d'avancer. Aussi tu dis avoir utiliser le code 2 de Clara avec les conseils d'Entwanne. Mais pourrais-tu poster ton nouveau code car on ne sait pas ce que tu as écrit.
Pour pouvoir vous aider, il faut nous fournir les données entrées, le résultat attendu et le résultat du programme. Sans ça, à moins d'avoir recours une fois de plus à la boule de cristal, ça va être difficile d'avancer. Aussi tu dis avoir utiliser le code 2 de Clara avec les conseils d'Entwanne. Mais pourrais-tu poster ton nouveau code car on ne sait pas ce que tu as écrit.
Dan,
J'ai tout regroupé, j'espère que ça pourra aider.
Voici le résultat attendu dans la consigne avec un exemple d'entrée et de sortie réalisé par le site :
Puis le code repris de Clara avec le conseil d'Entwanne de mettre des Elif :
entwanne — @entwanne.bsky.social — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne.bsky.social — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne.bsky.social — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
Pas d'aide concernant le code par MP, le forum est là pour ça :)
entwanne — @entwanne.bsky.social — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne.bsky.social — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne.bsky.social — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
Découverte Python Doc Tkinter Les chaînes de caractères
entwanne — @entwanne.bsky.social — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne.bsky.social — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique