[C++] Concours de code : new test en cours, proposez votre solution !

Concours de code : new test en cours, proposez votre solution ! [C++] - C++ - Programmation

Marsh Posté le 02-08-2003 à 00:25:42    

Salut,
 
Il sagit donc d'un petit concours de code.
Par exemple, on defini une petite tache a acomplir (parsing de texte, calcul mathematique...), chaque personne poste son code et on juge le meilleur (meilleure optimisation, elegance du code, ruses de sioux, etc..).
Il ne faut pas que ce ne soit pas trop long (15-20 lignes max).
 
Le juge-correcteur officiel est Taz, bien sur vous pouvez aussi juger/critiquer/corriger.  
 
edit de Taz :  
Pour ceux qui utilise g++ (ou mingw, dev-cpp), votre code doit compiler avec ces paramètres :
 
g++ -Wall -std=c++98 -pedantic
 
 
Test #1  (proposé par SchnapsMann) :
-------------------------------
#1 : "écrire un programme C qui trie lexicalement les arguments de la ligne de commande, dont le source est le plus court possible"
 
Meilleur resultat proposé par Kristoff (adapté du code de Taz)

Code :
  1. #include <iterator>
  2. #include <iostream>
  3. #include <string>
  4. #include <set>
  5.  
  6. using namespace std;
  7.  
  8. int main(int argc, char **argv)
  9. {
  10.     multiset<string> args(argv, argv+argc);
  11.     copy(args.begin(), args.end(), ostream_iterator<string>(cout, "\n" ));
  12. }


   
Test #2 (proposé par Taz):
--------------------------
 
Il sagit de donner les anagrammes de mots a partir du dictionnaire de francais suivant :
http://dejean.benoit.free.fr/tmp/french.zip
 
Essayez de faire un programme sur avant d'être efficace, au niveau de la lecture du fichier aussi. Dans mon programme, on quitte en envoyant EOF (CTRl+D sous *n*x, CTRL+Z sous windows).
Pour ceux qui n'auraient pas saisi, l'idéal serait d'avoir un affichage comme ça
 

Citation :


[benoit@athlon tmp]$ ./a.out /usr/share/dict/french
aimer
aimer : aimer, maire, marie,
nouveau
nouveau : nouveau,


Message édité par fykman le 03-08-2003 à 12:53:57
Reply

Marsh Posté le 02-08-2003 à 00:25:42   

Reply

Marsh Posté le 02-08-2003 à 00:27:40    

je pense que le topic 'trouver les bugs' est mieux. ça va vite être le bordel si tout le monde balance 25lignes... mais on peut essayer si tu veux

Reply

Marsh Posté le 02-08-2003 à 00:29:38    

Taz a écrit :

je pense que le topic 'trouver les bugs' est mieux. ça va vite être le bordel si tout le monde balance 25lignes... mais on peut essayer si tu veux


 
Je connaissait pas le topic "trouvez les bugs"...
 
Sinon, on choisi quoi comme theme de depart ?

Reply

Marsh Posté le 02-08-2003 à 00:30:34    

aucune idée... pas le sujet de ton prochain tp de préférence

Reply

Marsh Posté le 02-08-2003 à 00:32:09    

Taz a écrit :

aucune idée... pas le sujet de ton prochain tp de préférence


 
AHAHAH, merci de ta solicitude, mais mes annees de facs sont loin derriere moi..
 
Bref, je vais scruter sur le web pour trouver un idée.


Message édité par fykman le 02-08-2003 à 00:32:59
Reply

Marsh Posté le 02-08-2003 à 00:33:24    

Pour bien montrer aux éleves ce qu'il ne faut pas faire en apprenant le C, les profs de ma fac organisaient le concours suivant:
 
#1 : "écrire un programme C qui trie lexicalement les arguments de la ligne de commande, dont le source est le plus court possible"


Message édité par schnapsmann le 02-08-2003 à 18:09:34

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 02-08-2003 à 00:35:03    

Pourquoi pas...
 
Si tout le monde est d'accord on peut essayer ca.


Message édité par fykman le 02-08-2003 à 00:37:18
Reply

Marsh Posté le 02-08-2003 à 00:41:58    

Code :
  1. #include <algorithm>
  2. #include <iterator>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. using namespace std;
  7. int main(int argc, char **argv)
  8. {
  9.   vector<string> args(argv, argv+argc);
  10.   sort(args.begin(), args.end());
  11.   copy(args.begin(), args.end(), ostream_iterator<string>(cout, " " ));
  12.   cout << endl;
  13. }

Reply

Marsh Posté le 02-08-2003 à 00:43:06    

merde, j'ai le droit de jouer?

Reply

Marsh Posté le 02-08-2003 à 00:45:48    

Taz a écrit :

merde, j'ai le droit de jouer?


 
les meilleurs arrivaient facilement en dessous des 100 caractères pour le source tout entier; remarque si tu veux on peux te faire jouer seul dans la catégorie c++/stl  [:boidleau]  [:calin]


Message édité par schnapsmann le 02-08-2003 à 00:46:06

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 02-08-2003 à 00:45:48   

Reply

Marsh Posté le 02-08-2003 à 00:47:25    

je veux pas d'un concours de code brouillé. j'ai donné l'exemple: du code clair, sur, réutilisable, performant

Reply

Marsh Posté le 02-08-2003 à 00:47:45    

Difficile de faire mieux la....
 
On sent la maitrise de la STL.

Reply

Marsh Posté le 02-08-2003 à 00:49:32    

bon, je joue pas, je corrige. j'efface ou tu propose un truc de la même complexité?

Reply

Marsh Posté le 02-08-2003 à 00:49:33    

Taz a écrit :

je veux pas d'un concours de code brouillé. j'ai donné l'exemple: du code clair, sur, réutilisable, performant


 
Et qui compile pas sous Visual !

Reply

Marsh Posté le 02-08-2003 à 00:50:09    

fykman a écrit :


 
Et qui compile pas sous Visual !

:non: c'est visual qui compile pas. c'est quoi le problème?

Reply

Marsh Posté le 02-08-2003 à 00:52:40    

Taz a écrit :

:non: c'est visual qui compile pas. c'est quoi le problème?


 
"Cannot convert char** to unsigned int"
 
ligne : vector<string> args(argv, argv+argc);
 
[:spamafote]
 
Et t'as oublié "return(0);" a la fin  ;)

Reply

Marsh Posté le 02-08-2003 à 00:54:11    

l'erreur, je la comprends pas.
j'ai pas oublié le return(0). il est implicite: la valeur renvoyée est garantie comme indiquant une sortie correcte
d'ailleurs, ça serait un return 0, return étant une instruction et pas une fonction

Reply

Marsh Posté le 02-08-2003 à 01:00:29    

Taz a écrit :

l'erreur, je la comprends pas.


 
Ben moi non plus...  :(

Reply

Marsh Posté le 02-08-2003 à 01:03:10    

fykman a écrit :


 
Ben moi non plus...  :(  

y a pas de support technique dans un compilo si cher (ok j'arrete)

Reply

Marsh Posté le 02-08-2003 à 01:15:13    

Ca, ca compile et ca marche :
 

Code :
  1. #include <algorithm>
  2. #include <iterator>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. int main(int argc, char **argv)
  10. {
  11. vector<string> args;
  12. for(int i=0; i<argc; i++) {
  13. string st(argv[i]);
  14. args.push_back(st);
  15. sort(args.begin(), args.end());
  16. copy(args.begin(), args.end(), ostream_iterator<string>(cout, " " ));
  17. cout << endl;
  18. return 0;
  19. }


 
Mais c'est moins elegant, forcement....

Reply

Marsh Posté le 02-08-2003 à 01:16:59    

c'est bizarre cette histoire de constructeur...

Reply

Marsh Posté le 02-08-2003 à 01:19:19    

Taz a écrit :

c'est bizarre cette histoire de constructeur...


 
boarf, ça m'étonne pas. Je me suis déjà cassé les dents à faire du code stl portable entre msc6 et d'autres compilos, le facteur limitant est vite trouvé.


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 02-08-2003 à 01:20:30    

SchnapsMann a écrit :


 
boarf, ça m'étonne pas. Je me suis déjà cassé les dents à faire du code stl portable entre msc6 et d'autres compilos, le facteur limitant est vite trouvé.

c'est con quand même. c'est pas une question de version de STL. j'y connais rien mais j'ai déjà entendu des trucs là dessus. ou c'est vraiment le compilo?

Reply

Marsh Posté le 02-08-2003 à 01:23:16    

Taz a écrit :

c'est con quand même. c'est pas une question de version de STL. j'y connais rien mais j'ai déjà entendu des trucs là dessus. ou c'est vraiment le compilo?


 
ouais même en utilisant VC++6 SP5, ce compilo ne passe pas tous les tests de conformance au standard stl [:schnapsmann]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 02-08-2003 à 01:25:14    

J'y connais rien mais tu fait un cast inplicite entre un char** et un vector<string>::interator, le compilo doit pas aimer ca...

Reply

Marsh Posté le 02-08-2003 à 01:28:31    

non, c'est pas ce qui se passe. tu peux imaginer le code du contructeur de vector comme ça
 

Code :
  1. template< typename T, typename InputIterator>
  2. vector<T>::vector(InputIterator begin, InputIterator end)
  3. {
  4.   /// des trucs;
  5.   // je fais ça explicitement
  6.   while(begin!=end)
  7.   {
  8.     push_back(*begin++);
  9.   }
  10. }


 
dans notre cas, *begin est de type char* ce qui est compatible avec le constructeur string(const char*)

Reply

Marsh Posté le 02-08-2003 à 01:30:15    

SchnapsMann a écrit :

Pour bien montrer aux éleves ce qu'il ne faut pas faire en apprenant le C, les profs de ma fac organisaient le concours suivant:
 
"écrire un programme C qui trie lexicalement les arguments de la ligne de commande, dont le source est le plus court possible"

en O'caml :

Code :
  1. Array.sort String.compare Sys.argv



---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 02-08-2003 à 01:31:12    

nraynaud a écrit :

en O'caml :

Code :
  1. Array.sort String.compare Sys.argv


 

je te reconnait bien là  :D

Reply

Marsh Posté le 02-08-2003 à 01:32:04    

Taz a écrit :

je te reconnait bien là  :D  

j'avais trop envie. En plus ce truc est meme pas fonctionnel !


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 02-08-2003 à 01:32:41    

nraynaud a écrit :

j'avais trop envie. En plus ce truc est meme pas fonctionnel !

pourquoi?

Reply

Marsh Posté le 02-08-2003 à 01:36:19    

Taz a écrit :

pourquoi?


Code :
  1. # Array.sort String.compare Sys.argv;;
  2. - : unit = ()


ca trie le tableau "en place", donc par effet de bord donc pas fonctionel (ou les valeurs n'ont pas le droit d'etre modifiées).
 
edit : version fonctionelle :

Code :
  1. # List.sort String.compare (Array.to_list Sys.argv);;
  2. - : String.t list = ["P:\\Objective Caml\\bin\\ocaml.exe"]


Message édité par nraynaud le 02-08-2003 à 01:41:55

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 02-08-2003 à 01:37:19    

nraynaud a écrit :


Code :
  1. # Array.sort String.compare Sys.argv;;
  2. - : unit = ()


ca trie le tableau "en place", donc par effet de bord donc pas fonctionel (ou les valeurs n'ont pas le droit d'etre modifiées).

ah en ocaml, ok.

Reply

Marsh Posté le 02-08-2003 à 10:42:36    

ouaip bonne idee, malheureusement jsuis pas un bete de c++,
mais ca peut le faire  :D  
 
 

Reply

Marsh Posté le 02-08-2003 à 10:47:31    

faudrait clairement mettre le titre du 'contest' dans lentete du topic , et mettre en dessous le code de ceux qui ont deja reussi a le faire
 
un truc clair quoi
 
un peu comme le concours graphisme....


Message édité par red faction le 02-08-2003 à 11:12:18
Reply

Marsh Posté le 02-08-2003 à 11:10:35    

je suis partant aussi mais si on peut le faire en ... C  :ange:

Reply

Marsh Posté le 02-08-2003 à 11:13:01    

ouais moi aussi ca marrangerai bien , mais bon si on peut sameliorer en c++
 
du moment que ca devie pas en concours stl...

Reply

Marsh Posté le 02-08-2003 à 11:17:31    

bof, moi de toute facon j'associe automatiquement le C++ à la stl [:spamafote]
et comme je connais pas la stl, je ferai du C [:hotshot]


Message édité par polo021 le 02-08-2003 à 11:18:18
Reply

Marsh Posté le 02-08-2003 à 11:46:10    

on est cat C++, pourrissez pas le topic. si vous voulez faire la meme chose dans d'autres langages, pas de problèmes. quelqu'un n'a qu'a créer le meme topic en C et voir ce que donne le meme problème, c'est tout suite moins bien en C

Reply

Marsh Posté le 02-08-2003 à 11:46:52    

Je ne te le fais pas dire  :sarcastic:  
 
 :jap:

Reply

Marsh Posté le 02-08-2003 à 14:07:58    

En adaptant un peu la version de Taz pour raccourcir :
 

Code :
  1. #include <iterator>
  2. #include <iostream>
  3. #include <string>
  4. #include <set>
  5. using namespace std;
  6. int main(int argc, char **argv)
  7. {
  8.   multiset<string> args(argv, argv+argc);
  9.   copy(args.begin(), args.end(), ostream_iterator<string>(cout, "\n" ));
  10.   return 0;
  11. }


 
Voila, c'est plus court et ça fait ce qui est demandé :D
 
Edit : il vaudrait beaucoup mieux utiliser multiset que set !


Message édité par Kristoph le 02-08-2003 à 14:11:42
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed