Aller au contenu

Modélisation en binaire d'une représentation

⏰ : une série de trois exercices utiles et très simples à faire en quelques minutes.

Représentations de Zeckendorf

À un entier positif n, on peut associer un tableau de bits qui indique si le nombre de Fibonacci est présent dans la somme issue du théorème de Zeckendorf.

Exemple : 100=3+8+89

🐍 Script Python
# Nombres de Fibonacci          1  2  3  5  8 13 21 34 55 89 (144 ...
assert zeckendorf_repr(100) == [0, 0, 1, 0, 1, 0, 0, 0, 0, 1]

Cette représentation de Zeckendorf de 100 est 3+8+89,

  • ou sous forme de tableau de bits [0, 0, 1, 0, 1, 0, 0, 0, 0, 1]

Il en existe d'autres, comme 100=1+2+8+34+55

  • ou sous forme de tableau de bits [1, 1, 0, 0, 1, 0, 0, 1, 1]

Le cadre

On souhaite compresser une représentation sous la forme d'un unique entier dont la représentation binaire est le tableau de bits renversée.

Exemples
  • le tableau [0, 0, 1, 0, 1, 0, 0, 0, 0, 1] correspond à l'entier '0b1000010100' qui vaut 4+16+512=532
  • le tableau [1, 1, 0, 0, 1, 0, 0, 1, 1] correspond à l'entier '0b110010011' qui vaut 1+2+16+128+256=403

L'objectif étant d'obtenir un représentant immuable compressé pour chaque représentation. Le choix du binaire est naturel.

On souhaite également la fonction réciproque.

On souhaite aussi une fonction qui renvoie une chaine de caractères associée à une représentation de Zeckendorf.

Exemples
  • # Nb Fib 1 2 3 5 8 13 21 34 55 89 ...
  • tableau = [0, 0, 1, 0, 1, 0, 0, 0, 0, 1] correspond à la chaine "3 + 8 + 89"
  • tableau = [1, 1, 0, 0, 1, 0, 0, 1, 1] correspond à la chaine "1 + 2 + 8 + 34 + 55"

Exercice 1

Coder une fonction zeckendorf_bin qui prend en paramètre un tableau de bits et qui renvoie l'entier dont l'écriture binaire correspond au tableau renversé.

Contraintes
  • La longueur de la liste bits est inférieure à 104.
  • Fonction récursive interdite
  • Modules math et functools interdits
  • Code source limité à 2000 caractères

👍 La fonction acceptera les représentations minimale, maximale ou toute autre valide.

Aide

C'est très simple, il n'y a pas à construire les nombres de Fibonacci. Uniquement les puissances de deux.

On peut faire une boucle sans indice et construire la nouvelle puissance_deux en fonction de la précédente.

Guide
🐍 Script Python
def zeckendorf_bin(bits):
    """
    Renvoie l'entier en binaire associé à
        la représentation de Zeckendorf donnée avec le tableau bits
    """
    somme = ...
    puissance_deux = ...
    for b in bits:
        if ...:
            somme = ...
        puissance_deux = ...
    return somme
def zeckendorf_bin(bits):
"""
Renvoie l'entier en binaire associé à
la représentation de Zeckendorf donnée avec le tableau bits
"""
...
# Tests
bits = [0, 0, 1, 0, 1, 0, 0, 0, 0, 1] # ← À modifier pour vos tests
print(f"???> zeckendorf_bin({bits}) -> {zeckendorf_bin(bits)}\n")
assert zeckendorf_bin([0, 0, 1, 0, 1, 0, 0, 0, 0, 1]) == 532
bin_sommets_100 = {
# 3 +8 +89
(0, 0, 1, 0, 1, 0, 0, 0, 0, 1): 532, # = 4 + 16 + 512
#1 +2 +8 +89
(1, 1, 0, 0, 1, 0, 0, 0, 0, 1): 531, # = 1 + 2 + 16 + 512
#1 +2 +3 +5 +89
(1, 1, 1, 1, 0, 0, 0, 0, 0, 1): 527, # = 1 + 2 + 4 + 8 + 512
# 3 +8 +34+55
(0, 0, 1, 0, 1, 0, 0, 1, 1): 404, # = 4 + 16 + 128 + 256
#1 +2 +8 +34+55
(1, 1, 0, 0, 1, 0, 0, 1, 1): 403, # = 1 + 2 + 16 + 128 + 256
#1 +2 +3 +5 +34+55
(1, 1, 1, 1, 0, 0, 0, 1, 1): 399, # = 1 + 2 + 4 + 8 + 128 + 256
# 3 +8+13+21 +55
(0, 0, 1, 0, 1, 1, 1, 0, 1): 372, # = 4 + 16 + 32 + 64 + 256
#1 +2 +8+13+21 +55
(1, 1, 0, 0, 1, 1, 1, 0, 1): 371, # = 1 + 2 + 16 + 32 + 64 + 256
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
rounded
>>> 
 
x
x
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.128013yà 4;akSwZ*2tls_v3h+b5éP,eVgro61xd/098)p:z7Rinf=(ucm050I0A0n0g0T0o0p0d0Z0o0g0p0p0W010n0T0O010406050p0Y0!0!0g0D0b040i0E0o0Y0^0E0U050J0 1113150}0O04051l1e1o0J1l0}0I0T0r0-0/0;0?0t0T0C0t0o1C0t0n0{050(0v0o0A1x0:0=011B1D1F1D0n1L1N1J0n0D1m0n0t1P1z010V0*0A0U0g0!0A010-180p0O0g0U0?0m1J1`1|1*1R1-1N1:1=0{0a0d0y0D0E0O0E0p0T1b0U0d0$1^0D0D0A0Z2j1e210U1m0J1(2w1#1%1$1K0I230?1F0U1/2g1J1u1w0.1Q2G0T2I0U0E2M1J0O2p1m2u2w2!0~1{2k2O1+2T0D120o0{0d0G2t2(0|2%222*1R2,2.2:0m2?1|2^2u2F012}0g2/040d0s312v0}342{0?37390d0e3d332(353j2:0w3n3f3p3h360E2-382:0F3u2_2)1y2|3z2~3a0R3E3g3H3i3J3B3a0M3N3w3P3y3A3k0L3V2`3X3r040G0K3$3G2P3Y3K0G2=1f2@3v3%3/3)0G303@323_3.2+3R390G3c3 3e3F3q440{0G3m483o3`433Z4d3t4g414b4k3*3D4g1p2Y1e2M2z0I1%2E3x0Z2U1?1m4x1n4v2$4t4D0$2Z3W3/0h0{0$0V3n4a3x0j2:4V3O3{0V0{0Q2q0h1/0I3z0V0q0v2R4!4P1+0`040X4?4i2|0{4;0n0p4|421R4_0N0P3-354Y3a0d5d53350p0I0{015k593x5h2:5d0d0S1/0r0E0T1O0o001/0^0A0D0d1/0d4;1:0T2p0d1Q0E0Z0T0x0d0c5m3X5o5c5q5q0/0d2p2X0x0p5A0g2j2l1O0k4*4,4.2l1c0U0x1O0g0r2q0d1N0d1Y0A0g0Y5G2i524n4W5U5i5W0d5k013u5X683{0{0p0E110A3n0d6h1+0E0{0W6o6q1R0!0T0{3,4n6g4#2+0{0O0Y0T0;1|0Z0A0q0$0Y0H6v6E1R6s046u4g6p6T0?6y4d6f5q6w0?4R040V3z6S4@4~040v6:4}0?0E5b4=6Y6*364 655f3x4_586C5X6)6!016,0T4U6~7a0U4 6^546`6t6X2!6Z6;6#6z3*733X756(78786 7h046k6m7j356V0u7n2@7p6_70046H6J0p6L6N6P6R777y7A6G6I6K0U6M6O0A6Q7F3x6V0l7J327L7k016$043~2!066D7q7b0{2p0n0Y0D1d7f7}7B7D1=3u4o3x6,4T7u3/5b6p4t7g4%044)0Z4+0U4-0D4/5H8f4^0{4{8j8671518v550{577x7;350Z0G0{030d0B5C2h1c5L5{0Z0d0p0n0b5~6.7$2j2I0o0d0f0d0Y2I5}1C2I8H6 6,8082847o7A0v6j108D0?4_8y2$7a7@7_7K6 7-0l7+3(0{0T9c4Q0{6.0D9g6F049f8z7M4_0z9l6=6@857M6{9e8`987g8}041/105C5*6n9p7=92907N5066947}569t6+9e7e8{7g7i9w7=6V0W7/2v8I3x7@3?9R9q8F3E0J4M0A2w2X9^4w1v4y2z2C2x0g1M9{0J4x0}a50%0)0+04.

Exercice 2

Coder une fonction zeckendorf_list qui prend en paramètre un entier positif n et qui renvoie un tableau de bits dont le renversement correspond à l'entier n écrit en binaire.

Contraintes
  • 0n<101000
  • Fonction récursive interdite
  • Modules math et functools interdits
  • Code source limité à 2000 caractères

Exemple : 20=4+16, donc son écriture binaire est '0b10100' la liste de bits attendus est donc [0, 0, 1, 0, 1]

Sinon, on attend que zeckendorf_bin(zeckendorf_list(n)) == n pour tout entier n, puisqu'il s'agit de la fonction réciproque.

Aide

Il suffit de faire une boucle Tant que,

  • de récupérer le bit de poids faible avec n % 2
  • de décaler tous les autres dans le nombre n, en le divisant par deux.
Guide
🐍 Script Python
def zeckendorf_list(n):
    """
    Renvoie la liste de bits associée à l'entier n
    """
    bits = ...
    while ...:
        bits.append(...)
        n = ...
    return ...
# Fonction disponible : aide
# >>> help(zeckendorf_bin)
def zeckendorf_list(n):
"""
Renvoie la liste de bits associée à l'entier n
"""
...
# Tests
n = 20 # ← À modifier pour vos tests
print(f"???> zeckendorf_list({n}) -> {zeckendorf_list(n)}\n")
for n in range(30):
assert zeckendorf_bin(zeckendorf_list(n)) == n, f"Erreur avec {n=}"
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
rounded
>>> 
 
x
x
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.128013yà 4.;akSw2tls_v3]hb5éPe[gro61d/098)%p:z7Rinf=(ucm050F0y0m0h0R0n0o0d0X0n0h0o0o0U010m0R0M010406050o0W0Y0Y0h0B0b040j0C0n0W0?0C0S050G0}0 11130{0M04051j1c1m0G1j0{0F0R0q0+0-0/0;0t0R0A0t0n1A0t0m0_050$0u0n0y1v0.0:011z1B1D1B0m1J1L1H0m0B1k0m0t1N1x010T0(0y0S0h0Y0y010+160o0M0h0S0;0l1H1^1`1(1P1+1L1.1:0_0a0d0x0B0C0M0C0o0R190S0d0!1?0B0B0y0X2h1c1 0S1k0G1$2u1Z1#1!1I0F210;1D0S1-2e1H1s1u0,1O2E0R2G0S0C2K1H0M2n1k2s2u2Y0|1_2i2M1)2R0B100n0_0E2r2$0`2#202(1P2*2,0_0l2:1`2=2s2D012`0h2-040r2~2t0{312^0;34360e39302$323f0_0v3i3b3k3d330C2+350_0D3p2?2%1w2_3u2{040P3z3c3C3e3E3w040J3I3r3K3t3v360I3i1n2W1c2K2x0F1#2C3s0X2S1;1k3#1l3Z2!1d2;053+0!2X3R2N010i0_0!0T3X3J3}0k0_0d433|2)0T0_0O2o0i1-0F3u0T0p1D0o0m492@3S0^040V4p3B3}0S0_1b3?2 3A324s0K0N3Q4q45470d4M4v320o0F0_014T4I4w1)4Q4L4M0Q1-0q0C0R1M0-0d4m0m1M2k0u2g0*1O0C0X0R0w1M0c4,001-0?0y0B0d4A2Y3q4J4X4R044M4M4T013p5c48442)0_4;0m0o3i5i4a1P0C0_0U5p4D3s4s0z0s5g5c5x3S3 040k1z1L5w5j2_4z5L5r0;5t04020A0m0g5P581P0Y0R0_0H4O5y0_4H4B3a5h5h5E4x5l4=5)3S5S0f5^5=040h0M0M4h5|1)4s4u5-3{5Z3e5O675q69015S0L5Y4W5!5$042}675;640_0K5C5/6d6j6a04552;6v325S0G0G5v6c6p6k2|6t6B3s5G2n0m0W0B6z2 6M3S4y045m5o670{0G3_0y2u2V6)3!1t3$2x2A2v0h1K6,0G3#6$0!0$0(0o04.

Exercice 3

Coder une fonction zeckendorf_txt qui prend un tableau de bits en paramètre et qui renvoie la chaine de caractères associée à la représentation de Zeckendorf décrite avec bits.

Exemples
  • # Fibonacci 1 2 3 5 8 13 21 34 55 89 ...
  • assert zeckendorf_txt([0, 0, 1, 0, 1, 0, 0, 0, 0, 1]) == "3 + 8 + 89"
  • assert zeckendorf_txt([1, 1, 0, 0, 1, 0, 0, 1, 1]) == "1 + 2 + 8 + 34 + 55"
Contraintes
  • La longueur de la liste bits est inférieure à 104.
  • Fonction récursive interdite
  • Modules math et functools interdits
  • Code source limité à 2000 caractères

👍 La fonction acceptera les représentations minimale, maximale ou toute autre valide.

Aide
  • On construit le nombres de Fibonacci tout en faisant un parcours sur les bits
  • Si le bit est marqué, on ajoute ' + ' à la chaine puis le nombre en texte.
    • ⚠ Si c'est le premier nombre ajouté,
      • on ne place pas le ' + '
      • un booléen premier permet de marquer cet état qui change.
Guide
🐍 Script Python
def zeckendorf_txt(bits):
    """
    Renvoie la chaine de caractères associée à
        la représentation de Zeckendorf donnée avec le tableau bits
    """
    a, b = ..., ...  # Fib(i) et Fib(i + 1)
    chaine = ...
    premier = True
    for bit in bits:
        if ...:
            if premier:
                ...
            else:
                chaine = ...
            chaine = ...
        a, b = b, a + b
    return chaine
def zeckendorf_txt(bits):
"""
Renvoie la chaine de caractère associée à
la représentation de Zeckendorf donnée avec le tableau bits
"""
...
# Tests
bits = [0, 0, 1, 0, 1, 0, 0, 0, 0, 1] # ← À modifier pour vos tests
print(f"???> zeckendorf_txt({bits}) -> {zeckendorf_txt(bits)}\n")
# Fibonacci 1 2 3 5 8 13 21 34 55 89 ...`
assert zeckendorf_txt([0, 0, 1, 0, 1, 0, 0, 0, 0, 1]) == "3 + 8 + 89"
assert zeckendorf_txt([1, 1, 0, 0, 1, 0, 0, 1, 1]) == "1 + 2 + 8 + 34 + 55"
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
rounded
>>> 
 
x
x
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.128013yà 4akSwZ2tls_v3h+b5éP,Tegro61xd/098)pF:z7Rinf=(ucèm050G0z0l0f0S0m0n0d0Y0m0f0n0n0V010l0S0M010406050n0X0!0!0f0B0b040h0C0m0X0^0C0T050H0 1113150}0M04051l1e1o0H1l0}0G0S0p0-0/0;0?0r0S0A0r0m1C0r0l0{050(0t0m0z1x0:0=011B1D1F1D0l1L1N1J0l0B1m0l0r1P1z010U0*0z0T0f0!0z010-180n0M0f0T0?0k1J1`1|1*1R1-1N1:1=0{0a0d0w0B0C0M0C0n0S1b0T0d0$1^0B0B0z0Y2j1e210T1m0H1(2w1#1%1$1K0G230?1F0T1/2g1J1u1w0.1Q2G0S2I0T0C2M1J0M2p1m2u2w2!0~1{2k2O1+2T0B120m0{0d0E2t2(0|2%222*1R2,2.2:0k2?1|2^2u2F012}0f2/040d0q312v0}342{0?37390d0e3d332(353j2:0u3n3f3p3h360C2-382:0D3u2_2)1y2|3z2~3a0Q3E3g3H3i3J3B3a0K3N3w3P3y3A3k0J3V2`3X3r040E0I3$3G2P3Y3K0E2=1f2@3v3%3/3)0E303@323_3.2+3R390E3c3 3e3F3q440{0E3m483o3`433Z4d3t4g414b4k3*3D4n4a3x3|3M4g1p2Y1e2M2z0G1%2E3x0Y2U1?1m4C1n4A2$4y4I0$2Z3W3/0g0{0$0U3n4u3X0i2:4!3O3{0U0{0P2q0g1/0G3z0U0o0l0F0l4)4U1+0`040W4|4i2|0{0t2i0n52421R4 0L0O3-354%3a0d5j59350n0G0{015q5f3x5n2:5j0d0R1/0p0C0S1O0/0-0r0)2I2l1O0Y130f2r0Z2p0,1Q0C0Y0S0v1O0c5s3X5u5i5w5w5E2p2X0v0n1/0(2j5J0d0j4/4;4?2l1c0T5W0d0f0p2q0d1N0d1Y0z0f0X0d560l584t4*1+5#5%5q013u5%4#3{0{0f5l3x4 0x3n0d6m2+556u6w1R0C0{0V6z6e1R0!0S4d6q3X6s6F4}6H6J043~2!5k6G0?0Y0E0{030d0N0S0t0W0S0L0d0%6$6(6*0d0s2;0L6k5w6A3i0{0Y5G2R0z6O530?6C046E4g6v6W010n1 045r4n6l7a0T0{2X0z6I0z0B725a746D7q350g0Y0{0y0B0X717g6`7a4W040U3z7u4v552i7K3X0C5h2R7O6n046a6c2$7a4 5e7D5%6V6P0?7G0S4Z786{367M4{7.7a750V776U7/6I6K4y7Z0{7#2!067%85797)017+7-7{7i7k2p7n7p7 887!6_86867/7j047l8g7T1+7^8t1R7w0{0N385-8l8m8773890{0z0+7C7Y8j818D8E7E888p6~5H8L2@8F7r01750s7`8X7/7c5p6=0d6j7$8E8o6}6 2I8w7s048$8^360t0{0n1#6L3/4 518i8G8p6p968Z5c8P8R976o924~0{6t7?8S6y9l8G8v9o8Z8p0t9h5b9j8|988|8#9y9n837h887G2p0l0X0B1d9r3q8=8V3E0H4R0z2w7l2w4M2x4E1e2A9#0f1M9U4B1v2^0H0$0(0*0n04.