IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

plus_grand_bord d'une chaine de caractère


Sujet :

Python

  1. #1
    Membre régulier
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Points : 101
    Points
    101
    Par défaut plus_grand_bord d'une chaine de caractère
    bonjour,

    là je commence à
    "je suis novice dans la programmation python surtout en ce qui concerne les séquence"

    j'ai l'énoncé suivant:

    On vous demande d’écrire une fonction plus_grand_bord(w) qui, étant donné un mot w, retourne le plus grand bord de ce mot. On dit qu’un mot u est un bord de w, si u est à la fois un préfixe strict (c’est-à-dire un texte avec la première partie du texte w non vide et non égal à w lui-même) de w et un suffixe strict (c’est-à-dire un texte avec la dernière partie du texte w non vide et non égal à w lui-même) de w. Si w n’a pas de bord, la fonction retourne une chaîne de caractères vide.
    Exemple : 'a' et 'abda' sont des bords de 'abdabda'
    En effet:

    'abdabda' à la fois commence et se termine par 'a'

    De même 'abdabda' à la fois commence et se termine par 'abda'('abdabda' et 'abdabda')

    Le plus grand bord est 'abda'.


    comme proposition j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def plus_grand_bord(w):
        u=input()
        if (u[0:]!="" and u[0:]!=w)  and (u[::]!="" and u[::]!=w):
           print(u)
        else:
           print("")
     
     
    w= input()
    plus_grand_bord(w)
    l'exception "EOFError: EOF when reading a line" se déclenche

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Le plus grand bord possible, c'est quand la chaîne de caractères se répète (abda + abda).
    Maintenant, si j'ai "abdaXYabda"...
    • je coupe la chaîne en deux et "abdaX" n'est pas Yabda",
    • j'enlève le dernier caractère de la premier chaine et le premier de la 2nd

    "abda" == "abda" et j'ai fini.
    Donc au début on prend les 2 moitiés, on compare et on supprime un caractère à droite ou à gauche et on recommence tant qu'on n'a pas rencontré une égalité ou la chaine vide...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    "{première,dernière} partie du texte w non vide et non égale à w lui-même", je pense qu'on peut même faire une boucle sur la totalité du mot moins un caractère en réalité, c'est ce que semble confirmer le recouvrement avec ("abdabda", "abda")

    je verrais un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def plus_grand_bord(w):
       for i in range(len(w)-1, -1, -1):
          if w[:i] == w[-i:]:
             break
       return w[:i]

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 281
    Points : 36 768
    Points
    36 768
    Par défaut
    La moitié des itérations ne servent à rien (parce qu'on parle de prefixe/suffixe "stricts"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def plus_grand_bord(w):
       for i in range(len(w)//2, -1, -1):
          if w[:i] == w[-i:]:
             break
       return w[:i]
    mais si je comprends bien qu'on peut prendre un certain plaisir à faire ce genre d'exo. c'est pas en repartant avec une solution que le P.O apprendra à programmer (donc çà ne l'aide pas vraiment).

    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    pour le mot 'abdabda' ta fonction ne retourne que le premier 'a', perso j'ai compris ça comme le fait qu'elle devrait retourner 'abda' :

    Citation Envoyé par FATENMRABET Voir le message
    (...) 'abdabda' à la fois commence et se termine par 'abda'('abdabda' et 'abdabda')

    Le plus grand bord est 'abda'.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    pour le mot 'abdabda' ta fonction ne retourne que le premier 'a', perso j'ai compris ça comme le fait qu'elle devrait retourner 'abda' :
    La question est de savoir si les bords se recouvrent ou pas... Et tel que c'est défini (çà date de Knuth), ils le peuvent (donc j'ai tord) et ton code est juste car si on lui soumet 'aaaa', il sort bien 'aaa'. (c'est strict)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre régulier
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    "{première,dernière} partie du texte w non vide et non égale à w lui-même", je pense qu'on peut même faire une boucle sur la totalité du mot moins un caractère en réalité, c'est ce que semble confirmer le recouvrement avec ("abdabda", "abda")

    je verrais un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def plus_grand_bord(w):
       for i in range(len(w)-1, -1, -1):
          if w[:i] == w[-i:]:
             break
       return w[:i]
    salut,
    merci pour votre aide mais est ce que vous pouvez m'expliquer cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in range(len(w)-1, -1, -1):

  8. #8
    Membre régulier
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Le plus grand bord possible, c'est quand la chaîne de caractères se répète (abda + abda).
    Maintenant, si j'ai "abdaXYabda"...
    • je coupe la chaîne en deux et "abdaX" n'est pas Yabda",
    • j'enlève le dernier caractère de la premier chaine et le premier de la 2nd

    "abda" == "abda" et j'ai fini.
    Donc au début on prend les 2 moitiés, on compare et on supprime un caractère à droite ou à gauche et on recommence tant qu'on n'a pas rencontré une égalité ou la chaine vide...

    - W
    salut,
    oui je comprend, c'est le principe de recherche dichotomique en algorithmique merci

  9. #9
    Membre régulier
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    La moitié des itérations ne servent à rien (parce qu'on parle de prefixe/suffixe "stricts"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def plus_grand_bord(w):
       for i in range(len(w)//2, -1, -1):
          if w[:i] == w[-i:]:
             break
       return w[:i]
    mais si je comprends bien qu'on peut prendre un certain plaisir à faire ce genre d'exo. c'est pas en repartant avec une solution que le P.O apprendra à programmer (donc çà ne l'aide pas vraiment).

    -W
    salut,
    oui je comprend bien c'est clair maintenant merci

  10. #10
    Membre régulier
    Femme Profil pro
    étudiante chercheuse
    Inscrit en
    Septembre 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante chercheuse
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 274
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    pour le mot 'abdabda' ta fonction ne retourne que le premier 'a', perso j'ai compris ça comme le fait qu'elle devrait retourner 'abda' :
    salut,
    merci pour votre temps, oui c'est ça

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Crypter une chaine de caractères
    Par Yabo dans le forum Réseau
    Réponses: 18
    Dernier message: 19/11/2004, 23h04
  3. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo