Base 8 sans 0 et 1

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Base 8 sans 0 et 1

Message par Lord Nelson »

Salut,

Je souhaiterais faire une base 8 sans 0 et sans 1 pour mes recherches.
J'ai fais ceci mais bien trop lent et en plus c'est pas correcte :(

Le nombre ne dois JAMAIS contenir de 0 ni de 1.
Pouvez vous svp m'aider :)

Code : Tout sélectionner

Procedure.Q NombreBase8(Nombre.Q)
  
  While FindString(Str(Nombre.Q), "0", 1) Or FindString(Str(Nombre.Q), "1", 1)
    Nombre.Q + 1
  Wend
  
  ProcedureReturn Nombre.Q
  
EndProcedure

Nombre.Q = 10201014
Debug NombreBase8(Nombre.Q)
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Base 8 sans 0 et 1

Message par TazNormand »

Ecoutes, après le binaire à ta sauce, maintenant tu veux te coller à l'octal, t'en as pas marre de te prendre le chou sans arrêt.

Je sais pas où tu veux en venir, mais je n'ai pas l'impression que tu prends le bon chemin.

C'est quoi la finalité de toutes tes questions sur les systèmes numériques ?
Image
Image
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Base 8 sans 0 et 1

Message par Lord Nelson »

Salut, je suis en recherche, en recherche de créer un système permettant de compresser une image le plus possible avec une perte = à 0
et pourquoi pas si le système le permet de porter ça sur des fichiers...

Bref, je recherche, j'expérimente, voilà pourquoi tant de questions !

Il ne sert à rien de me dire que ça marchera pas, je dois faire mes propre essaie pour comprendre
et me confronter à la réalité des choses et d'ailleurs, j'en est souvent fais l’expérience !

Quand vous dite à un enfant de pas faire quelque chose, que va t-il faire ?
Bha il le fera quand même car il dois apprendre de ses erreurs !

Moi c'est exactement pareil, en plus c'est très bénéfique pour moi car j'apprends en même temps
Maintenant vous pouvez bien dire se que vous voulez :)

Alors je cherche, je cherche, quand j'échoue, je cherche encore et encore.
C'est mon passe temps du moment voilà tous !

C'est mon choix :wink:

Se serra pas toujours ainsi, mais c'est pour le moment le cas :)
Je remercie les gents qui voudront bien m'aider.

Et puis en plus ça pourra toujours servir à quelqu'un d'autre :)
Cordialement.

Voilà ou j'en suis:

Code : Tout sélectionner

Procedure.Q NombreBase8(Nombre.Q)
  
  NombreBase.Q = Nombre.Q
  NombreSortie.Q = 0
  
  For I = 0 To NombreBase.Q
    
    Repeat 
      If FindString(Str(NombreSortie.Q), "0", 1) > 0 Or FindString(Str(NombreSortie.Q), "1", 1) > 0
        While FindString(Str(NombreSortie.Q), "0", 1) > 0 Or FindString(Str(NombreSortie.Q), "1", 1) > 0
          NombreSortie.Q + 1
        Wend 
      Else
        NombreSortie.Q + 1
      EndIf
    Until FindString(Str(NombreSortie.Q), "0", 1) = 0 And FindString(Str(NombreSortie.Q), "1", 1) = 0
    
  Next
  
  ProcedureReturn NombreSortie.Q
  
EndProcedure

For Nombre.Q = 0 To 200
  Debug Str(Nombre.Q) + " = " + Str(NombreBase8(Nombre.Q))
Next
Mais se système est bien trop lent sur de grand et très grand nombre :(
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Base 8 sans 0 et 1

Message par djes »

Pour bien chercher, il faut d'abord se constituer une solide base sur l'étendue des connaissances actuelles. Il y a d'excellents bouquins sur l'histoire des mathématiques, ce que sont les bases, la notion de rang, de retenue, etc. Au-delà de ça, les algos de compression sont nombreux, et leurs limites théoriques également bien définies (mathématiquement !). Je crois qu'on t'a déjà conseillé de voir du côté de Huffman et consors, fais-le vraiment, essaye de comprendre, tu verras, c'est passionnant !

Sinon, voici un petit code qui effectue l'opération de base la plus connue, l'incrémentation, sur un nombre défini par un ensemble quelconque de caractères qui se suivent dans la table des caractères, ici des chiffres de 2 à 9, soit une base de 8 chiffres.

Code : Tout sélectionner

EnableExplicit

Global Ensemble.s
Global Base.i

Ensemble.s = "23456789"
Base.i = Len(Ensemble)

Procedure.s CheckValidity(Nombre.s)
  
  Define Longueur.i
  Define Rang.i
  Define Chiffre.i
  
  Longueur = Len(Nombre)
  For Rang = 0 To Longueur - 1
    Chiffre = Asc(Mid(Nombre, Longueur - Rang, 1)) - Asc(Mid(Ensemble, 1, 1))
    If Chiffre < 0 Or Chiffre >= Base
      ProcedureReturn "NaN"
    EndIf
  Next Rang
  ProcedureReturn ""
  
EndProcedure

Procedure.s Inc8(Nombre.s)
  
  Define Longueur.i
  Define Rang.i
  Define Resultat.s
  Define Retenue.i
  Define Chiffre.i
  
  Resultat = CheckValidity(Nombre) 
  If Resultat <> ""  
    ProcedureReturn Resultat
  EndIf 

  Longueur = Len(Nombre)
  Resultat = ""
  Retenue  = 1
  
  For Rang = 0 To Longueur - 1
    Chiffre = Asc(Mid(Nombre, Longueur - Rang, 1)) - Asc(Mid(Ensemble, 1, 1)) + 1
    Chiffre = Chiffre + Retenue
    Retenue = 0
    If Chiffre > Base
      Chiffre - Base
      Retenue + 1
    EndIf
    Resultat + Mid(Ensemble, Chiffre, 1)  
  Next Rang 
  
  If Retenue <> 0
    Resultat + Mid(Ensemble, Chiffre + 1, 1)  
  EndIf
    
  ProcedureReturn ReverseString(Resultat)
  
EndProcedure 

Debug Inc8("299999")
Edit: Un p'tit bug
Dernière modification par djes le jeu. 23/oct./2014 14:44, modifié 1 fois.
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Base 8 sans 0 et 1

Message par Lord Nelson »

Bonjour djes

Tout d'abord, merci beaucoup pour ton code :)
Par contre je rencontre un problème...

Il renvoie Nan si il trouve rien, sauf que moi faut qu'il me renvoie systématiquement un nombre !
Exemple si j'entre:

0, il dois me renvoyer 2
1, il dois me renvoyer 3

8, il dois me renvoyer 22
9, il dois me renvoyer 23
10, il dois me renvoyer 24
11, il dois me renvoyer 25
...

Tien, voici une petite liste:
0 = 2
1 = 3
2 = 4
3 = 5
4 = 6
5 = 7
6 = 8
7 = 9
8 = 22
9 = 23
10 = 24
11 = 25
12 = 26
13 = 27
14 = 28
15 = 29
16 = 32
17 = 33
18 = 34
19 = 35
20 = 36
21 = 37
22 = 38
23 = 39
24 = 42
25 = 43
26 = 44
27 = 45
28 = 46
29 = 47
30 = 48
31 = 49
32 = 52
33 = 53
34 = 54
35 = 55
36 = 56
37 = 57
38 = 58
39 = 59
40 = 62
41 = 63
42 = 64
43 = 65
44 = 66
45 = 67
46 = 68
47 = 69
48 = 72
49 = 73
50 = 74
51 = 75
52 = 76
53 = 77
54 = 78
55 = 79
56 = 82
57 = 83
58 = 84
59 = 85
60 = 86
61 = 87
62 = 88
63 = 89
64 = 92
65 = 93
66 = 94
67 = 95
68 = 96
69 = 97
70 = 98
71 = 99
72 = 222
73 = 223
74 = 224
75 = 225
76 = 226
77 = 227
78 = 228
79 = 229
80 = 232
81 = 233
82 = 234
83 = 235
84 = 236
85 = 237
86 = 238
87 = 239
88 = 242
89 = 243
90 = 244
91 = 245
92 = 246
93 = 247
94 = 248
95 = 249
96 = 252
97 = 253
98 = 254
99 = 255
100 = 256
101 = 257
102 = 258
103 = 259
104 = 262
105 = 263
106 = 264
107 = 265
108 = 266
109 = 267
110 = 268
111 = 269
112 = 272
113 = 273
114 = 274
115 = 275
116 = 276
117 = 277
118 = 278
119 = 279
120 = 282
121 = 283
122 = 284
123 = 285
124 = 286
125 = 287
126 = 288
127 = 289
128 = 292
129 = 293
130 = 294
131 = 295
132 = 296
133 = 297
134 = 298
135 = 299
136 = 322
137 = 323
138 = 324
139 = 325
140 = 326
141 = 327
142 = 328
143 = 329
144 = 332
145 = 333
146 = 334
147 = 335
148 = 336
149 = 337
150 = 338
151 = 339
152 = 342
153 = 343
154 = 344
155 = 345
156 = 346
157 = 347
158 = 348
159 = 349
160 = 352
161 = 353
162 = 354
163 = 355
164 = 356
165 = 357
166 = 358
167 = 359
168 = 362
169 = 363
170 = 364
171 = 365
172 = 366
173 = 367
174 = 368
175 = 369
176 = 372
177 = 373
178 = 374
179 = 375
180 = 376
181 = 377
182 = 378
183 = 379
184 = 382
185 = 383
186 = 384
187 = 385
188 = 386
189 = 387
190 = 388
191 = 389
192 = 392
193 = 393
194 = 394
195 = 395
196 = 396
197 = 397
198 = 398
199 = 399
200 = 422
201 = 423
202 = 424
203 = 425
204 = 426
205 = 427
206 = 428
207 = 429
208 = 432
209 = 433
210 = 434
211 = 435
212 = 436
213 = 437
214 = 438
215 = 439
216 = 442
217 = 443
218 = 444
219 = 445
220 = 446
221 = 447
222 = 448
223 = 449
224 = 452
225 = 453
226 = 454
227 = 455
228 = 456
229 = 457
230 = 458
231 = 459
232 = 462
233 = 463
234 = 464
235 = 465
236 = 466
237 = 467
238 = 468
239 = 469
240 = 472
241 = 473
242 = 474
243 = 475
244 = 476
245 = 477
246 = 478
247 = 479
248 = 482
249 = 483
250 = 484
251 = 485
252 = 486
253 = 487
254 = 488
255 = 489
Pour Huffman et consors je vais voir ça merci :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Base 8 sans 0 et 1

Message par djes »

Tu t'es trompé dans ta liste je crois...
Avatar de l’utilisateur
MetalOS
Messages : 1510
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Base 8 sans 0 et 1

Message par MetalOS »

Lord Nelson, le fou du binaire :-D
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Base 8 sans 0 et 1

Message par Lord Nelson »

Tu t'es trompé dans ta liste je crois...
Ah, t'es sûr :?
ça m'as l'air correcte pourtant !
Lord Nelson, le fou du binaire :-D
Ouais j'avoue, c'est temps-ci ça deviens une obsession :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Base 8 sans 0 et 1

Message par djes »

Lord Nelson a écrit :
Tu t'es trompé dans ta liste je crois...
Ah, t'es sûr :?
ça m'as l'air correcte pourtant !
Oui, je suis sûr. 8)
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Base 8 sans 0 et 1

Message par Lord Nelson »

Et bien prouve moi que je me soit trompé, ou me suis-je trompé ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Base 8 sans 0 et 1

Message par djes »

Lord Nelson a écrit :Et bien prouve moi que je me soit trompé, ou me suis-je trompé ?
Avec le code que je t'ai fait, il suffit de refaire la liste pour s'en rendre compte :)
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Base 8 sans 0 et 1

Message par Lord Nelson »

Ta liste est fausse je pense malheureusement (Enfin ça reste à prouvé bien sûr :) )
Ou alors elle affiche pas tous les résultat !

Ok bon bha je vais regarder ça de plus prêt !
Mais ton code affiche pas tous les résultat !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Base 8 sans 0 et 1

Message par djes »

J'avais modifié le code hier, peut-être as-tu testé l'ancienne version. Le revoici, avec aussi la procédure qui permet de convertir dans la base "Lord Nelson".

Code : Tout sélectionner

;by djes for Lord Nelson
;http://www.purebasic.fr/french/posting.php?mode=reply&f=1&t=14858
EnableExplicit

Global Ensemble.s
Global Base.i

Ensemble.s = "23456789"
Base.i = Len(Ensemble)

Procedure.s CheckValidity(Nombre.s)
  
  Define Longueur.i
  Define Rang.i
  Define Chiffre.i
  
  Longueur = Len(Nombre)
  For Rang = 0 To Longueur - 1
    Chiffre = Asc(Mid(Nombre, Longueur - Rang, 1)) - Asc(Mid(Ensemble, 1, 1))
    If Chiffre < 0 Or Chiffre >= Base
      ProcedureReturn "NaN"
    EndIf
  Next Rang
  ProcedureReturn ""
  
EndProcedure

Procedure.s MyInc(Nombre.s)
  
  Define Longueur.i
  Define Rang.i
  Define Resultat.s
  Define Retenue.i
  Define Chiffre.i
  
  Resultat = CheckValidity(Nombre) 
  If Resultat <> ""  
    ProcedureReturn Resultat
  EndIf 
  
  Longueur = Len(Nombre)
  Resultat = ""
  Retenue  = 1
  
  For Rang = 0 To Longueur - 1
    Chiffre = Asc(Mid(Nombre, Longueur - Rang, 1)) - Asc(Mid(Ensemble, 1, 1)) + 1
    Chiffre = Chiffre + Retenue
    Retenue = 0
    If Chiffre > Base
      Chiffre - Base
      Retenue + 1
    EndIf
    Resultat + Mid(Ensemble, Chiffre, 1)  
  Next Rang 
  
  If Retenue <> 0
    Resultat + Mid(Ensemble, Chiffre + 1, 1)  
  EndIf
  
  ProcedureReturn ReverseString(Resultat)
  
EndProcedure 

Procedure.s MyConverter(Nombre.i)
  
  Define Reste.i
  Define Resultat.s
  Define Rang.i
  Define Chiffre.i
  
  Reste = Nombre
  Rang = 0
  
  While Reste >= Base
    
    Reste / Base
    Rang + 1
    
  Wend
   
  While Rang >= 0
    
    Chiffre = Nombre / Int(Pow(Base, Rang))
    Nombre - (Chiffre * Int(Pow(Base, Rang)))
    
    Resultat + Mid(Ensemble, Chiffre + 1, 1)      
    
    Rang - 1
        
  Wend
  
  ProcedureReturn Resultat
  
EndProcedure

Define n.s
Define i.i

n = "2"
For i = 0 To 255
  Debug "Org nb : " + i
  Debug " C> " + MyConverter(i)
  Debug " I> " + n
  Debug "---------------------"
  n = MyInc(n)
Next
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Base 8 sans 0 et 1

Message par Lord Nelson »

Ah oui j'avais pas vue :lol:
Cependant j'ai toujours raison :wink:

Tu passe de 9 à 32 alors que moi de 9 à 22
donc tu rate pas mal de chose :wink:

Sinon super code merci :D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Base 8 sans 0 et 1

Message par djes »

Lord Nelson a écrit :Ah oui j'avais pas vue :lol:
Cependant j'ai toujours raison :wink:

Tu passe de 9 à 32 alors que moi de 9 à 22
donc tu rate pas mal de chose :wink:

Sinon super code merci :D
Ahem ! Dis-moi, si 2 = 0, 22 = ?
Répondre