Chiffres égaux

Bonsoir,

je vous soumets un petit programme python pour tester si les chiffres du début et de la fin d'un nombre sont égaux.
Exemples: 7744 oui, 222999 oui, 222099 non
Ce programme répond oui si la deuxième partie du nombre commence par 0!!! (donc oui sur les 3 exemples précédents mais non à 222909)
(la fonction "lister" transforme 123 en [3,2,1] car, aujourd'hui, je programme tout avec "append")

Voila la fonction qui me tarabuste:
def test_chiffres(n):
    test=False
    p=trunc(log(n,10))+1
    pp=p/2
    i=1
    t=10**(pp)
    ok=True
    a=n%t
    L=lister(a)
    print(L)
    for k in L:
        for j in L:
            if (k!=j):
                ok=False
    if ok:
        test=True
        b=(n-a)/t
        L=lister(b)
        print(L)
        for k in L:
            for j in L:
                if (k!=j):
                    test=False
    return test


merci de vos conseils

F.D.

Réponses

  • Contre-proposition...
    def tc(n):
        c = str(n)
        if len(c)%2!=0:
            print 'longueur impaire !'; return False
        l = len(c)/2
        if c[:l]==l*c[0] and c[l:]==l*c[-1]:
            return True
        return False
    
    PS : Nicolas Patrois me fait remarquer que la syntaxe est celle de Python 2 – j'assume ! Pour Python 3, la barre oblique rend un flottant et non un entier et « print » a une syntaxe différente. Version modifiée...
    def tc(n):
        c = str(n)
        if len(c)%2!=0:
            print('longueur impaire !')
            return False
        l = len(c)//2
        if c[:l]==l*c[0] and c[l:]==l*c[-1]:
            return True
        return False
    
  • Attention Math Coss, ça marche en Python 2 parce qu'en Python 3, len(c)/2 est un flottant.
    Je propose, dans le même style et avec les ensembles, en Python 3 :
    def tc(n):
        c=str(n)
        if len(c)%2!=0:
            return False
        l=len(c)//2
        return len(set(c[:l]))==len(set(c[l:]))==1
    

    Je teste si le début et la fin sont constitués d'un seul caractère.
    Petite correction : j’avais oublié set.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Merci beaucoup pour vos codes élégants.

    En discutant avec un collègue, il m'a indiqué ma grosse ânerie : "222099%1000=99 et non 099" ergo l'erreur, il faut traiter des string ou des listes (je m'astreins aux listes, j’adore conduire de nuit dans le brouillard tous feux éteints et les yeux bandés sur une route de montagne turque).

    Merci encore.
    F.D.
  • Petite correction : j’avais oublié set.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonsoir,
    avant d'étudier vos propositions plus en détail, je suis revenu à l'attaque.
    def test_chiffres(n):
        test=False
        p=trunc(log(n,10))+1
        pp=p/2
        i=0
        t=10**(pp)
        ok=False
        L=lister(n)
        a=L
        b=retourn(L)
        while i<pp:
            a.pop()
            b.pop()
            i=i+1
        for i in range(len(a)-1):
            ok=(a[ i]==a[i+1])
        if ok:
            for j in range(len(b)-1):
                test=(b[ i]==b[i+1])
        return test
    
    et ça ne marche toujours pas !!!
    la fonction tc que vous avez proposée marche, en revanche, très bien.
    Il me semble que mon erreur est dans les deux "for" finaux qui sont très mal réfléchis.
    Merci beaucoup, je vais passer aux strings mes caleçons sont trop lâches !!!
    F.D.

    PS. Cher AD, j'aime beaucoup écrire "j'adÔre" pour faire une espèce de pastiche écrit de l'accent de mme la comtesse :-) merci de ta bienveillance et de ta patience

    [Mettre une ' ' entre [ et i sinon, l'afficheur du forum le prend pour une bannière BBcode de mise en italique. AD]
  • Le test qui définit ok est bien curieux : tu en changes (peut-être) la valeur pour chaque indice i, quel que soit le passé. Peut-être faudrait-il mettre quelque chose comme :
    ok = ok and (a[ i]==a[i+1])
    
    Note que tu peux définir des booléens avec "all" et "any", par exemple :
    if all(a[ i]==a[i+1] for i in range(len(a)-1):
       ...
    
    if any(a[ i]!=a[i+1] for i in range(len(a)-1):
       ...
    

    Après, tu utilises des choses que mon interpréteur ne comprend pas : trunc, retourn.

    Par ailleurs, quand tu calcules le développement décimal, ça ne semble pas indispensable de calculer le nombre de chiffres a priori. Avec ces remarques, on peut faire...
    def dec(n):
        L = []
        while n>0:
            L.append(n%10)
            n = n//10
        return L
    def teste(n):
        L = dec(n) # NB : str(n) marcherait sans doute aussi
        return len(L)%2==0 and all(L[ i]==L[0] for i in range(len(L)//2)) and all(L[ i]==L[-1] for i in range(len(L)//2,len(L)))
    
    PS : Fermeture d'une balise de code puis ajout d'une espace à [ i].
    PS' : Aveu : la différence de syntaxe de "print" est une des raisons, peut-être la principale, qui me font préférer Python 2 à Python 3.
  • En Python 2, print est un mot clé, en Python 3, print est une fonction.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonjour,

    trunc est dans le module math et permet de faire un entier d'un réel

    retourn est ma version d'une fonction qui retourne une liste (elle existe mais je ne le savais pas)

    il me paraît normal que "ok" change à chaque itération, c'est, en fait, un while que je devrais mettre :
    while ok:
        if a[ i]!=a[i+1]:
               ok=False
    
    mais la solution avec les string est infiniment plus élégante. Je n'ai pas regardé celle de l'auteur et, en plus, le problème mathématique est relativement simple et ne nécessite guère la machine.
    aabb=n² donc aabb est multiple de 121 et aabb divisé par 121 = ab avec a=b, il ne reste qu'à essayer, on trouve a=b=8 et le nombre est 7744

    merci de vos réponses.
    F.D.

    [Mettre une ' ' entre [ et i sinon, l'afficheur du forum le prend pour une bannière BBcode de mise en italique. AD]
Connectez-vous ou Inscrivez-vous pour répondre.