Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Exercices] Venez vous entraîner !

Ce mois: Parseur de fonctions mathématiques

1 juin 2008 à 11:12:33

ok je me lance dedans.

j'ai une question, on peut faire seulement le début de ton algorithme?
Car mettre @0 d'accord mais perso je préfère faire pour tous les caractères le flag.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juin 2008 à 12:05:41

C'est parti merci.
Moi j'ai une autre question combien de mot francais ont 3 lettres identiques qui se suivent ? je vois bien un taux de compression de 0 %. :D
Peut être que le mois prochain il faudra l'adapter aux images :0, on a pas fini de transpirer !
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 12:15:31

C'est pas pour rien que cet algorithme est utilisé pour les images. Il y a pas 50'000 algorithmes de compression simples.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
1 juin 2008 à 12:27:19

ouhlala un peu compliqué pour moi j'atendrai de progresser ^^
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 12:27:40

salut :)
Je viens de commencer ce programme et ca bug un peu :p
Je fais un programme qui doit ecrire une chaine, la compresser et ecrire la chaine compressee par dessous et voice le resultat:
AAAAAAAABBBBBFCCCCCNYYYYYI
7@A1@A3@B2@B1@F3@C2@C1@N3@Y2@Y1@I

o_O
Le plus bizzare est a venir :p
Je change les 2 premiers A avec des 0 et...
00AAAAAABBBBBFCCCCCNYYYYYI
7@0A1@A3@B2@B1@F3@C2@C1@N3@Y2@Y1@I

:-° ensuite j'essaie d'ajouter des characteres et le programme bug :'(
mon code de compression:
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 12:29:22

Voilà un exercice fort intéressant :) . Je ne sais pas si je pourrais le faire, car je fais beaucoup de choses en même temps en ce moment.
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 12:33:13

euh j'abandonne ce projet car trop compliqué.
Beaucoup trop compliqué.
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 13:12:14

Il y a un problème avec ta méthode:
Fichier texte:
3@

Qui se compresse en:
3@0


Comment savoir que le fichier initial n'est pas:
000


De plus, le flag a quand même une utilité assez limité, vu que t'interdis de regrouper plus de 9 caractères à la suite, et qu'il rajoute 33% à la taille de ton fichier compressé. En modifiant un peu, il est facile de s'en passer.
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 13:41:44

shamanas > C'est pas très malin de donner une solution partiel dans ce sujet. Crée un autre sujet si tu veux de l'aide. Comme cela les gens qui veulent tenter de faire l'exercice sans aide extérieure peuvent toujours le faire. En attendant, édite ton message et supprime le code que tu as proposé. ^^
  • Partager sur Facebook
  • Partager sur Twitter
Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
1 juin 2008 à 14:20:43

Citation : HunLyxxod

Il y a un problème avec ta méthode:
Fichier texte:

3@


Qui se compresse en:

3@0



Comment savoir que le fichier initial n'est pas:

000



De plus, le flag a quand même une utilité assez limité, vu que t'interdis de regrouper plus de 9 caractères à la suite, et qu'il rajoute 33% à la taille de ton fichier compressé. En modifiant un peu, il est facile de s'en passer.



Si @ est le flag et que 0 remplace un @ dans la chaine de caractère,alors 3@0 voudra dire que tu a 3 "0" de suite.
Sinon,on décomposerait ton "3@0" en "3@ 0" où le 0 serait un @ mais où le 3@ ne correspondrait à rien par rapport à la définition qu'on à donné au flag...

Je ne sais pas s j'ai été clair,mais je peux m'expliquer plus clairement ;)

Pour info,je débute en C++ (je n'ai pour l'instant que des notions) et je crois que cet exercice va me plaire :D
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 14:30:39

@Inakoll:Code supprime...de toute facon c un exercise pas un concours
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 15:47:32

perso pour le flag ce serait plus pratique quelque chose où il y a presque aucune chance de trouver cela.

J'en avait parlé avec des secondes de mon institution sur cette histoire de flag il y a quelques mois.

La meilleure solution c'est où des combinaisons d'unicode ou alors

&&-{FLAG}-&&

Voila le flag idéal.

On est sur que l'on peut ne pas se tromper.

Mais c'est un peu long comme flag, on est pas sur de gagner de la place dedans.
Mais pour un jeu avec des niveaux pour spérare chaque niveau c'est LA solution.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juin 2008 à 15:54:22

Et si tu tentes de compresser le code source de ton compresseur ?

Tu rencontreras ce flag "inrencontrable" et tu es foutu :D .

"Never trust the user input" (je crois que c'est un truc comme ça :-° )
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 15:59:42

Trop dur encore ce moi-ci pour moi...
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 16:03:10

ah oui en effet cyprien, je ne l'avais pas remarqué, ben dans ce cas la, on le remplace par \&&-{FLAG}-&&

Comme ca, on saura que c'est pas un flag, c'est comme pour le C.
Quand on veut faire \ il faut en mettre 2
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juin 2008 à 16:06:50

Je suis un peu étonné de voir autant de "c'est trop dur!". Faut pas abandonner si vite. Une feuille, un papier et c'est parti pour une simulation. Étape par étape. La réponse ne va pas tomber du ciel, mais c'est pas pour autant qu'on peut pas y arriver!
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 17:06:59

@shamanas:

Merci de pas poster trop de code dans ce sujet. Ca permet aux personnes qui veulent essayer de lire les potentiels compléments sans avoir du code sous les yeux.

@Jaloyan1 (1er poste):
On s'enfout de comment tu préfères faire.

@HunLyxxod :
3@ -> 3@0 -> 000 En effet. C'est pour cela, qu'on utilise un flag qui n'apparait jamais dans le texte. Il n'y a pas de solution à ce problème si on utilise un flag. Il y aura toujours une séquence de caractère qui coince. Une solution est souvent de remplace la séquence "flag" par "flagflag", ce qui ne résoud pas entièrement le problème.
Ne pas utiliser de flags pose lui un autre problème, celui que j'ai soulevé dans la première partie. Comment savoir si "33" est 3 suivi de 3 ou 3 fois 3 ?

@Jaloyan 1: Si on utilise un flag de plus de 1 caractère, le problème reste le même et en plus, ça diminue gravement le taux de compression.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
1 juin 2008 à 17:21:56

Hum, es tu sur que le flag soit vraiment nécessaire ?

Si par exemple on note nombre_de_caractere(rien)caractère(rien)nombre_de_caractere(rien)caractère etc..., en limitant à neuf on aurait par exemple :

CCCCCCBBBCCU333ZZZZ@YYYYYYYYYYYYY

Sans flag :
6C3B2C1U334Z1@9Y4Y

Avec un flag :
6@C3@BCCU3@34@Z@09@Y4@Y

Là c'est plus court sans flag.

Mais avec un autre exemple comme :

AAABCCDEFGHHH@JJKLLLLMNOOOOPPPQSS

Sans flag :
3A1B2C1D1E1F1G3H1@2J1K4L1M1N4O3P1Q2S

Avec :
3@ABCCDEFG3@H@0JJK4@LMN4@O3@PQSS

La méthode avec flag est plus courte, mais ne fait qu'un caractère de moins que l'original ; quant à la méthode sans flag, elle est plus longue que l'original...
Toutefois on évite les problèmes d'arobase.

Donc le flag est il vraiment indispensable ? (bon ça peut être une consigne compliquant la tâche, mais comme on est programmeur on est fainéant et on n'aime pas l'inutile :p )
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 17:38:59

Perso j'aurait faire encore plus condensé : chaque caractère est sur deux octets.
Le premier octet c'est le nombre de fois et le second c'est le caractère concerné
Ca permet d'écrire genre "255 fois A" sur deux octets (0xFF (255) 0x41 ('A'))
Par contre, encore là il faut se méfier, ça peut faire des fichiers plus lourds que les originaux :D (remarque je suis sur que la première méthode compresse pas grand chose sur un texte lambda, c'est très rare de voir des AAAA)
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 17:50:37

Après si on compresse un fichier texte écrit en langue française.. bas le taux de compression va être quasi nul non? (très peu de lettres doublé et aucune triplé et plus :/)
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 17:56:14

On va pas débattre sur la meilleure façon de compresser non ? L'énoncé a été donné par Nanoc, on respecte cet énoncé. Ce n'est qu'un entrainement, donc cette algorithme là me parait déjà bien, on ne va pas chercher la perfection. M'enfin libre à vous.

Sinon:
-Tu demandes de la POO pour cet exo ?
-On ouvre le fichier "fichier.txt" qu'on doit compresser, mais l'énoncé ne dit pas si on réecrire le contenu compressé dans ce fichier là ou créer un nouveau fichier "fichierCompressé.txt" ?
-Et donc si le fichier à compresser contient "@@@", pourquoi on ne peut pas compresser en "3@@", j'ai pas compris ?
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 17:59:01

ben je pense plutot que taux compressé : -5000%

Car essaie de faire cette phrase

Salut ca va?

1@S1@a ...



Ou alors
Salut ca va?



ou alors ...


Liste des adresse msn : 

1@hotmail.fr
2@hotmail.fr
3@hotmail.fr
4@hotmail.fr
5@hotmail.fr
6@hotmail.fr
7@hotmail.fr
8@hotmail.fr


--->compression

1@0hotmail.fr
2@0hotmail.fr
3@0hotmail.fr
4@0hotmail.fr
5@0hotmail.fr
6@0hotmail.fr
7@0hotmail.fr
8@0hotmail.fr



Vachement utile la compression dans ce cas la.
Perso pour les images ce serait plus pratique comme tu l'a dis nanoc.

Mais bon c'est juste un exo.

Et perso le cas du 1@@ double flag serait plus pratique dans ce cas la.
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 19:02:34

j'ai deja presque fini :)
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 20:28:02

@genius:
Si tu dois décompresser 23, comment savoir si c'est :
23 ou 33 qui était à l'origine. Le flag est indispensable. C'est pas moi qui ai inventé la méthode :)

@devy:
Encore mieux: Le système de compression tar.bz2 ! Sauf que c'est beaucoup trop compliqué. Le but ici est de faire du RLE. Si il faut commencer à s'attquer aux octets, alors effectivement on peut faire beaucoup mieux.

@Goten:
Tout à fait, c'est pour cela que ce truc est en général utilisé pour les images (voir le lien Wikipédia). Mais comme c'est un exercice de programmation pour débutants, on travaille avec des fichiers textes et pas des images.

@Kurlze:
La POO ne me semble pas nécessaire ici. Disons que si je dois coder cela, je ne vois pas l'intéret de faire une classe. Pour le fichier final, libre à toi de faire ça comme tu veux.
Pour les "@@@", essaie de décompresser ton truc et tu verras ce qui se passe...
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
1 juin 2008 à 20:51:21

J'ai une question.
Si l'utilisateur utilise un flag perso pour compresser faut il entrer ce nouveau flag pour la decompression ou bien lors de la compression par exemple le premier caractère doit etre le flag et alors la décompression se fait sans avoir besoin d'entrer le flag comme paramètre. Le probleme de cette technique c'est que ca rajoute encore un caractère et donc le taux de compression est encore réduit.
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 21:05:41

@Nanoc :
23 => 1213
33 => 23

Avec "ta" méthode, pour une suite d'un à trois nombres, la compression est nulle, sinon on gagne n-3 caractères sur une suite de n nombres.

Avec "ma" méthode, sur un nombre seul on perd un caractère, sur deux aucune différence, et à partir de trois on gagne n-2 caractères.

Je pense donc que les deux manières se valent plus ou moins, mais je trouve "la mienne" plus simple.


Autre idée sinon : on pourrait compter avec des lettres (comme en hexa, mais jusqu'à z (voire même 0-9 a-z (=> 10>36 (vive les parenthèses)) A-Z (=> 37>63))) une fois les 9 caractères identiques dépassés)

Ce qui donnerait :
YYYY => 4Y ou 4@Y => au lieu de 4@Y
YYYYYYYYYYYY => cY ou c@Y => au lieu de 9@Y 3@Y
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY (53) => PY ou P@Y => au lieu de 9@Y 9@Y 9@Y 9@Y 9@Y 8@Y

On voit qu'on gagne pas mal de place :)
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 21:06:23

comment on fait pour qvoir un multimap non ordonné?
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 21:16:54

@genius : avec ta méthode on pourrait meme augmenter cela sur un octet, avec tous les caracteres ANSI compris entre 0x0 et 0xFF
Comme ca on travaile sur une base 256 et donc jusqu'a 255 caracteres possibles.
Ca étend la marche.
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2008 à 21:22:04

Petite question, est-ce qu'on doit obligatoirement garder l'odre ? Car quand je decompresse, j'écris en ordre alphabétique.

Exemple :

not compressed : JJJIIIII
compressed : 5@I3@J
decompressed : IIIIIJJJ

Grave ou pas ?

  • Partager sur Facebook
  • Partager sur Twitter