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 :

Triangle de sierpinsky


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Par défaut Triangle de sierpinsky
    Bonjour,

    J'ai un exercice à faire qui consiste à écrire un triangle de sierpinsky avec des étoiles ou dièses en mode récursif comme ceci:
    Nom : Capture d’écran 2016-03-24 à 17.39.19.png
Affichages : 537
Taille : 10,4 Ko

    Je réfléchis à un moyen de le faire avec un tableau en deux dimensions ou une liste de liste, ce qui serait vraisemblablement le plus facile mais sans succès.

    Je vous demande votre aide pour m'aider à résoudre ce problème.

    Merci par avance.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    Je suppose que l'idée de l'exercice n'est pas de reproduire le triangle d'une longueur fixe tel que présenté sur l'image mais plutôt de permettre de recréer ce triangle selon la longueur désirée, ce qui est déjà plus compliqué.

    Dans le premier cas effectivement un simple print de 8 lignes et c'est fini, ou depuis une liste près-remplie, mais sans notion de calcul.

    Dans le second cas, il faut d'abord comprendre l'algorithme permettant de recréer ces combinaisons.

    Premier constat c'est un enchaînement binaire, de dièses et d'espaces.

    On peut donc commencer par écrire ces combinaisons en chiffre.

    La représentation étant binaire je vais l'écrire en binaire et ce sera plus simple d'étudier cette suite dans l'ordre croissant :

    suite = [0b1, 0b11, 0b101, 0b1111, 0b10001, 0b110011, 0b1010101, 0b11111111]

    La formule mathématique a l'air assez compliquée Sierpiński's triangle (Pascal's triangle mod 2) :

    mais le principe pour le traduire en programmation est plus simple :

    plutôt que de partir sur une manipulation binaire d'un nombre qui sera très lourd à lire, bien que certainement plus performant, je préfère utiliser une liste dont les éléments sont indexables plus simplement que les bits dans un nombre.


    1) On démarre d'une liste vide notée ligne
    2) Pour chaque numéro de ligne noté n:
    3) Si la ligne précédente contient au moins deux éléments:
    4) Chaque élément de la ligne précédente, hormis le premier élément, sera le résultat de l'opération ou-exclusif (vrai si a et b sont différents) sur l'élément et son élément en position - 1 (y compris le premier élément)

    Exemple :
    si ligne précédente : [1, 1] on aura : [1, 0]
    Premier élément inchangé: 1
    1 (pos) identique à 1 (pos-1): 0

    [1, 0, 1] donnera: [1, 1, 1]
    Premier élément inchangé: 1
    0 (pos) différent de 1 (pos-1): 1
    1 (pos) différent soit 0 (pos-1): 1


    [1, 1, 1, 1, 1, 1, 1, 1] donnera 1 (inchangé car premier élément) puis que des zéro

    5) Puis on rajoute en dernier élément : 1
    [1, 0] donnera [1, 0, 1]


    Voici ce que ça donne en traduction Python sur un range n de 32 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ligne = []
    for n in range(32): # { Pour chaque ligne
        nouvelle_ligne = ligne[:] # Copie des éléments de la ligne précédente
        if len(nouvelle_ligne) >= 2: #*{ Si au moins deux éléments
            for position in range(1, len(nouvelle_ligne)): # { Pour chaque élément hormis le premier
                nouvelle_ligne[position] = ligne[position] ^ ligne[position - 1] # Ou exclusif élément et élément - 1
            # } for
        # } if
        nouvelle_ligne.append(1) # Ajout dernier élément: 1
        print("".join([[" ", "#"][item] for item in nouvelle_ligne]))
        ligne = nouvelle_ligne
    # } for
    Et on obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #
    ##
    # #
    ####
    #   #
    ##  ##
    # # # #
    ########
    #       #
    ##      ##
    # #     # #
    ####    ####
    #   #   #   #
    ##  ##  ##  ##
    # # # # # # # #
    ################
    #               #
    ##              ##
    # #             # #
    ####            ####
    #   #           #   #
    ##  ##          ##  ##
    # # # #         # # # #
    ########        ########
    #       #       #       #
    ##      ##      ##      ##
    # #     # #     # #     # #
    ####    ####    ####    ####
    #   #   #   #   #   #   #   #
    ##  ##  ##  ##  ##  ##  ##  ##
    # # # # # # # # # # # # # # # #
    ################################
    Très intéressant comme exercice.

    Je vous laisse trouver comment retourner les éléments dans l'ordre décroissant.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Par défaut
    Merci beaucoup pour votre réponse.
    Cela m'a beaucoup aidé.

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

Discussions similaires

  1. Triangle de sierpinski
    Par tamerla dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 09/03/2014, 00h16
  2. [Fractales] Triangle de Sierpinski
    Par forum dans le forum Téléchargez
    Réponses: 0
    Dernier message: 20/05/2012, 13h40
  3. [Complexité d'un algorithme] Triangle de Sierpinski
    Par Opérateur dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 18/12/2006, 15h25
  4. [Fractale] Triangle de Sierpinski
    Par Florian.L dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 18/01/2005, 23h20
  5. [3D] Triangles
    Par Frederic dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 08/11/2002, 23h01

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