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 :

Réduction de code source phénoménale


Sujet :

Python

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut Réduction de code source phénoménale
    Bonjour à tous

    Problèmes : faire avancer un petit personnage (Thor) jusqu'à une lumière. On a en entrée la position de Thor en X,Y et la position de la lumière en X,Y. Le terrain n'a aucun obstacle. A chaque tour il faut juste indiquer une direction à choisir entre N, NE, E, SE, S, SW, W, NW et suite à cette indication Thor fait un pas dans la direction citée. Faut juste alors ne pas oublier de modifier la position de Thor pour pouvoir détecter s'il ne sort pas de la carte. Le prog s'arrête tout seul quand Thor arrive à la lumière. Bref rien de vraiment compliqué (code ci-dessous)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def choix(T, L, k):
        if T < L: return(k[0], T+1)
        if T > L: return(k[1], T-1)
        return ("", T)
    # choix
     
    # Récupération des positions (Thor et la lumière)
    LX, LY, TX, TY = [int(i) for i in raw_input().split()]
     
    # Boucle de déplacement
    while True:
        (Y, TY)=choix(TY, LY, "SN")
        (X, TX)=choix(TX, LX, "EW")
        print "%s%s" % (Y, X)
    #while

    Ensuite un autre challenge consiste à programmer la même solution dans le code le plus court possible. Et là, tout compte (les tailles des noms des variables, les espaces, etc.) Je m'y suis mis aussi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    d=lambda T,L,k:T<L and (k[0],T+1) or T>L and (k[1],T-1) or ("",T)
    P=[int(i) for i in raw_input().split()]
    while 1:
        (Y,P[3])=d(P[3],P[1],"SN")
        (X,P[2])=d(P[2],P[0],"EW")
        print "%s%s"%(Y,X)
    Un code vraiment minimaliste (199 caractères au total). Et là, surprise, j'ai un classement honorable (premier tiers) mais le premier a quand-même un code (toujours Python 2) de 66 caractères !!! (et le tout premier a un code Ruby de 46c).

    Et là est ma question: en dehors de toute idée de tricherie, certains auraient-ils des idées pour savoir comment une telle compression est possible ??? Me semble un truc totalement fou non ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    y a pas de règle, faut juste que thor arrive à la lumière par n'importe quel chemin ?

    si oui j'aurai plutôt fait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x,y,X,Y=map(int,raw_input().split())
    for i in'W'*X+'N'*Y+'E'*x+'S'*y:print i
    faudrait l'énoncé complet de l'exo ...

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par josmiley Voir le message
    faudrait l'énoncé complet de l'exo ...
    Pardon s'il manquait des trucs
    Le programme doit, à chaque itération d'une boucle infinie, sortir une unique chaine contenant soit "N", soit "NE", soit "E", soit "SE, soit "S", soit "SW", soit "W", soit "NW" et pas autre chose (une fois ma boucle a sorti "S " au lieu de "S" et le bousier me l'a refusée). Et c'est le moteur placé derrière le site qui récupère cette chaine et fait avancer Thor en vérifiant s'il arrive à la lumière ou s'il ne sort pas de la carte.

    Ta solution est astucieuse mais ne correspond pas. Pas évident hein ???

    PS: je viens de voir qu'utiliser un tableau au lieu de variables fait gagner de la place lors du remplissage mais m'en fait perdre lors de l'utilisation de ses éléments

    Code modifé
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    d=lambda T,L,k:T<L and (k[0],T+1) or T>L and (k[1],T-1) or ("",T)
    X,Y,x,y=[int(i) for i in raw_input().split()]
    while 1:
        (a,y)=d(y,Y,"SN")
        (o,x)=d(x,X,"EW")
        print "%s%s"%(a,o)
    Programme de 187c mais de plus en plus illisible. X et Y sont la position de la Lumière et x et y celles de thor. a pour lAtitude et o pour lOngitude. Mais bon, j'ai supprimé 12 caractères ce qui m'a fait gagner 70 places !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    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,



    Pour ton optim Sve@r je te propose une modification très légère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    d=lambda T,L,k:[(k[0],T+1),('',T),(k[1],T-1)][cmp(T,L)+1]
    X,Y,x,y=[int(i) for i in raw_input().split()]
    while 1:
        (a,y)=d(y,Y,"SN")
        (o,x)=d(x,X,"EW")
        print a+o

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    HS: je me suis inscrit, je passe avec 112 caractères mais je vois pas les classements ... c'est où ?

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    Salut,

    sujet interessant même si complètement inutil et poussant à faire du code moche
    pour ma part, je fais pas mieux que 137 133 122 caractères pour le moment, avec une tehcnique proche de celle de Sve@r (mais sans la lambda).
    je posterai le code si ça intéresse du monde.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par josmiley Voir le message
    HS: je me suis inscrit, je passe avec 112 caractères mais je vois pas les classements ... c'est où ?
    Quand tu fais "envoyer" là le site teste ta solution avec ses données à lui (évite le hardcode !!!) tu attends quelques secondes puis ça t'affiche ton classement.

    Effectivement si on quitte la page on n'arrive pas à le retrouver autrement qu'en renvoyant de nouveau le même code pour qu'il soit réanalysé.

    [edit] Je parle bien du challenge "Thor taille du code" (dans la rubrique "optimisations") et non du challenge "Le pouvoir de Thor" dans la rubrique facile !!!

    Sinon merci à BufferBob. J'avais déjà essayé print a,o ce qui m'avait donné le "S " au lieu du "S" et n'avais pas pensé au "+"

    Sinon quand je vois Tryph qui écrit une simili lambda (ce que je ne sais pas faire) et qui me gratte 50c là je me pense maudit par les dieux de Python...

    J'ai eu une idée en examinant mieux le post de josmiley (écrire n fois "S" puis etc). Effectivement quand Thor est en position (par exemple) 1,0 et qu'il doit atteindre 36,17, il va d'abord faire 17 (donc yL - yT) fois "SW" (l'axe des y part vers le bas) puis 19 (donc xL - yL + yT) fois "W".
    Donc peut-être générer de cette façon une suite de 000000011111111 (ou 222222333333) puis ensuite traiter chaque élément de cette suite pour afficher par exemple "SW" pour 0, "SE" pour 1, "NW" pour 2 etc.

    J'essaye de coder ça d'abord chez-moi puis je verrai si ça se réduit...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    hum... après relecture du sujet, c'est pas vraiment de ta solution que je suis proche mais de celle de BufferBob (à cause de l'utilisation de cmp) et puis du coup y a eu quelques évolutions ensuite...
    du coup, ma solution n'a pas grand chose à voir avec la tienne au final.

    par contre pour gagner quelques caractères facilement, regarde la première ligne de code du premier message de josmiley.

    sinon je m'y prends comme ça moi:
    - je met d'abord mes directions (N, S, E, W) dans une variable et dans un format qui me permettra d'y accéder facilement et en peu de caractères avec des résultat de fonction cmp()
    - je récupère les résultat de 2 appels à cmp()
    - je printe le résultat avec une concaténation

    (je me suis quand même pris la tête un moment et je vois pass comment faire mieux)

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    je suis à 111chars avec 2 cmp() aussi.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tryph Voir le message
    (je me suis quand même pris la tête un moment et je vois pass comment faire mieux)
    Oui. Et quand tu vois que mrv le fait en 66c et que Wazemo le fait en 60c en bash (!!!!) il y a vraiment de quoi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    je suis arrivé difficilement à 107c ...

Discussions similaires

  1. Contribuez à la FAQ et aux CODES SOURCE XML
    Par Community Management dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 21/04/2008, 20h52
  2. code source de netstat
    Par calif dans le forum Développement
    Réponses: 3
    Dernier message: 28/09/2003, 08h39
  3. Defragmenteur code-source
    Par ak-k dans le forum Windows
    Réponses: 7
    Dernier message: 25/08/2003, 14h36
  4. Je cherche le code-source d'un interface de Windows
    Par Robert A. dans le forum Windows
    Réponses: 5
    Dernier message: 02/06/2003, 09h45
  5. [VB6] Code source pour modifier MsgBox
    Par khany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 25/02/2003, 15h13

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