Partage
  • Partager sur Facebook
  • Partager sur Twitter

Planning de la journée france ioi validation

14 juin 2019 à 18:15:09

Bonjour je suis bloqué dans un exercice je vous donne l’énoncer :

Vous venez d'arriver au bord d'un grand lac que vous devez contourner, par un côté ou l'autre, peu importe. Vous avez réussi à trouver une carte décrivant la position exacte de tous les villages le long de la route qui longe la rive du lac. Sachant que vous pouvez marcher 50 km dans la journée, vous aimeriez savoir dans combien de villages différents vous pourriez dormir la nuit prochaine.

Ce que doit faire votre programme :

Votre programme doit d'abord lire un entier décrivant votre position actuelle sur la route, sous la forme d'un nombre de kilomètres par rapport au début de la route. Ensuite, il doit lire un entier donnant le nombre de villages. Pour chaque village, il doit lire un entier décrivant la position de ce village le long de cette même route. Votre programme doit alors afficher le nombre de villages qui se trouvent à une distance inférieure ou égale à 50 km de votre position actuelle.

Exemple

entrée :

120
5
30
113
187
145
129

sortie :

3

Commentaires

Vous êtes à la position 120 et il y a donc trois villages à moins de 50 km : ceux aux positions 113, 145 et 129. Les deux autres villages sont trop lointains.
pos_actuelle = int(input())
nbVillage = int(input()) 

resultat = 0
for i in range(nbVillage):
   pos_village = int(input()) 
   if 0 <= pos_actuelle - pos_village <= 50:
      resultat += 1
print(resultat)

voici mon code j'ai essayé déjà plusieurs chose je pense que c'est un problème de nombre négatif mais je suis vraiment bloqué, 
c'est pour cela je demande de l'aide merci !!
  • Partager sur Facebook
  • Partager sur Twitter
14 juin 2019 à 18:30:51

AlexandreIffli a écrit:

voici mon code j'ai essayé déjà plusieurs chose je pense que c'est un problème de nombre négatif 

En effet : valeur absolue.
  • Partager sur Facebook
  • Partager sur Twitter
14 juin 2019 à 18:34:00

je suis censé le mettre ou ? désolé je suis débutant j'ai oublié de le préciser
  • Partager sur Facebook
  • Partager sur Twitter
14 juin 2019 à 19:15:48

As-tu compris pourquoi je te parle de valeur absolue ?
  • Partager sur Facebook
  • Partager sur Twitter
15 juin 2019 à 1:36:32

non du tout enfaite :/ peux-tu me donner un example
  • Partager sur Facebook
  • Partager sur Twitter
15 juin 2019 à 11:04:01

La valeur absolue permet de mesurer l'écart (non signé autrement dit la distance) entre deux nombres. Par exemple si a=25, b=42 la distance entre a et b est |a-b|=|25-42|=|-17|=17. L'intérêt est que ça ne dépend pas de l'ordre car la distance entre b et a c'est |b-a|=|17|=17. En Python, la valeur absolue c'est abs et je te laisse réfléchir où tu dois la placer dans ton code.

  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2019 à 21:23:37

Du coup j ai pas très bien pigé 😣
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2019 à 23:34:40

La valeur absolue d'un nombre est le nb sans le signe (donc positif). Par exemple, |-6| = 6 et |3| = 3.
  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2019 à 9:08:40 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


11 octobre 2019 à 11:09:12

Quitte à donner la soluce toute faite, autant faire exotique :

print(*(sum(abs(n-int(input()))<51 for _ in range(int(input())))for n in[int(input())]))
  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2019 à 12:15:40

Oui, bonne idée d'avoir placé n dans une liste avec un seul élément.
  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2019 à 12:49:46

J'ai hâte de voir les horreurs maléfique que va bientôt permettre la PEP 572. xD

  • Partager sur Facebook
  • Partager sur Twitter
12 octobre 2019 à 13:23:33

HaSh4 a écrit:

print(*(sum(abs(n-int(input()))<51 for _ in range(int(input())))for n in[int(input())]))
C'est fou comment le Python peut-être illisible...
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2019 à 16:53:31

bonjour, je n'ai pas trouvé de réponse à ce problème, et ne comprends pas vos réponses. Pouvez vous réexpliquer ?
  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2019 à 18:06:53

LenaHaouas a écrit:

bonjour, je n'ai pas trouvé de réponse à ce problème, et ne comprends pas vos réponses. Pouvez vous

Voilà une solution possible de France IOI j espère que ça va t aider 🤞

Pour chaque village, on va calculer la distance entre la position actuelle et ce village. Pour cela, on calcule la différence entre leurs positions respectives. Si cette différence est positive, la distance est égale à cette différence, autrement la distance est égale à l'opposé de cette différence.

On utilise une variable nommée nbAccessibles pour calculer le résultat. Au début cette variable vaut zéro. Pour chaque distance que l'on calcule, on teste si cette distance est inférieure à 50 km. Si c'est le cas, on incrémente (c'est-à-dire on augmente d'une unité) le contenu de la variable nbAccessibles.



  • Partager sur Facebook
  • Partager sur Twitter
6 février 2020 à 11:54:13

vv

-
Edité par Mao Hervé 10 février 2020 à 14:31:45

  • Partager sur Facebook
  • Partager sur Twitter
6 février 2020 à 13:30:00

LenaHaouas a écrit:

bonjour, je n'ai pas trouvé de réponse à ce problème, et ne comprends pas vos réponses. Pouvez vous réexpliquer ?

Si après ces explications tu n'as toujours pas percuté, je veux pas être méchant, mais il va falloir songer à arrêter le développement.

Une distance est toujours positive, si tu es à 10m devant moi, on a 10m d'écart, et inversement, si tu es à 10m derrière moi, on est aussi à 10m d'écart.

Pourtant, sur le chemin, si on fait ta position moins la mienne, on aura soit un résultat de 10, soit de -10. 

Imagine tu es au point A qui est à 50m du départ, et moi au point B à 60m du départ.

A - B = -10, alors que B - A = 10

C'est pour ca qu'on parle de valeur absolue, parce que nous on cherche juste l'écart entre nous 2, c'est à dire 10m, on veut pas de -10.

Et donc pour avoir un résultat positif, on doit appliquer une valeur absolue. |A - B| = 10 = |B - A|

Dans le cas de ton exo, tu as une pos_actuelle à 120, et dans la liste, une pos_village à 129.

Toi tu as juste appliqué pos_actuelle - pos_village = 120 -129 = -9

Et tu vérifies que le résultat est entre 0 et 50. Vu que ça fait -9, ça colle pas. Alors qu'en fait, la distance entre les 2 points est de 9.

C'est donc pour ca qu'on parle de valeur absolue depuis le début.

PAR CONTRE,

La où je trouve que l'exo donné c'est de la merde, c'est qu'on marche 50km par jour, certes. Qu'on peut aller dans les 2 sens, certes. Et on veut savoir dans combien de villages différents vous pourriez dormir la nuit prochaine, certes.

SAUF QUE, c'est pas parce qu'il y a 3 villages à moins de 50km de la ou on est qu'on va forcément passer les 3 villages. S'il y en a 1 d'un côté, et 2 de l'autres, alors au mieux, un fois qu'on a choisi une direction, on ira dormir après avoir passer 2 villages.

C'est donc complètement débile. Le "Ce que le programme doit faire" ne colle pas du tout avec le contexte donné dans l'exercice. Et quand on se prend la peine de donner un contexte à un exo, autant faire ça bien, sinon ça nous embrouille + qu'autre chose.

-
Edité par Tiffado 6 février 2020 à 13:30:22

  • Partager sur Facebook
  • Partager sur Twitter
20 février 2020 à 17:14:44

Bonjour, 

Etant débutant, je reste moi aussi bloqué sur cet exercice. 

Voila ou j'en suis arrivé : 

position = int(input())
nbVillage = int(input())
resultat = 0
for loop in range (nbVillage):
   posVillage = int(input())
   if (posVillage - position) < 50:
      resultat += 1
print(resultat)


Je comprends le principe de valeur absolue mais je ne penses pas l'utiliser correctement. 

Un petit coup de pouce possible ?

  • Partager sur Facebook
  • Partager sur Twitter
20 février 2020 à 17:58:16

A la limite, si tu ne connais pas la valeur absolue, c'est pas grave, du moment que tu sais quand et comment écrire une instruction if. 

Regarde ton code si posVillage=200 et position=300. Tu vas avoir posVillage - position = -100 qui est donc < à 50 puisque négatif et donc ton résultat va augmenter de 1. Pourtant, crois-tu que la distance entre le village et la position est inférieure à 50 ?

  • Partager sur Facebook
  • Partager sur Twitter
20 février 2020 à 18:32:50

PascalOrtiz a écrit:

A la limite, si tu ne connais pas la valeur absolue, c'est pas grave, du moment que tu sais quand et comment écrire une instruction if. 

Regarde ton code si posVillage=200 et position=300. Tu vas avoir posVillage - position = -100 qui est donc < à 50 puisque négatif et donc ton résultat va augmenter de 1. Pourtant, crois-tu que la distance entre le village et la position est inférieure à 50 ?

Oui effectivement il manque quelque chose.

Si je reprends : 

Mon programme doit lire un entier décrivant la position actuelle (ok)

Puis il doit lire un entier donnant le nbvillage (ok)

Puis il doit lire un autre entier décrivant la position de ce village le long de la route posVillage (ok)

Enfin le programme doit afficher le nombre de villages qui se trouvent à une distance inférieur ou égale à 50km et ma position actuelle 

du coup je devrais avoir quelque chose comme ca ?

if (posVillage - position) < 51:
      resultat += 1
if (position - posVillage) < 51:
      resultat -= 1



  • Partager sur Facebook
  • Partager sur Twitter
20 février 2020 à 18:47:48

maximekaiser a écrit:

Mon programme doit lire un entier décrivant la position actuelle (ok)

Puis il doit lire un entier donnant le nbvillage (ok)

Puis il doit lire un autre entier décrivant la position de ce village le long de la route posVillage (ok)

Enfin le programme doit afficher le nombre de villages qui se trouvent à une distance inférieur ou égale à 50km et ma position actuelle 


Oui, c'est à peu près ça.

maximekaiser a écrit:

du coup je devrais avoir quelque chose comme ca ?

if (posVillage - position) < 51:
      resultat += 1
if (position - posVillage) < 51:
      resultat -= 1



Non. Sais-tu résoudre le problème hors Python ? sinon, ce n'est pas la peine d'essayer de le coder. Peux-tu reprendre les données fournies en exemple et voir pas à pas et sans Python comment tu calcules resultat. Je suis sûr que tu sais le faire. Et tu verras que ce n'est pas ce que tu proposes ci-dessus. Tu dois exactement coder l'"algo" que tu réalises à la main.

  • Partager sur Facebook
  • Partager sur Twitter
24 mai 2020 à 23:02:37

Ce que j'ai compris de la valeur absolue dans cet exercice, c'est simplement que tout nombres négatifs doivent être positif.
Lorsque l'on fait un écart de distance, la valeur peut être négative or dans l'exercice, nous ne pouvons pas dire qu'une distance est à - 10 mètre d'une autre. Par conséquent, il faut introduire une autre condition qui rend tous nombres négatifs positifs. Voici ce que j'ai trouvé.
car = int(input())
por = int(input())
par = 0
for loop in range(por):
   cor = int(input())
   pir = car - cor
   if pir < 0:
      pir = -pir
   if pir <= 50:
      par = par + 1
print(par)
  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2020 à 9:59:03

Bonjour,

Même si sur le papier le code est lisible, j'ai pas envie de le lire à cause des noms de variable.

car por par pir ? C'est quoi ces trucs ?

  • Partager sur Facebook
  • Partager sur Twitter
29 juin 2020 à 21:07:37

Tiffado a écrit:

Bonjour,

Même si sur le papier le code est lisible, j'ai pas envie de le lire à cause des noms de variable.

car por par pir ? C'est quoi ces trucs ?

C est juste les noms de variables tu peux même écrire pomme de terre carotte cerise 🤷🏻‍♀️ Ça change rien 



  • Partager sur Facebook
  • Partager sur Twitter
30 juin 2020 à 1:13:59

Voici du code pour débutants avec des noms de variables significatifs.
Désolé, je ne peux pas colorer mon code.
-
maPosition = int(input('Ma position: '))
nbVillages = int(input('Nombre de villages: '))
nbDormir=0
for n in range(nbVillages):
    #ceVillage = int(input(f'Position du village {n+1}: '))   # un peu plus sophistiqué
    ceVillage = int(input(f'Position du village suivant: '))
    distance = ceVillage - maPosition
    if distance < 0:   # pour éviter l'utilisation de la valeur absolue avec math.abs()
        distance = -distance
    if distance <= 50:
        nbDormir+=1
print(nbDormir)
-
@HaSh4: print(*(sum(abs(n-int(input()))<51 for _ in range(int(input())))for n in[int(input())]))
Ce n'est pas pour les débutants? :)

-
Edité par PierrotLeFou 30 juin 2020 à 1:24:54

  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

30 juin 2020 à 9:49:01

ClaireAmarine a écrit:

Tiffado a écrit:

Bonjour,

Même si sur le papier le code est lisible, j'ai pas envie de le lire à cause des noms de variable.

car por par pir ? C'est quoi ces trucs ?

C est juste les noms de variables tu peux même écrire pomme de terre carotte cerise 🤷🏻‍♀️ Ça change rien 

Sans vouloir te vexer, si le nom des variables c'est important.

Une variable sert à représenter quelque chose : une distance, une différence de distance, une somme de distance, etc.

Et quand tu commences à faire des opérations sur des variables pour en créer d'autres, c'est quand même cool de savoir ce qu'on manipule.

La je suis obligé de lire de code des autres pour comprendre que "car", c'est ma position sur le circuit, et que "por", c'est le nombre de village.

Si à la base je sais même pas à quoi ça correspond car et por (parce que soyons honnête, la c'est impossible de le comprendre sans lire le code des autres). Comment je peux savoir si les opérations ou les comparaisons qu'il fait dessus sont correctes ?

Alors si, le nom des variables dans un programme est super important. Sur le principe, ça ne change rien à l'algo et au résultat final comme tu dis, mais il faut penser aux gens qui font devoir le relire et le comprendre. Et ça bah tu le comprendras quand un jour tu devras te taper le code de quelqu'un et que tu comprendras rien car il aura donner des noms qui n'ont aucun sens à ses variables.

  • Partager sur Facebook
  • Partager sur Twitter
30 juin 2020 à 14:36:42

PierrotLeFou a écrit:

@HaSh4: print(*(sum(abs(n-int(input()))<51 for _ in range(int(input())))for n in[int(input())]))


un poil différent, mais avec beaucoup de parenthèses aussi ^^

print((lambda d=int(input()):sum(abs(d-int(input()))<51 for _ in range(int(input()))))())



  • Partager sur Facebook
  • Partager sur Twitter

Python c'est bon, mangez-en. 

30 juin 2020 à 16:38:20

on peut aussi remplacer
    if distance < 0:
        distance=-distance
    if distance <= 50:
        nbDormir+=1
par (si on ne veut toujours pas utiliser la fonction abs())
    if -50 <= distance <= 50:
        nbDormir+=1
  • Partager sur Facebook
  • Partager sur Twitter
30 juin 2020 à 16:51:44

umfred a écrit:

on peut aussi remplacer

    if distance < 0:
        distance=-distance
    if distance <= 50:
        nbDormir+=1

par (si on ne veut toujours pas utiliser la fonction abs())

    if -50 <= distance <= 50:
        nbDormir+=1

Pas d'objection. :)

Ça évite mon premier test et abs()

  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.