Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problèrme algo colonne excel

    27 janvier 2023 à 19:45:00

    Bonjour,

    Je souhait créer un algo (a but éducatif) qui  permet de trouver le nom d'une colonne en fonction de son numéro / indice.

    Ex:

    colonne n°0  = "A", n°25 = "Z", n°30 = "AE" etc...

    je suis arriver à ça:

    def column(n):
        alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        column_name = list()
        # solution of n < 26**x
        letters_nbs = int(log(n, 26)) if n> 0 else 0
        
        for letter in range(letters_nbs, -1, -1):
            letter_index = (n// 26 ** letter) % 26
            column_name.append(alphabet[letter_index])
        
        return "".join(column_name)



    ce qui équivaux à:

    def column(n):
        for i in range(n + 1):
            alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            result = list()
            result.append(alphabet[i%26])
            last = i // 26
            result.append(alphabet[last % 26])
     	
            while last >=26:
                last //=26
                result.append(alphabet[last % 26])
            
            result.reverse()
     	return "".join(result)




    Sauf que il manque une itération !!

    column(26) = "BA" et non "AA"

    Quelqu'un à une idée d'où vient l'erreur ?

    Merci d'avance


    -
    Edité par ebdm13 27 janvier 2023 à 19:49:04

    • Partager sur Facebook
    • Partager sur Twitter
      27 janvier 2023 à 22:22:23

      C'est comme si tu comptais en base 10, et qu'après 9 il y ait 00 ...ben non, il y a 10.

      Et les constantes n'ont rien à faire dans les boucles.

      Sinon dans l'idée c'est ça , y a pas grand chose à modifier pour que ça fonctionne .

      -
      Edité par josmiley 28 janvier 2023 à 9:29:57

      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        28 janvier 2023 à 12:33:39

        Pas vraiment compris ton algorithme. Il me semble que ton calcul de longueur du nom de la colonne est faux, je crois comprendre que pour toi c'est 1+int(log(n, 26)), la première valeur fausse étant pour n=676 qui donne 3 chez toi alors que c'est plutôt 2 puisque le nom correspondant est ZA.

        Le problème à résoudre est un problème de conversion de l'entier n en base b=26 mais avec un algorithme de conversion adapté. Il s'agit d'écrire n sous la forme

        [en latex, ça donne : c_0+(c_1+1)b+(c_2+1)b^2+\dots+(c_{N-1}+1)b^{N-1}] où N est la longueur du nom de la colonne, où b est le nombre de caractères possibles (b=26 pour toi mais pour faire des essais, il est pratique de prendre b=10, les caractères étant les chiffres décimaux) et où les coefficients ci sont des chiffres en base b. Pourquoi ? Réponse : chaque fois que la longueur du nom de colonne augmente de 1 caractère, on recommence à compter depuis 0 (c'est à dire AAA...A).

        D'où  le code suivant :

        from string import ascii_uppercase as upper, digits
        
        def col(n, b, alpha=upper):
            L=[alpha[n%b]]
            n//=b
            while n:
                r=n%b
                if r:
                    L.append(alpha[r-1])
                    n//=b
                else:
                    L.append(alpha[b-1])
                    n=(n-b)//b
            return ''.join(L)[::-1]
        
        
        alpha=upper
        b=len(alpha)
        n=676
        print(col(n,b)) 

        qui affiche

        ZA

        Tu peux aussi générer manuellement tous les noms de colonnes jusqu'à celle qui représente n :

        from string import ascii_uppercase as upper, digits
        
        def gen(n, alpha=upper):
            def next_col(s, alpha=upper):
                last=alpha[-1]
                N=len(s)
                if s==last*N:
                    return alpha[0]*(N+1)
                k=N-1
                for _ in range(N):
                    if s[k]!=last:
                        j=alpha.index(s[k])
                        return s[:k]+alpha[j+1]+alpha[0]*(N-k-1)
                    k-=1    
            s=alpha[0]
            print(s, end=', ')
            for k in range(n):
                s=next_col(s, alpha)
                print(s, end=', ')
            return s
        
        alpha=upper
        b=len(alpha)
        n=676
            
        gen(n)    

        qui affiche

        A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG, BH, BI, BJ, BK, BL, BM, BN, BO, BP, BQ, BR, BS, BT, BU, BV, BW, BX, BY, BZ, CA, CB, CC, CD, CE, CF, CG, CH, CI, CJ, CK, CL, CM, CN, CO, CP, CQ, CR, CS, CT, CU, CV, CW, CX, CY, CZ, DA, DB, DC, DD, DE, DF, DG, DH, DI, DJ, DK, DL, DM, DN, DO, DP, DQ, DR, DS, DT, DU, DV, DW, DX, DY, DZ, EA, EB, EC, ED, EE, EF, EG, EH, EI, EJ, EK, EL, EM, EN, EO, EP, EQ, ER, ES, ET, EU, EV, EW, EX, EY, EZ, FA, FB, FC, FD, FE, FF, FG, FH, FI, FJ, FK, FL, FM, FN, FO, FP, FQ, FR, FS, FT, FU, FV, FW, FX, FY, FZ, GA, GB, GC, GD, GE, GF, GG, GH, GI, GJ, GK, GL, GM, GN, GO, GP, GQ, GR, GS, GT, GU, GV, GW, GX, GY, GZ, HA, HB, HC, HD, HE, HF, HG, HH, HI, HJ, HK, HL, HM, HN, HO, HP, HQ, HR, HS, HT, HU, HV, HW, HX, HY, HZ, IA, IB, IC, ID, IE, IF, IG, IH, II, IJ, IK, IL, IM, IN, IO, IP, IQ, IR, IS, IT, IU, IV, IW, IX, IY, IZ, JA, JB, JC, JD, JE, JF, JG, JH, JI, JJ, JK, JL, JM, JN, JO, JP, JQ, JR, JS, JT, JU, JV, JW, JX, JY, JZ, KA, KB, KC, KD, KE, KF, KG, KH, KI, KJ, KK, KL, KM, KN, KO, KP, KQ, KR, KS, KT, KU, KV, KW, KX, KY, KZ, LA, LB, LC, LD, LE, LF, LG, LH, LI, LJ, LK, LL, LM, LN, LO, LP, LQ, LR, LS, LT, LU, LV, LW, LX, LY, LZ, MA, MB, MC, MD, ME, MF, MG, MH, MI, MJ, MK, ML, MM, MN, MO, MP, MQ, MR, MS, MT, MU, MV, MW, MX, MY, MZ, NA, NB, NC, ND, NE, NF, NG, NH, NI, NJ, NK, NL, NM, NN, NO, NP, NQ, NR, NS, NT, NU, NV, NW, NX, NY, NZ, OA, OB, OC, OD, OE, OF, OG, OH, OI, OJ, OK, OL, OM, ON, OO, OP, OQ, OR, OS, OT, OU, OV, OW, OX, OY, OZ, PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK, PL, PM, PN, PO, PP, PQ, PR, PS, PT, PU, PV, PW, PX, PY, PZ, QA, QB, QC, QD, QE, QF, QG, QH, QI, QJ, QK, QL, QM, QN, QO, QP, QQ, QR, QS, QT, QU, QV, QW, QX, QY, QZ, RA, RB, RC, RD, RE, RF, RG, RH, RI, RJ, RK, RL, RM, RN, RO, RP, RQ, RR, RS, RT, RU, RV, RW, RX, RY, RZ, SA, SB, SC, SD, SE, SF, SG, SH, SI, SJ, SK, SL, SM, SN, SO, SP, SQ, SR, SS, ST, SU, SV, SW, SX, SY, SZ, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, TR, TS, TT, TU, TV, TW, TX, TY, TZ, UA, UB, UC, UD, UE, UF, UG, UH, UI, UJ, UK, UL, UM, UN, UO, UP, UQ, UR, US, UT, UU, UV, UW, UX, UY, UZ, VA, VB, VC, VD, VE, VF, VG, VH, VI, VJ, VK, VL, VM, VN, VO, VP, VQ, VR, VS, VT, VU, VV, VW, VX, VY, VZ, WA, WB, WC, WD, WE, WF, WG, WH, WI, WJ, WK, WL, WM, WN, WO, WP, WQ, WR, WS, WT, WU, WV, WW, WX, WY, WZ, XA, XB, XC, XD, XE, XF, XG, XH, XI, XJ, XK, XL, XM, XN, XO, XP, XQ, XR, XS, XT, XU, XV, XW, XX, XY, XZ, YA, YB, YC, YD, YE, YF, YG, YH, YI, YJ, YK, YL, YM, YN, YO, YP, YQ, YR, YS, YT, YU, YV, YW, YX, YY, YZ, ZA,

        Ça doit peut-être se générer avec itertools plus facilement.




        • Partager sur Facebook
        • Partager sur Twitter
          28 janvier 2023 à 13:22:22

          Pinaise j'ai rien compris ...

          Perso je fais comme ça, les codes se ressemblent.

          r = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
          ln = len(r)
          
          def foo(n):
              n,m = divmod(n,ln)
              z = r[m]
              while n:
                  n,m = divmod(n-1,ln)
                  z = r[m]+z
              return z



          -
          Edité par josmiley 28 janvier 2023 à 13:39:51

          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            28 janvier 2023 à 13:52:46

            josmiley a écrit:

            Pinaise j'ai rien compris ...

            Perso je fais comme ça

            r = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
            ln = len(r)
            
            def foo(n):
                n,m = divmod(n,ln)
                z = r[m]
                while n:
                    n,m = divmod(n-1,ln)
                    z = r[m]+z
                return z



            -
            Edité par josmiley il y a 10 minutes

            Oui, bien vu : en faisant prenant n-1 au lieu de n à chaque étape, tu obtiens comme reste (ci+1)-1=ci de ma formule plus haut qui est l'indice cherché.

            • Partager sur Facebook
            • Partager sur Twitter
              28 janvier 2023 à 14:30:44

              Et la formule inverse 

              r = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
              ln = len(r)
              
              def foo(n):
                  n,m = divmod(n,ln)
                  z = r[m]
                  while n:
                      n,m = divmod(n-1,ln)
                      z = r[m]+z
                  return z
                  
              rd = dict(zip(r,range(ln)))
              
              def unfoo(s):
                  l,*r = s
                  z = rd[l]
                  while r:
                      l,*r = r
                      z = (z+1)*ln+rd[l]
                  return z
              
              print(foo(701))      # ZZ
              print(unfoo('ZZ'))   # 701



              -
              Edité par josmiley 28 janvier 2023 à 18:57:11

              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                28 janvier 2023 à 15:26:21

                Effectivement la question pouvait se poser. Je trouve que c'est bien plus simple que l'autre conversion :

                r = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                ln = len(r)
                
                def col2num(col):
                    return (r.index(col[0]) + 1) * ln ** (len(col) - 1) + col2num(col[1:]) if len(col) > 1 else r.index(col[0])
                
                print(col2num("AZERTYYYYYUIOP"))
                4983312496141349905




                -
                Edité par PascalOrtiz 28 janvier 2023 à 15:27:37

                • Partager sur Facebook
                • Partager sur Twitter
                  28 janvier 2023 à 15:55:44

                  Bonjour,

                  On peut aussi tout simplement faire ceci:

                  import string
                  
                  alpha = string.ascii_uppercase
                  
                  n = int(input('\nn : '))
                  
                  if(n//26 - 1 < 0):
                      col = alpha[n%26]
                  else:
                      col = alpha[n//26 - 1] + alpha[n%26]
                  
                  print('\n{} --> {}'.format(n,col))



                  -
                  Edité par Phil_1857 28 janvier 2023 à 15:57:10

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 janvier 2023 à 16:06:26

                    Phil_1857 a écrit:

                    Bonjour,

                    On peut aussi tout simplement faire ceci:

                    import string
                    
                    alpha = string.ascii_uppercase
                    
                    n = int(input('\nn : '))
                    
                    if(n//26 - 1 < 0):
                        col = alpha[n%26]
                    else:
                        col = alpha[n//26 - 1] + alpha[n%26]
                    
                    print('\n{} --> {}'.format(n,col))



                    -
                    Edité par Phil_1857 il y a 7 minutes


                    Ton code est certainement incomplet car ça n'a aucune raison de marcher sans aucune répétition (récursive ou itérative). Ta ligne 10 va générer un débordement d'indice.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 janvier 2023 à 16:16:45

                      Bonjour, 

                      que veux tu dire, mon code marche, regarde, j'ai remplacé la saisie de n par une boucle pour afficher plusieurs résultats d'un coup:

                      import string
                      
                      alpha = string.ascii_uppercase
                      
                      for n in range(80):
                          if(n//26 - 1 < 0):
                              col = alpha[n%26]
                          else:
                              col = alpha[n//26 - 1] + alpha[n%26]
                      
                          print('{} --> {}'.format(n,col))

                      résultat:



                      -
                      Edité par Phil_1857 28 janvier 2023 à 16:18:46

                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 janvier 2023 à 16:27:34

                        L'entier n peut-être aussi grand qu'on veut et là ton code plantera :

                        import string
                         
                        alpha = string.ascii_uppercase
                         
                        n = 26*27
                         
                        if(n//26 - 1 < 0):
                            col = alpha[n%26]
                        else:
                            col = alpha[n//26 - 1] + alpha[n%26]
                         
                        print('\n{} --> {}'.format(n,col)) 
                        Traceback (most recent call last):
                          File "phil.py", line 10, in <module>
                            col = alpha[n//26 - 1] + alpha[n%26]
                        IndexError: string index out of range
                        




                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 janvier 2023 à 16:32:19

                          tu as raison, je n'étais pas allé jusque là, en fait, mon code ne fonctionne que jusqu'à la

                          colonne ZZ et ne peut donc pas générer les colonnes AAA et suivantes

                          -
                          Edité par Phil_1857 28 janvier 2023 à 16:33:12

                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 janvier 2023 à 16:44:28

                            Remarque : ta condition n//26 - 1 < 0 s'exprime plus simplement par n < 26 et dans ce cas n%26 se remplace par n.

                            Et il me semble que ton code pouvait se récrire :

                            import string
                             
                            alpha = string.ascii_uppercase
                             
                            n =42
                             
                            col = alpha[n//26 - 1:n//26] + alpha[n%26]
                             
                            print('\n{} --> {}'.format(n,col)) 
                            



                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 janvier 2023 à 18:12:23

                              En tenant compte de la remarque de josmiley qui dit que c'est 10 et non 00 qui suit 9 en base 10: :)
                              (je suppose le nombre correct en base 26 [lettres])
                               
                              from string import ascii_uppercase as upper
                              def col(n, alpha):
                                  b = len(alpha)
                                  s = ""
                                  while n:
                                      s = alpha[n%b] + s
                                      n //= b
                                  return s or alpha[0]
                              def num(s, alpha):
                                  b = len(alpha)
                                  n = 0
                                  for c in s:
                                      n = n*b + alpha.index(c)
                                  return n
                              #
                              n = int(input("> "))
                              print(col(n, upper))
                              print(num(col(n, upper), upper))

                              -
                              Edité par PierrotLeFou 28 janvier 2023 à 18:21:03

                              • Partager sur Facebook
                              • Partager sur Twitter

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

                                28 janvier 2023 à 19:00:32

                                @PierrotLeFou

                                Dans ton code, si je tape 26 ça retourne BA au lieu de AA

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Python c'est bon, mangez-en. 

                                  28 janvier 2023 à 20:25:10

                                  Obtention du nom de colonne avec itertools :

                                  from string import ascii_uppercase as upper
                                  from itertools import product, count
                                  
                                  def gen(n):
                                      cpt=0
                                      for k in count(1):
                                          for s in product(upper, repeat=k):
                                              if cpt==n:
                                                  return ''.join(s)
                                              cpt+=1
                                  
                                  n=2023
                                  print(gen(n))
                                  BYV

                                  Le code est très certainement améliorable. Evidemment, ça ne peut pas traiter des valeurs de n arbitrairement grandes.


                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    28 janvier 2023 à 21:55:04

                                    Autre solution

                                    import string
                                    
                                    
                                    def foo(n):
                                        letters = string.ascii_uppercase
                                        result = ""
                                        while n:
                                            n, remainder = divmod(n - 1, len(letters) - 1)
                                            result = letters[remainder] + result
                                        return result



                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                      28 janvier 2023 à 22:07:15

                                      fred1599 a écrit:

                                      Autre solution

                                      import string
                                      
                                      
                                      def foo(n):
                                          letters = string.ascii_uppercase
                                          result = ""
                                          while n:
                                              n, remainder = divmod(n - 1, len(letters) - 1)
                                              result = letters[remainder] + result
                                          return result



                                      Pas bon, 0 doit retourner A et 25 Z.

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Python c'est bon, mangez-en. 

                                        28 janvier 2023 à 22:32:12

                                        josmiley a écrit:

                                        fred1599 a écrit:

                                        Autre solution

                                        import string
                                        
                                        
                                        def foo(n):
                                            letters = string.ascii_uppercase
                                            result = ""
                                            while n:
                                                n, remainder = divmod(n - 1, len(letters) - 1)
                                                result = letters[remainder] + result
                                            return result



                                        Pas bon, 0 doit retourner A et 25 Z.

                                        je corrige,

                                        import string
                                        
                                        
                                        def foo_1(n):
                                            letters = string.ascii_uppercase
                                            result = ""
                                            n += 1
                                            while n:
                                                n, remainder = divmod(n-1, 26)
                                                result = letters[remainder] + result
                                            return result

                                        puis une autre proposition

                                        def foo_2(n):
                                            base = ord('A')
                                            result = ""
                                            while n >= 0:
                                                result = chr(base + n % 26) + result
                                                n = n // 26 - 1
                                            return result





                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                          29 janvier 2023 à 0:51:24

                                          josmiley a écrit:
                                          > @PierrotLeFou
                                          > Dans ton code, si je tape 26 ça retourne BA au lieu de AA
                                          Il faudrait demander à ebdm13 ce que devrait donner 676 (26*26), 675 ou 650 (26*25)
                                          J'obtiens BAA, ZZ, ZA dans l'ordre.

                                          edit:
                                          Je crois commencer à comprendre la logique de tout cela ...
                                          J'ai refait mon code en m'inspirant de celui de PascalOrtiz, mais sans le module itertools.
                                          Je suppose que mon code est plus lent. J'obtiens le mêm résultat pour 2023:
                                           
                                          from string import ascii_uppercase as upper
                                          from math import log
                                          def col(n, alpha):
                                              b = len(alpha)
                                              M = list(alpha)
                                              C = M
                                              for _ in range(int(log(n, b))+2):
                                                  M = [i+j for i in M for j in alpha]
                                                  C += M
                                              return C[n]
                                          n = int(input("> "))
                                          print(col(n, upper))

                                          re-edit:
                                          Ce processus est plutôt lent. J'ai essayé de l'optimiser en le simulant.
                                          On n'est pas vraiment en base 26. On a tout de même 26 nombres de 1 lettre, 676 nombres de 2 lettres à la suite, etc.
                                          Le code qui suit semble fonctionner pour toutes les valeurs de mon code précédent:
                                           
                                          from string import ascii_uppercase as upper
                                          def col(n, alpha):
                                              b = len(alpha)
                                              p = 1
                                              while n >= b**p:   # Pourrait être optimisé.
                                                  n -= b**p
                                                  p += 1
                                              C = []
                                              while n:
                                                  C.append(n%b)
                                                  n //= b
                                              C.extend([0]*(p-len(C)))
                                              return "".join(alpha[i] for i in C[-1::-1])
                                          n = int(input("> "))
                                          print(col(n, upper))

                                          -
                                          Edité par PierrotLeFou 29 janvier 2023 à 3:30:24

                                          • Partager sur Facebook
                                          • Partager sur Twitter

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

                                            29 janvier 2023 à 10:04:46

                                            fred1599 a écrit:

                                            je corrige,

                                            import string
                                            
                                            
                                            def foo_1(n):
                                                letters = string.ascii_uppercase
                                                result = ""
                                                n += 1
                                                while n:
                                                    n, remainder = divmod(n-1, 26)
                                                    result = letters[remainder] + result
                                                return result



                                            La première correction reste incorrecte (renvoie CEW pour n=2023 au lieu de BYV). Et le code reste très proche de ce que josmiley a proposé.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              29 janvier 2023 à 10:13:24

                                              Je retrouve pourtant bien BYV
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                29 janvier 2023 à 10:26:07

                                                fred1599 a écrit:

                                                Je retrouve pourtant bien BYV


                                                Moi aussi.

                                                La différence avec mon code est que j'économise l'initialisation de result et n += 1.

                                                -
                                                Edité par josmiley 29 janvier 2023 à 10:27:21

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Python c'est bon, mangez-en. 

                                                  29 janvier 2023 à 10:29:51

                                                  Mes excuses, j'avais pris ton code non corrigé sans le n+1. Et, effectivement le fait de rajouter 1 à n au départ est une bonne idée.

                                                  Sinon, quelles sont vos propositions pour calculer le nombre de lettres du nom de la colonne de rang n, sans calculer le nom de la colonne ?

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    29 janvier 2023 à 10:35:29

                                                    PascalOrtiz a écrit:

                                                    Mes excuses, j'avais pris ton code non corrigé sans le n+1. Et, effectivement le fait de rajouter 1 à n au départ est une bonne idée.

                                                    Sinon, quelles sont vos propositions pour calculer le nombre de lettres du nom de la colonne de rang n, sans calculer le nom de la colonne ?


                                                    Une proposition,

                                                    def foo_2_length(n):
                                                        length = 0
                                                        while n >= 0:
                                                            length += 1
                                                            n = n // 26 - 1
                                                        return length

                                                    j'ai pas trop testé, mais c'est fonctionnel sur les quelques tests déjà effectués précédemment.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                                    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                      29 janvier 2023 à 14:24:04

                                                      fred1599 a écrit:

                                                      Une proposition,

                                                      def foo_2_length(n):
                                                          length = 0
                                                          while n >= 0:
                                                              length += 1
                                                              n = n // 26 - 1
                                                          return length

                                                      j'ai pas trop testé, mais c'est fonctionnel sur les quelques tests déjà effectués précédemment.

                                                      Ça marche !

                                                      Une alternative :

                                                      def w(n):
                                                          s, N = 26, 1
                                                          while s <= n:
                                                              s = 26 * (1 + s)
                                                              N += 1
                                                          return N
                                                      
                                                      print(w(2023))

                                                      Et il existe une solution sans boucle.


                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        29 janvier 2023 à 18:45:21

                                                        > Et il existe une solution sans boucle.
                                                        Ceci semble fonctionner:
                                                         
                                                        from math import log
                                                        def w(n):
                                                            return int(log((n+1)*25+1, 26))
                                                        print(w(int(input("> "))))

                                                        C'est basé sur le polynôme (26+1)^k

                                                        sum(26**i for i in range(k)) = (26**k-1) / (26-1)

                                                        -
                                                        Edité par PierrotLeFou 29 janvier 2023 à 18:55:12

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

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

                                                          29 janvier 2023 à 19:24:37

                                                          PierrotLeFou a écrit:

                                                          > Et il existe une solution sans boucle.
                                                          Ceci semble fonctionner:
                                                           
                                                          from math import log
                                                          def w(n):
                                                              return int(log((n+1)*25+1, 26))
                                                          print(w(int(input("> "))))

                                                          C'est basé sur le polynôme (26+1)^k

                                                          sum(26**i for i in range(k)) = (26**k-1) / (26-1)

                                                          -
                                                          Edité par PierrotLeFou il y a 28 minutes


                                                          Bien joué , j'avais l'intuition que log y était pour quelque chose mais la flemme de chercher

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Python c'est bon, mangez-en. 

                                                            30 janvier 2023 à 0:47:28

                                                            PierrotLeFou a écrit:

                                                            > Et il existe une solution sans boucle.
                                                            Ceci semble fonctionner:
                                                             
                                                            from math import log
                                                            def w(n):
                                                                return int(log((n+1)*25+1, 26))
                                                            print(w(int(input("> "))))

                                                            Oui, c'est cette formule que j'avais en tête. Néanmoins, cette formule a un gros inconvénient, elle donne dans certains cas un résultat faux à cause d'une erreur d'arrondi, style un log qui vaut 2.999999996. Je ne l'ai pas vu se produire pour b=26 néanmoins ce n'est pas le cas pour b=10.

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Problèrme algo colonne excel

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown