Générateur de base

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Générateur de base

Message par Shadow »

Salut,

Moi qui est souvent besoin d'algorithme pour des bases, j'me suis dis que
si je pouvais en finir une bonne fois pour toute...

C'est chose faite !
Et oui, avec ce code, générez la base de vos rêve sans dec :D

Vous voulez une base 2, 3, 4, 5... 15, 16, 17..., 24, 25..., 32..., 64..., 128..., 255..., 999..., 9999..., 999999...
Mais oui mais vous voulez aussi utiliser les caractères voulue "Filtre" et oui, ont fais pas les chose à moities sinon autant aller se couché, vue l'heur :lol:

Ce code, c'est un premier crue, j'veux dire, un premier jet, permet tous cela !
Je suis très intéressé pour savoir si ya mieux, plus court, plus optimisé, etc quoi :)

Code : Tout sélectionner

; Code créé par monsieur Dieppedalle David le 26/02/2016
; Ce code permet de générer la base voulut, n'importe la quel minimum de 2, avec le filtre de sortie voulut.

; Si vous êtes en 32 Bit, vous ne pouvez aller au delà de: 2147483647
; Si vous êtes en 64 Bit, vous ne pouvez aller au delà de: 9223372036854775807

Procedure.s InverserChaine(Chaine.s, DelimiteurChaine$ = " ")
  Protected Phrase.s = "", Premier = 1
  
  For i = CountString(Chaine, DelimiteurChaine$) + 1 To 1 Step - 1
    If Premier = 0
      Phrase + DelimiteurChaine$
    Else
      Premier = 0
    EndIf
    Phrase + StringField(Chaine, i, DelimiteurChaine$)
  Next
  
  ProcedureReturn Phrase
EndProcedure

Procedure.q VerificateurNombreChaine(Instance.i, NombreChaine.s, NombreMaximal.s = "9223372036854775807", LongeurMaximum.i = 19)
  
  LongueurNombre.i = Len(NombreChaine.s)
  
  For I = 1 To LongueurNombre.i
    
    CaractereAscii = Asc(Mid(NombreChaine.s, I, 1))
    
    If (CaractereAscii < '0' Or CaractereAscii > '9')
      MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut contenir que des chiffres !", 64)
      End
    EndIf
    
  Next
  
  If LongueurNombre.i = 0
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut pas être une chaîne vide !", 64)
    End
    
  ElseIf LongueurNombre.i > LongeurMaximum.i
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre ne peut pas être supérieur à " + Str(LongeurMaximum.i) + " chiffre !", 64)
    End
    
  ElseIf LongueurNombre.i = LongeurMaximum.i
    
    Maxi$ = NombreMaximal.s
    
    For I = 1 To LongueurNombre.i
      
      CaractereNombre$ = Mid(NombreChaine.s, I, 1)
      CaractereMaxi$ = Mid(Maxi$, I, 1)
      
      If Val(CaractereNombre$) > Val(CaractereMaxi$)
        
        MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Le nombre est trop grand !" + Chr(13) + Chr(13) +
                                                                                             "    Le nombre doit être compris entre 0 et " + NombreMaximal.s + " inclus !"+ Chr(13) +
                                                                                             "    Le nombre actuel est de: " + NombreChaine.s, 64)
        End
        
      EndIf
      
    Next
    
  EndIf
  
  ProcedureReturn Val(NombreChaine.s)
  
EndProcedure

Procedure.s GenererBase(Instance.i, Base.i, NombreChaine.s, Filtre$, DelimiteurSortie$ = ".", InversionSortie.b = #True)
  
  ; Sert uniquement de repèrage en cas d'erreur.
  If Instance.i <= 0
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Une instance ne peut pas être inférieure ou égale à 0 !", 64)
    End
  ElseIf Instance.i = #PB_Any
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    #PB_Any ne peut pas être utilisé pour le numéro de l'instance !" + Chr(13) +
                                    "    Vous devez vous même affecter un numéro d'instance !", 64)
    End
  EndIf
  
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    NombreVerifier.q = VerificateurNombreChaine(Instance.i, NombreChaine.s, "2147483647")
    
  CompilerElse
    NombreVerifier.q = VerificateurNombreChaine(Instance.i, NombreChaine.s, "9223372036854775807")
    
  CompilerEndIf

  If Base.i < 2
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Base ne peut pas être inférieure à 2 !", 64)
    End
  EndIf
  
  If Len(DelimiteurSortie$) = 0
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    DelimiteurSortie$ doit être constitué d'au moins un caractère !", 64)
    End
  ElseIf Len(DelimiteurSortie$) > 1
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    DelimiteurSortie$ ne peut pas être supérieur à un caractère !", 64)
    End
  EndIf
  
  Dim TableauFiltre.s(CountString(Filtre$, DelimiteurSortie$))
  TableauFiltreIndex = 0
  
  For I = 1 To CountString(Filtre$, DelimiteurSortie$) + 1
    
    GroupeFiltre$ = StringField(Filtre$, I, DelimiteurSortie$)
    Trouver = 0
    
    For J = 0 To CountString(Filtre$, DelimiteurSortie$)
      
      If GroupeFiltre$ > "" And GroupeFiltre$ = TableauFiltre.s(J)
        Trouver = 1
        MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Erreur avec un groupe dans " + Chr(34) + "Filtre$" + Chr(34) + " à l'index " + Str(I) + " !" + Chr(13) +
                                                         "    Le groupe " + Chr(34) + GroupeFiltre$ + Chr(34) + " est déjà utilisé à l'index " + Str(J + 1) +
                                                         " dans " + Chr(34) + "Filtre$" + Chr(34) + " !", 64)
        End
      EndIf
      
    Next
    
    If Trouver = 0
      TableauFiltre.s(TableauFiltreIndex) = GroupeFiltre$
      TableauFiltreIndex + 1
    EndIf
    
  Next
  
  For I = 1 To CountString(Filtre$, DelimiteurSortie$) + 1
    
    GroupeFiltre$ = StringField(Filtre$, I, DelimiteurSortie$)
    
    If GroupeFiltre$ = ""
      MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Erreur avec un groupe dans " + Chr(34) + "Filtre$" + Chr(34) + " à l'index " + Str(I) + " !" + Chr(13) +
                                                       "    Un groupe dans " + Chr(34) + "Filtre$" + Chr(34) + " ne peut pas être vide !", 64)
      End
    EndIf
    
  Next
    
  If CountString(Filtre$, DelimiteurSortie$) + 1 <> Base.i
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Erreur dans " + Chr(34) + "Filtre$" + Chr(34) + " !" + Chr(13)  + Chr(13) +
                                    "    Le nombre de groupe total (Entre chaque Delimiteur) est erronné !" + Chr(13) + Chr(13) +
                                    "    Vous devez spécifier un ensemble de" + Chr(13) +
                                    "    caractères entre chaque délimiteur !" + Chr(13) + Chr(13) +
                                    "    Exemple: Base = 2, " + Chr(34) + "Filtre$" + Chr(34) +
                                    " doit être de cette forme-ci (2 Groupes):" + Chr(13) + Chr(13) +
                                    "    a.b" + Chr(13) + "    0.1" + Chr(13) + "    abc.def" + Chr(13) + Chr(13) +
                                    "    Exemple: Base = 4, " + Chr(34) + "Filtre$" + Chr(34) +
                                    " doit être de cette forme-ci (4 Groupes):" + Chr(13) + Chr(13) +
                                    "    a.b.c.d" + Chr(13) + "    0.1.2.3" + Chr(13) + "    abc.def.ghi.jkl" + Chr(13) + Chr(13) +
                                    "    Exemple: Base = 6, " + Chr(34) + "Filtre$" + Chr(34) +
                                    " doit être de cette forme-ci (6 Groupes):" + Chr(13) + Chr(13) +
                                    "    a.b.c.d.e.f" + Chr(13) + "    0.1.2.3.4.5" + Chr(13) +
                                    "    abc.def.ghi.jkl.mno.pqr"  + Chr(13) + Chr(13) + "    Il est interdit d'utiliser les mêmes groupes !", 64)
    
    End
  EndIf
  
  Sortie$ = ""

  Repeat
    
    Division.q = NombreVerifier.q / Base.i
    Reste.q = NombreVerifier.q - (Division.q * Base.i)
    
    Sortie$ + StringField(Filtre$, Reste.q + 1, DelimiteurSortie$) + DelimiteurSortie$
    
    NombreVerifier.q = Division.q
    
  Until Division.q < Base.i
  
  If Division.q > 0
    Sortie$ + StringField(Filtre$, Division.q + 1, DelimiteurSortie$)
  EndIf
  
  If InversionSortie.b = #True
    Sortie$ = InverserChaine(Sortie$, DelimiteurSortie$)
  EndIf
  
  If Mid(Sortie$, Len(Sortie$), 1) = DelimiteurSortie$
    Sortie$ = Mid(Sortie$, 1, Len(Sortie$) - 1)
  ElseIf Mid(Sortie$, 1, 1) = DelimiteurSortie$
    Sortie$ = Mid(Sortie$, 2)
  EndIf
  
  ProcedureReturn Sortie$
  
EndProcedure

Procedure DecodeBase(Instance.i, Base.i, ChaineSortie$, SeparateurChaineSortie$, Filtre$, SeparateurFiltre$ = ".")
  
  ; Sert uniquement de repèrage en cas d'erreur.
  If Instance.i <= 0
    MessageRequester("DecodeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Une instance ne peut pas être inférieure ou égale à 0 !", 64)
    End
  ElseIf Instance.i = #PB_Any
    MessageRequester("DecodeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    #PB_Any ne peut pas être utilisé pour le numéro de l'instance !" + Chr(13) +
                                    "    Vous devez vous même affecter un numéro d'instance !", 64)
    End
  EndIf
  
  If Len(SeparateurChaineSortie$) = 0
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    SeparateurChaineSortie$ doit être constituer d'au moins un caractère !", 64)
    End
  ElseIf Len(SeparateurChaineSortie$) > 1
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    SeparateurChaineSortie$ ne peut pas être supérieur à un caractère !", 64)
    End
  EndIf
  
  If Len(SeparateurFiltre$) = 0
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    SeparateurFiltre$ doit être constituer d'au moins un caractère !", 64)
    End
  ElseIf Len(SeparateurFiltre$) > 1
    MessageRequester("GenerateurDeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    SeparateurFiltre$ ne peut pas être supérieur à un caractère !", 64)
    End
  EndIf
  
  NombreSortie.Q = 0
  Chiffre$ = ""
  
  Dim TableauFiltre.s(CountString(Filtre$, SeparateurChaineSortie$))
  TableauFiltreIndex = 0
  
  For I = 1 To CountString(Filtre$, SeparateurChaineSortie$) + 1
    
    GroupeFiltre$ = StringField(Filtre$, I, SeparateurChaineSortie$)
    Trouver = 0
    
    For J = 0 To CountString(Filtre$, SeparateurChaineSortie$)
      
      If GroupeFiltre$ = TableauFiltre.s(J)
        Trouver = 1
        MessageRequester("DecodeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Erreur avec un groupe dans " + Chr(34) + "Filtre$" + Chr(34) + " à l'index " + Str(I) + " !" + Chr(13) +
                                                         "    Le groupe " + Chr(34) + GroupeFiltre$ + Chr(34) + " est déjà utilisé à l'index " + Str(J + 1) +
                                                         " dans " + Chr(34) + "Filtre$" + Chr(34) + " !", 64)
        End
      EndIf
      
    Next
    
    If Trouver = 0
      TableauFiltre.s(TableauFiltreIndex) = GroupeFiltre$
      TableauFiltreIndex + 1
    EndIf
    
  Next
  
  For I = 1 To CountString(Filtre$, DelimiteurSortie$) + 1
    
    GroupeFiltre$ = StringField(Filtre$, I, DelimiteurSortie$)
    
    If GroupeFiltre$ = ""
      MessageRequester("DecodeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Erreur avec un groupe dans " + Chr(34) + "Filtre$" + Chr(34) + " à l'index " + Str(I) + " !" + Chr(13) +
                                                       "    Un groupe dans " + Chr(34) + "Filtre$" + Chr(34) + " ne peut pas être vide !", 64)
      End
    EndIf
    
  Next
  
  If CountString(Filtre$, SeparateurChaineSortie$) + 1 <> Base.i
    MessageRequester("DecodeBase Instance n°" + Str(Instance.i) + ", ATTENTION !", "    Erreur dans " + Chr(34) + "Filtre$" + Chr(34) + " !" + Chr(13)  + Chr(13) +
                                    "    Le nombre de groupe total (Entre chaque Delimiteur) est erronné !" + Chr(13) + Chr(13) +
                                    "    Vous devez spécifier un ensemble de" + Chr(13) +
                                    "    caractères entre chaque délimiteur !" + Chr(13) + Chr(13) +
                                    "    Exemple: Base = 2, " + Chr(34) + "Filtre$" + Chr(34) +
                                    " doit être de cette forme-ci (2 Groupes):" + Chr(13) + Chr(13) +
                                    "    a.b" + Chr(13) + "    0.1" + Chr(13) + "    abc.def" + Chr(13) + Chr(13) +
                                    "    Exemple: Base = 4, " + Chr(34) + "Filtre$" + Chr(34) +
                                    " doit être de cette forme-ci (4 Groupes):" + Chr(13) + Chr(13) +
                                    "    a.b.c.d" + Chr(13) + "    0.1.2.3" + Chr(13) + "    abc.def.ghi.jkl" + Chr(13) + Chr(13) +
                                    "    Exemple: Base = 6, " + Chr(34) + "Filtre$" + Chr(34) +
                                    " doit être de cette forme-ci (6 Groupes):" + Chr(13) + Chr(13) +
                                    "    a.b.c.d.e.f" + Chr(13) + "    0.1.2.3.4.5" + Chr(13) +
                                    "    abc.def.ghi.jkl.mno.pqr"  + Chr(13) + Chr(13) + "    Il est interdit d'utiliser les mêmes groupes !", 64)
    
    End
  EndIf
  
  If ChaineSortie$ > ""
    
    For Index = 1 To CountString(ChaineSortie$, SeparateurFiltre$) + 1
      
      Chiffre$ = StringField(ChaineSortie$, Index, SeparateurFiltre$)
      
      For I = 1 To CountString(Filtre$, SeparateurChaineSortie$) + 1
        
        If StringField(Filtre$, I, SeparateurChaineSortie$) = Chiffre$
          Chiffre = I - 1
          Break
        EndIf
        
      Next
      
      NombreSortie.Q * Base.i
      NombreSortie.Q + Chiffre
      
    Next
    
    ProcedureReturn NombreSortie.Q
  Else
    
    ProcedureReturn 0
  EndIf
  
EndProcedure

NombreTest$ = "16"

; Exemple 1
Instance.i = 1
Base.i = 2
Nombre.s = NombreTest$
Filtre$ = "0.1"
ChaineSortie$ = GenererBase(Instance.i, Base.i, Nombre.s, Filtre$, ".")
Debug "Exemple 1"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + Str(DecodeBase(Instance.i,Base.i, ChaineSortie$, ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple 2
Instance.i = 2
Base.i = 4
Nombre.s = NombreTest$
Filtre$ = "1.2.3.4"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".")
Debug "Exemple 2"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + Str(DecodeBase(Instance.i,Base.i, ChaineSortie$, ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple 3
Instance.i = 3
Base.i = 5
Nombre.s = NombreTest$
Filtre$ = "A.B.C.D.E"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".")
Debug "Exemple 3"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + Str(DecodeBase(Instance.i,Base.i, ChaineSortie$, ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple 4
Instance.i = 4
Base.i = 8
Nombre.s = NombreTest$
Filtre$ = "Abc.Def.Ghi.Jkl.Mno.Pqr.Stu.Vwx"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".")
Debug "Exemple 4"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + Str(DecodeBase(Instance.i,Base.i, ChaineSortie$, ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple 5
Instance.i = 5
Base.i = 8
Nombre.s = NombreTest$
Filtre$ = "Abc.Def.Ghi.Jkl.Mno.Pqr.Stu.Vwx"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".")
Debug "Exemple 5"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + Str(DecodeBase(Instance.i,Base.i, ChaineSortie$, ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple 6
Instance.i = 6
Base.i = 10
Nombre.s = NombreTest$
Filtre$ = "0.1.2.3.4.5.6.7.8.9"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".", #True)
Debug "Exemple 6"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + StrU(DecodeBase(Instance.i,Base.i, ChaineSortie$, ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple 7
Instance.i = 7
Base.i = 16
Nombre.s = NombreTest$
Filtre$ = "HO.HA.HE.HI.BO.BA.BE.BI.KO.KA.KE.KI.DO.DA.DE.DI"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".", #True)
Debug "Exemple 7"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + StrU(DecodeBase(Instance.i,Base.i, ChaineSortie$, ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple 8
Instance.i = 8
Base.i = 16
Nombre.s = NombreTest$
Filtre$ = "0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".", #True)
Debug "Exemple 8"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + StrU(DecodeBase(Instance.i,Base.i, ChaineSortie$, ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple 9
Instance.i = 9
Base.i = 52
Nombre.s = NombreTest$
Filtre$ = "a.A.b.B.c.C.d.D.e.E.f.F.g.G.h.H.i.I.j.J.k.K.l.L.m.M.n.N.o.O.p.P.q.Q.r.R.s.S.t.T.u.U.v.V.w.W.x.X.y.Y.z.Z"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".", #False)
Debug "Exemple 9"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + StrU(DecodeBase(Instance.i,Base.i, InverserChaine(ChaineSortie$, "."), ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple 10
Instance.i = 10
Base.i = 256
Nombre.s = NombreTest$
Filtre$ = "000.001.002.003.004.005.006.007.008.009.010.011.012.013.014.015.016.017.018.019.020.021.022.023.024.025.026.027.028.029.030.031.032.033.034.035.036.037.038.039.040.041.042.043.044.045.046.047.048.049.050.051.052.053.054.055.056.057.058.059.060.061.062.063.064.065.066.067.068.069.070.071.072.073.074.075.076.077.078.079.080.081.082.083.084.085.086.087.088.089.090.091.092.093.094.095.096.097.098.099.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.167.168.169.170.171.172.173.174.175.176.177.178.179.180.181.182.183.184.185.186.187.188.189.190.191.192.193.194.195.196.197.198.199.200.201.202.203.204.205.206.207.208.209.210.211.212.213.214.215.216.217.218.219.220.221.222.223.224.225.226.227.228.229.230.231.232.233.234.235.236.237.238.239.240.241.242.243.244.245.246.247.248.249.250.251.252.253.254.255"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".", #False)
Debug "Exemple 10"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + StrU(DecodeBase(Instance.i,Base.i, InverserChaine(ChaineSortie$, "."), ".", Filtre$, "."))

Debug "------------------------------------------------------------------------------------------"

; Exemple de filtre:

; Base 16, "0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F"
; Base 16 Bibi-binaire, "HO.HA.HE.HI.BO.BA.BE.BI.KO.KA.KE.KI.DO.DA.DE.DI"
; Base 52, "a.A.b.B.c.C.d.D.e.E.f.F.g.G.h.H.i.I.j.J.k.K.l.L.m.M.n.N.o.O.p.P.q.Q.r.R.s.S.t.T.u.U.v.V.w.W.x.X.y.Y.z.Z"
; Base 256, "000.001.002.003.004.005.006.007.008.009.010.011.012.013.014.015.016.017.018.019.020.021.022.023.024.025.026.027.028.029.030.031.032.033.034.035.036.037.038.039.040.041.042.043.044.045.046.047.048.049.050.051.052.053.054.055.056.057.058.059.060.061.062.063.064.065.066.067.068.069.070.071.072.073.074.075.076.077.078.079.080.081.082.083.084.085.086.087.088.089.090.091.092.093.094.095.096.097.098.099.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.167.168.169.170.171.172.173.174.175.176.177.178.179.180.181.182.183.184.185.186.187.188.189.190.191.192.193.194.195.196.197.198.199.200.201.202.203.204.205.206.207.208.209.210.211.212.213.214.215.216.217.218.219.220.221.222.223.224.225.226.227.228.229.230.231.232.233.234.235.236.237.238.239.240.241.242.243.244.245.246.247.248.249.250.251.252.253.254.255"
Dernière modification par Shadow le dim. 28/févr./2016 0:10, modifié 7 fois.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Générateur de base

Message par Micoute »

Très bon travail Shadow, il fonctionne très bien avec la dernière version de PureBasic (x86) et (x64).

Merci pour le partage.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Générateur de base

Message par djes »

C'est très bien mais j'ai une petite remarque sur quelque chose qui n'a rien à voir avec la programmation. Voilà, tu fais des fautes de grammaire qui seraient très faciles à corriger avec un tout petit peu d'application. C'est important quand on présente un code, ça fait plus "sérieux", ça montre un certain respect pour les autres. En plus ce sont des fautes vraiment toutes bêtes.

Par exemple, le titre : "générateur de base". Pour moi, cela ne veut rien dire, surtout avec base au singulier. Première phrase "Moi qui est souvent besoin d'algorithme pour des bases" : verbe être au lieu du verbe avoir. Niveau élémentaire, tu remplaces par l'infinitif "être", et tu vois que la phrase est absurde ! Et dans le code, des tas de petites fautes d'accord : UNE base, donc tu accordes au féminin ; UN groupe, UNE chaîne...

Si tu n'es pas capable de faire attention à ce genre de détail, cela *peut* signifier que ton code non plus n'a pas été vérifié, et donc n'est pas fiable. Je ne dis pas que c'est le cas, je dis juste que pour tes productions futures, il faut que tu t'habitues à être hyper précis. Ici, c'est cool, mais ailleurs, cela pourrait te porter préjudice.

Allez, sans rancune ; c'est un bon code, merci pour le partage et tes efforts :)
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Générateur de base

Message par cage »

Bonjour,

Pour les utilisateurs de Firefox, voici une astuce qui peut aider.
Ouvrir les Options de Firefox puis cliquer sur Avancé
Cocher la case Vérifier l'orthographe lors de la frappe
Image
Puis rendez vous sur la page :
https://support.mozilla.org/fr/kb/param ... =inproduct
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Générateur de base

Message par Shadow »

Bonjour,

@djes, je prends note merci à toi :)

C'est vraie que je poste très souvent à la va vite et que seul le renard de feu corriges mes fautes à se moment là !
Comme tu dis aussi, ici, c'est cool mais... préjudice ici quand même !

Ce code n'est pas superbe ni très bon, bon peut être et encore.
Je fais des tas de fautes bien que je me soie un peu amélioré, j'en fais encore pas mal.

Merci de t'es encouragement ça fais bien plaisir tu sais ;)
Je ne suis pas satisfais à 100% de se code.

@cage, le renard de feu corriges mes fautes déjà mais je t'en remercie :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Générateur de base

Message par falsam »

Mon code proposé étant faux je l'ai retiré.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Générateur de base

Message par Ar-S »

Shadow déjà ça fait plaisir de te voir sortir un code fonctionnel. Du coté des fautes je crois surtout que tu es un grand impatient et que tu ne te relis pas forcément beaucoup. C'est dommage.
ex : le renard de feu corriges mes fautes à se moment là
- Pourquoi mettre un s à corrige ?
- se moment / ce moment => Pour ne pas te tromper, l'astuce consiste (dans ta tête) à remplacer ce par "celui-ci". Si ça marche c'est que c'est CE. Imagine que tu puisses le montrer du doigt.

J'aime ce code (j'ai celui ci là ! ici ! tu vois je le montre lààà :) )
Il faut se coucher (il faut celui-ci coucher ça veut rien dire .. => donc se et pas ce)

Le cours est terminé ;)

Poursuis dans tes efforts ça fait plaisir. Et prends ton temps quand tu postes un sujet.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Générateur de base

Message par Shadow »

Ar-S a écrit :Shadow déjà ça fait plaisir de te voir sortir un code fonctionnel. Du coté des fautes je crois surtout que tu es un grand impatient et que tu ne te relis pas forcément beaucoup. C'est dommage.
ex : le renard de feu corriges mes fautes à se moment là
- Pourquoi mettre un s à corrige ?
- se moment / ce moment => Pour ne pas te tromper, l'astuce consiste (dans ta tête) à remplacer ce par "celui-ci". Si ça marche c'est que c'est CE. Imagine que tu puisses le montrer du doigt.

J'aime ce code (j'ai celui ci là ! ici ! tu vois je le montre lààà :) )
Il faut se coucher (il faut celui-ci coucher ça veut rien dire .. => donc se et pas ce)

Le cours est terminé ;)

Poursuis dans tes efforts ça fait plaisir. Et prends ton temps quand tu postes un sujet.
Merci.

- Pourquoi mettre un s à corrige ?
Parce que le renard de feu corriges (Plusieurs fois) mes fautes à se moment là !
Faut pas trop m'en demander non plus lol.

Ont est pas là (Car ont peut dire "ici") pour faire un court de grammaire, les prof ont essayé (Car ont peut dire vendus)
il se sont cassés (Car ont peut dire vendus) toutes leurs dents !

Je ne dis pas ça (Car ont peu dire "ceci") pour toi Ar-s mais pour ne pas polémiquer...
Moi ont m'as dis:

Si tu peut mettre "Ceci", c'est "Ce", sinon c'est "Se", ex:

Se chien = Ok, Ce chien = Non
Se serait bien = Non, Ce serait bien = Ok
Il se dit = Ok, Il ce dit = Non
Et ça se pourrait bien = Ok, Et ça ce pourrait bien = Non
Se vêtement = Ok, Ce vêtement = Non

Mais je dois avoir tous faux j'imagine !
Car:

Se chien (Je peut le montrer du doigt) donc "Ce chien" ?
Se serait bien (Ici non, donc c'est bien "Ce")
Il se dit (Pareil ici !)
Et ça se pourrait bien (Ont ne change pas une équipe qui gagne !)
Se vêtement (Je peut le montrer du doigt) donc "Ce vêtement" ?

Bha voilà du coup j'ai polémiquer, c'est malin ça !
Bref.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Générateur de base

Message par Ar-S »

N'empêche que ça marche :)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Générateur de base

Message par Shadow »

Je poste le code optimisé et revue.
Code modifié (En haut).
Merci à Gally-HC.

Par contre je suis bloquer à 9223372036854775807, je ne sais pas comment aller jusque 18446744073709551615 :?
J'ai bien essayé pourtant mais en vain !

Si quelqu'un sais comment faire :)
Dernière modification par Shadow le sam. 27/févr./2016 20:53, modifié 2 fois.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Générateur de base

Message par Shadow »

Merci Dobro :)

Moi je peux générer n'importe quel base avec n'importe quel filtre de sortie !
C'est là ou deviens intéressant le code :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Générateur de base

Message par falsam »

Ton exemple 5 ne fonctionne pas Shadow.
La chaine que tu reconstitues n'est pas égale à l'originale.
Exemple 5
Nombre original = 9223372036854775807
Codé en base -> 256
Filtre de génération = 000.001.002.003.004.005.006.007.008.009.010.011.012.013.014.015.016.017.018.019.020.021.022.023.024.025.026.027.028.029.030.031.032.033.034.035.036.037.038.039.040.041.042.043.044.045.046.047.048.049.050.051.052.053.054.055.056.057.058.059.060.061.062.063.064.065.066.067.068.069.070.071.072.073.074.075.076.077.078.079.080.081.082.083.084.085.086.087.088.089.090.091.092.093.094.095.096.097.098.099.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.167.168.169.170.171.172.173.174.175.176.177.178.179.180.181.182.183.184.185.186.187.188.189.190.191.192.193.194.195.196.197.198.199.200.201.202.203.204.205.206.207.208.209.210.211.212.213.214.215.216.217.218.219.220.221.222.223.224.225.226.227.228.229.230.231.232.233.234.235.236.237.238.239.240.241.242.243.244.245.246.247.248.249.250.251.252.253.254.255
Chaine généré = 255.255.255.255.255.255.255.127
Chaine décodé = 18446744073709551615
------------------------------------------------------------------------------------------
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Générateur de base

Message par falsam »

Je pense que la conversion héxadécimale ne fonctionne pas non plus

Code : Tout sélectionner

instance.i=1
Base.i = 16
Nombre.s = "2000"
Filtre$ = "0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F"
ChaineSortie$ = GenererBase(Instance.i,Base.i, Nombre.s, Filtre$, ".", #False)
Debug "Exemple Hexadecimal"
Debug "Nombre original = " + Nombre.s
Debug "Codé en base -> " + Str(Base.i)
Debug "Filtre de génération = " + Filtre$
Debug "Chaine généré = " + ChaineSortie$
Debug "Chaine décodé = " + StrU(DecodeBase(Instance, Base, InverserChaine(ChaineSortie$, "."), ".", Filtre$, "."))
Ton résultat
Exemple Hexadecimal
Nombre original = 2000
Codé en base -> 16
Filtre de génération = 0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F
Chaine généré = 0.D.7
Chaine décodé = 2000
2000 en hexadécimale donne 7D0 et pas 0D7

PS : Faudrait expliquer à quoi sert l'instance.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Générateur de base

Message par Shadow »

Chez moi en PB 5.41 LTS x 64 fonctionne très bien !
Code mis à jour: Ajout d'un exemple base 16, c'est tout !

Edit: Premier code (Tous en haut) mis a jour.
Maintenant le code s'adapte à votre version de PB, 86 ou 64.

Instance sert à te repérer dans ton code.
Par exemple si tu as plusieurs appel dans le code.

Merci Falsam.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Générateur de base

Message par falsam »

Ton code est prêt pour de la conversion système Bibi-binaire

2000 en héxa devient 7D0 puis en Bibi-binaire devient BIDAHO. Je trouve ça jolie.

Ref : https://fr.wikipedia.org/wiki/Syst%C3%A8me_Bibi-binaire
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre