14 from __future__
import print_function
17 VERSION =
'baset --- 2010 March 16'
38 """Abre binaire de base b :
39 arbre binaire donc chaque noeud peut contenir un naturel < base.
40 Les feulles de l'arbre binaire ne sont jamais nuls.
41 Les indices parcourent l'arbre binaire comme suit :
49 """Crée un Baset liée à la base b et l'initialise avec n
50 Si n est un string il représente la valeur de n en base b
52 Pre: n: naturel ou string ne contenant que des chiffres < b <= 36
61 self.
n = (nbsystem.str_to(n, b)
if isinstance(n, str)
69 """Renvoie l'élément d'indice key
71 Pre: key: naturel ou slice
73 Result: naturel < self.b
79 return nbsystem.fig(self.
n, key, self.
b)
84 for i
in range(key.start, key.stop):
88 for i
in range(key.start, key.stop, key.step):
96 """Renvoie le nombre d'éléments
111 """Renvoie un string quoté 'Baset(n, b)'
116 return (
"'Baset({0})'".format(self.
n)
if self.
b == 2
117 else "'Baset({0}, b={1})'".format(self.
n, self.
b))
122 """Modifie l'élément d'indice key par value
125 value: naturel < self.b
127 O(key, value) = ..."""
130 assert value < self.
b, (value, self.
b)
137 self.
n = q*(p*self.
b) + (value*p + r)
142 """Renvoie True si l'élément d'indice key est une feuille
143 (càd que l'élément est non nul et qu'il ne possède pas de fils),
153 return (self[key] != 0)
and ((self.
subtree(key)
if key > 0
159 """Renvoie le nombre d'éléments non nul
175 """Renvoie True si l'élément d'indice key est un noeud
176 (càd qu'il est non nul, ou nul mais avec une descendance non nulle),
186 return (self[key] != 0)
or ((self.
subtree(key)
if key > 0
192 """Renvoie True si tous les noeuds internes de l'arbre sont nuls
193 (càd si que pour chaque feuille ces ancêtres sont nuls),
200 for k
in range(len(self)):
208 """Renvoie True si l'élément d'indice key est un noeud dont tous les ancêtre sont nuls,
221 while (key > 0)
and (self[key] == 0):
223 return self[key] == 0
233 """Renvoie True si l'élément d'indice key est une feuille dont tous les ancêtre sont nuls,
263 """Renvoi le sous-arbre dont la racine est l'élément d'indice key
276 n = self.
n // self.
b**key
278 c = self[key:key + nb]
293 if __name__ ==
'__main__':
300 debug.test_begin(VERSION, __debug__)
302 print(
'Baset()...', end=
''); sys.stdout.flush()
304 assert t.n == 0, (t.n, t.b)
305 assert t.b == 2, (t.n, t.b)
308 assert t.n == 0, (t.n, t.b)
309 assert t.b == 10, (t.n, t.b)
311 t =
Baset(n=123, b=10)
312 assert t.n == 123, (t.n, t.b)
313 assert t.b == 10, (t.n, t.b)
316 assert t.n == 11, (t.n, t.b)
317 assert t.b == 2, (t.n, t.b)
319 t =
Baset(n=
'123', b=10)
320 assert t.n == 123, (t.n, t.b)
321 assert t.b == 10, (t.n, t.b)
322 print(
'ok'); sys.stdout.flush()
325 print(
'Baset.__getitem__()...', end=
''); sys.stdout.flush()
328 assert t[i] == 0, (i, t[i], t)
332 assert t[i] == 0, (i, t[i], t)
334 t =
Baset(
'543210', b=10)
336 assert t[i:i+2] == nbsystem.str_to(
'012345'[i + 1] +
'012345'[i], b=10), \
337 (t, i, t[i:i+2], nbsystem.str_to(
'012345'[i + 1] +
'012345'[i], b=10))
339 for b
in range(2, 37):
340 t =
Baset(
'1'*100, b=b)
341 for i
in range(1, 100):
342 assert t[i] == 1, (b, i, t[i], t)
344 for b
in range(2, 37):
346 c = nbsystem.fig_to_chr(k)
348 for i
in range(1, 50
if debug.assertspeed >= debug.ASSERT_NORMAL
else 5):
349 assert t[i] == nbsystem.chr_to_fig(c), \
350 (b, k, c, nbsystem.chr_to_fig(c), i, t[i], t)
351 assert t[50] == 0, (b, k, t[50], t)
353 if debug.assertspeed < debug.ASSERT_NORMAL:
354 print(debug.assertspeed_str(), end=
'')
355 print(
'ok'); sys.stdout.flush()
358 print(
'Baset.__len__()...', end=
''); sys.stdout.flush()
360 assert len(t) == 0, (len(t), t)
363 assert len(t) == 100, (len(t), t)
366 assert len(t) == 0, (len(t), t)
369 assert len(t) == 98, (len(t), t)
371 print(
'ok'); sys.stdout.flush()
374 print(
'Baset.__repr__()...', end=
''); sys.stdout.flush()
375 t =
Baset(n=
'123', b=10)
376 assert repr(t) ==
"'Baset({0}, b={1})'".format(t.n, t.b), (repr(t), t)
378 print(
'ok'); sys.stdout.flush()
381 print(
'Baset.__setitem__()...', end=
''); sys.stdout.flush()
386 assert t[i] == i%2, (i, t[i], t)
393 assert t[i] == i%10, (i, t[i], t)
396 for i
in range(100,0,-1):
398 for i
in range(100,0,-1):
399 assert t[i] == i%10, (i, t[i], t)
401 print(
'ok'); sys.stdout.flush()
404 print(
'Baset.leaf_is()...', end=
''); sys.stdout.flush()
407 assert not t.leaf_is(k), (k, t[k])
409 t =
Baset(
'9876543010', 10)
410 assert not t.leaf_is(0), t[0]
411 assert not t.leaf_is(1), t[1]
412 assert not t.leaf_is(2), t[2]
413 assert not t.leaf_is(3), t[3]
414 assert not t.leaf_is(4), t[4]
415 assert t.leaf_is(5), t[5]
416 assert t.leaf_is(6), t[6]
417 assert t.leaf_is(7), t[7]
418 assert t.leaf_is(8), t[8]
419 assert t.leaf_is(9), t[9]
420 for k
in range(10, 100):
421 assert not t.leaf_is(k), (k, t[k])
423 t =
Baset(
'9876543210', 10)
424 assert not t.leaf_is(0), t[0]
425 assert not t.leaf_is(1), t[1]
426 assert not t.leaf_is(2), t[2]
427 assert not t.leaf_is(3), t[3]
428 assert not t.leaf_is(4), t[4]
429 assert t.leaf_is(5), t[5]
430 assert t.leaf_is(6), t[6]
431 assert t.leaf_is(7), t[7]
432 assert t.leaf_is(8), t[8]
433 assert t.leaf_is(9), t[9]
434 for k
in range(10, 100):
435 assert not t.leaf_is(k), (k, t[k])
437 print(
'ok'); sys.stdout.flush()
440 print(
'Baset.nb_not0()...', end=
''); sys.stdout.flush()
442 assert t.nb_not0() == 0, (t.nb_not0(), t)
445 assert t.nb_not0() == 50, (t.nb_not0(), t)
448 assert t.nb_not0() == 0, (t.nb_not0(), t)
451 assert t.nb_not0() == 49, (t.nb_not0(), t)
453 print(
'ok'); sys.stdout.flush()
456 print(
'Baset.node_is()...', end=
''); sys.stdout.flush()
459 assert not t.node_is(k), (k, t[k])
461 t =
Baset(
'9876543210', 10)
463 assert t.node_is(k), (k, t[k])
464 for k
in range(10, 100):
465 assert not t.node_is(k), (k, t[k])
467 t =
Baset(
'9876543010', 10)
469 assert t.node_is(k), (k, t[k])
470 for k
in range(10, 100):
471 assert not t.node_is(k), (k, t[k])
473 print(
'ok'); sys.stdout.flush()
476 print(
'Baset.normal_is()...', end=
''); sys.stdout.flush()
493 print(
'ok'); sys.stdout.flush()
496 print(
'Baset.orphan_is()...', end=
''); sys.stdout.flush()
499 assert not t.orphan_is(k), (k, t[k])
501 t =
Baset(
'9876543210', 10)
502 assert t.orphan_is(0), t[0]
503 assert t.orphan_is(1), t[1]
504 assert t.orphan_is(2), t[2]
505 for k
in range(3, 100):
506 assert not t.orphan_is(k), (k, t[k])
508 t =
Baset(
'9876543010', 10)
509 assert t.orphan_is(0), t[0]
510 assert t.orphan_is(1), t[1]
511 assert t.orphan_is(2), t[2]
512 assert not t.orphan_is(3), t[3]
513 assert not t.orphan_is(4), t[4]
514 assert t.orphan_is(5), t[5]
515 assert t.orphan_is(6), t[6]
516 for k
in range(7, 100):
517 assert not t.orphan_is(k), (k, t[k])
519 print(
'ok'); sys.stdout.flush()
522 print(
'Baset.orphanleaf_is()...', end=
''); sys.stdout.flush()
525 assert not t.orphanleaf_is(k), (k, t[k])
527 t =
Baset(
'9876543210', 10)
529 assert not t.orphanleaf_is(k), (k, t[k])
531 t =
Baset(
'9876543010', 10)
532 assert not t.orphanleaf_is(0), t[0]
533 assert not t.orphanleaf_is(1), t[1]
534 assert not t.orphanleaf_is(2), t[2]
535 assert not t.orphanleaf_is(3), t[3]
536 assert not t.orphanleaf_is(4), t[4]
537 assert t.orphanleaf_is(5), t[5]
538 assert t.orphanleaf_is(6), t[6]
539 for k
in range(7, 100):
540 assert not t.orphanleaf_is(k), (k, t[k])
542 print(
'ok'); sys.stdout.flush()
545 print(
'Baset.print_tree()...', end=
''); sys.stdout.flush()
552 print(
'ok'); sys.stdout.flush()
555 print(
'Baset.subtree()...', end=
''); sys.stdout.flush()
556 for b
in range(2, 37):
558 t =
Baset(
'9876543210', b)
559 assert t.subtree(k).b == b, (k, t.subtree(k).b, b)
560 t =
Baset(
'9876543210', 10)
561 assert t.subtree(0).n == t.n, t.subtree(0).n
562 assert t.subtree(1).n == 987431, t.subtree(1).n
563 assert t.subtree(2).n == 652, t.subtree(2).n
564 assert t.subtree(3).n == 873, t.subtree(3).n
565 assert t.subtree(4).n == 94, t.subtree(4).n
566 assert t.subtree(5).n == 5, t.subtree(5).n
567 assert t.subtree(9).n == 9, t.subtree(9).n
568 assert t.subtree(10).n == 0, t.subtree(10).n
570 print(
'ok'); sys.stdout.flush()