Un petit "chalenge contest" pour perdre son temps - C - Programmation
Marsh Posté le 03-11-2005 à 18:59:42
c'est vraiment pas difficile.
T'écris un prog qui prend en argument un fichier, qui retranscrit caractère par caractère ou ligne pas ligne de fichier.
--->
$ prog.x prog.c
Marsh Posté le 03-11-2005 à 19:06:23
hehe
Sans faire ca evidement......
Bien sur je ne l'avais pas precisé, mais ca me paraissait logique car sinon c'est pas un contest ))))
Donc le but du jeu, c'est que le programme, une fois compilé et executé, affiche son propre code source, sans qu'on lui passe en parametre le fichier source, et sans que le programme lise l'entrée standard...
Un truc qui ressemblerait a ca quoi :
#include <stdio.h>
void main ( void )
{
printf( "#include <stdio.h>\n\nvoid main ( void )\n{...........}" );
}
Marsh Posté le 03-11-2005 à 20:36:29
heuu... t'est sur que ca se fait en mois de six mois de code?
Marsh Posté le 03-11-2005 à 20:43:03
Code :
|
Marsh Posté le 03-11-2005 à 20:47:01
Mais c'est impossible ? Un desassembleur qui transforme de l'asm en C ...
Marsh Posté le 03-11-2005 à 20:48:06
nlc a écrit : hehe |
Ca, ca voudrait dire ouvrir l'exécutable (habituellement passé en argv[0]), le décompiler intégralement, le reformatter et l'afficher
lol
(accessoirement, en Python ça prend 4 lignes)
Marsh Posté le 03-11-2005 à 20:50:43
masklinn a écrit : (accessoirement, en Python ça prend 4 lignes) |
Ah ?
Remarque, en PERL c'est pareil, ça va assez vite à faire.
Marsh Posté le 03-11-2005 à 20:52:59
Elmoricq a écrit : Ah ? |
Ben ouais, il y a un package appelé "inspect" dans la lib standard
import inspect |
Marsh Posté le 03-11-2005 à 20:55:15
ReplyMarsh Posté le 03-11-2005 à 20:56:26
Taz a écrit : aucune différence avec lire le fichier directement ... |
Je pensais davantage à cette solution qu'à celle d'un module lambda.
Marsh Posté le 03-11-2005 à 20:56:28
Taz a écrit : aucune différence avec lire le fichier directement ... |
À part le fait qu'on puisse récupérer le source d'un .pyc ou d'un .pyo, ce qui est un peu plus difficile en lisant __file__ via un "open"
Et accessoirement inspect permet également de récupérer le code d'une fonction et autres conneries. Il est marrant ce module
Marsh Posté le 03-11-2005 à 21:00:46
En plus un décompileur ne pourra jamais afficher les commentaires ni les directives du préprocesseur puisqu'ils ne sont pas compilés. Bref à mon avis c'est difficilement faisable voire impossible.
Marsh Posté le 03-11-2005 à 21:02:44
Ben non vous voyez bien que c'est faisable !
Taz a donné un exemple :
Code :
|
Bon, je suis pas sûr qu'il soit de lui , mais le principe est là !
En voilà un autre (pas de moi non plus) :
Code :
|
Marsh Posté le 03-11-2005 à 21:06:59
nlc a écrit : Bon, je suis pas sûr qu'il soit de lui , mais le principe est là ! |
Ca va lui faire plaisir.
nlc a écrit :
|
C'est le même.
Tu as compris ce que faisait cet exemple, au moins ?
Parce que c'est la même chose, en plus tordu, de faire un programme qui se contente de s'afficher le source.
Marsh Posté le 03-11-2005 à 21:08:18
nlc a écrit : Ben non vous voyez bien que c'est faisable !
|
Tu peux m'expliquer l'intérêt profond de faire ça? À part faire un copier/coller du code et rajouter des printf je veux dire
edit: comme elmoricq l'indique, c'est équivalent (et plus lourd) à ouvrir le fichier source et à l'afficher
Taz >
1- Fichier .py
C:\>test.py |
2- Fichier .pyc
C:\>test.pyc |
Marsh Posté le 03-11-2005 à 21:14:44
Elmoricq a écrit : Ca va lui faire plaisir. |
Pourquoi tant de N
Evidemment que j'ai compris comment marchait cet exemple !
Je pige pas ce que t'as voulu dire : Parce que c'est la même chose, en plus tordu, de faire un programme qui se contente de s'afficher le source. ??
Sinon en voila un autre que je trouve exceptionnel, car non seulement il affiche son propre code source, mais c'est un palindrome !!
Code :
|
Marsh Posté le 03-11-2005 à 21:17:42
masklinn a écrit : Tu peux m'expliquer l'intérêt profond de faire ça? À part faire un copier/coller du code et rajouter des printf je veux dire
|
Heu.... mais tu n'as pas du bien comprendre...
Le but du jeu c'est de la faire en C, et si tu crois que faire ce genre de chose est aussi simple que de faire un copié collé du code source dans un printf, essaye d'en faire un pour voir !
Evidemment ca n'a aucun interet, c'est juste pour se remuer un peu les neuronnes
Marsh Posté le 03-11-2005 à 21:19:33
nlc a écrit : Heu.... mais tu n'as pas du bien comprendre... |
Marsh Posté le 03-11-2005 à 21:23:40
nlc a écrit : Heu.... mais tu n'as pas du bien comprendre... |
T'es brave, mais ce que tu postes (dernier compris) ce n'est rien de plus que stocker tout le source dans une chaîne de caractère et l'afficher deux fois de suite
Le dernier étant original parce qu'il stocke le source en inverse (puis le retourne grâce à "while(d--) b[274-d]=b[d];" ) et ajoute un commentaire en fin de code pour les bouts qui manquent (/*c%s%c%=a*,'c%'=q rahc/**//*"=a*,'"'=q rahc/**/ est un unique commentaire)
Marsh Posté le 03-11-2005 à 21:24:07
Et hop une page sur les programmes qui produisent leur propre source par un élève de l'ENS.
http://www.madore.org/~david/computers/quine.html
Marsh Posté le 03-11-2005 à 21:30:34
el muchacho a écrit : Et hop une page sur les programmes qui produisent leur propre source par un élève de l'ENS. |
Les exemples de bootstrapping sont jolis là par contre
Et les exemples en Scheme (ou tout dialecte de Lisp) un peu faciles
Marsh Posté le 03-11-2005 à 21:33:34
masklinn a écrit : Les exemples de bootstrapping sont jolis là par contre |
Tu veux parler de l'interpréteur scheme écrit en Scheme qui interprète un interpréteur Scheme, qui interprète...
Sinon le prog de Taz se trouve la-dedans:
http://www.madore.org/~david/misc/ [...] ck/selfrep
(sacrée maitrise du shell , les mecs de l'ENS sont décidément des E.T.)
edit: putain, il donne même un exemple en Postscript.
Sachant comment ce langage est merdique, il avait vraiment rien à foutre de ses uits en salle S, le père Madore
Marsh Posté le 03-11-2005 à 21:35:44
masklinn a écrit : T'es brave, mais ce que tu postes (dernier compris) ce n'est rien de plus que stocker tout le source dans une chaîne de caractère et l'afficher deux fois de suite |
Ok, puique je suis brave et qu'il faut stocke 2x le source dans une chaine et l'afficher 2x de suite, essaye d'en pondre un pour voir !
Pourquoi me dire que je suis brave, si le sujet t'interesse pas, il suffit de ne pas repondre...
Marsh Posté le 03-11-2005 à 21:46:55
el muchacho a écrit : Tu veux parler de l'interpréteur scheme écrit en Scheme qui interprète un interpréteur Scheme, qui interprète... |
Ben oui, écrire un interpréteur Lisp en Lisp ca semble être un passe temps fréquent de ces gens là .
Je l'avais déjà vu dans The Roots Of Lisp de Paul Graham (PDF de l'article avec le code).
Ca donne:
(defun eval. (e a) |
Marsh Posté le 03-11-2005 à 21:54:28
Et gaffe, c'est du Lisp roots de chez roots ça, c'est le code originel de John McCarthy, donc ça date de 1960, avec les 7 (? si je me plante pas) opérateurs originels de Lisp
Marsh Posté le 03-11-2005 à 22:06:14
masklinn a écrit : T'es brave, mais ce que tu postes (dernier compris) ce n'est rien de plus que stocker tout le source dans une chaîne de caractère et l'afficher deux fois de suite |
Il me semble voir 2 commentaires dans le code posté non ?
/*c%s%c%=a*,'c%'=q rahc/**/ et /*"=a*,'"'=q rahc/**/
Marsh Posté le 03-11-2005 à 22:15:37
0x90 a écrit : Il me semble voir 2 commentaires dans le code posté non ? |
Vrai, tu fais bien de me reprendre
Mais ça fait pas une grande différence sur les résultat final
Code :
|
Quelle merde le parseur de Joce
Marsh Posté le 03-11-2005 à 23:39:49
Masklinn, tes remarques dans ce thread montrent clairement que tu n'as pas compris les problemes poses par la question initiale (creer un programe C qui affiche sont propre code). Je t'invite a faire comme si tu n'avais pas vu la solution proposee par Taz (enfin, a mon avis il l'a juste recopie) et a chercher seul quelques minutes. Tu te rendra vite compte des problemes que ca pose, et je t'assure qu'avant de (re)trouver l'astuce proposee par Taz, tu passera quelques heures a t'arracher les cheveux.
Marsh Posté le 06-11-2005 à 08:57:09
masklinn a écrit : Ben oui, écrire un interpréteur Lisp en Lisp ca semble être un passe temps fréquent de ces gens là . |
C'est parce qu'en Lisp :
1. les instructions sont des données manipulables dans des listes comme tout le reste. Tout programme est une liste. Il suffit donc de mettre l'interpréteur Lisp dans une liste pour pouvoir l'interpréter.
2. La syntaxe est volontairement minimale. En fait on peut presque dire qu'il n'y a pas de syntaxe, ou que la syntaxe est un reflet de l'AST lui-même. (Ceci explique d'ailleurs sans doute pourquoi il y a eu tant versions de Lisp, Lisp n'ayant pas été spécifié comme un langage, mais plutôt créé comme un système.)
Du coup, ça rend ce genre de choses très facile (enfin toutes proportions gardées ).
Ca a l'air un peu magique, d'ailleurs, si tu veux avoir un exposé très complet de la chose, je t'invite à downloader le renommé "Wizard book" d'Abelson & Sussman et/ou même les vidéos de cours associées, cours qui explique comment on crée un compilateur Lisp en Lisp.
http://swiss.csail.mit.edu/classes [...] -lectures/ (PDF + vidéos)
http://mitpress.mit.edu/sicp/ (HTML)
Marsh Posté le 06-11-2005 à 13:05:45
el muchacho a écrit : Ceci explique d'ailleurs sans doute pourquoi il y a eu tant versions de Lisp, Lisp n'ayant pas été spécifié comme un langage, mais plutôt créé comme un système. |
Pas d'accord, Lisp est un langage, mais c'est un langage qui ne dispose que de 7 instructions.
Et il n'y a pas "tant de versions de Lisp", il y a "tant de dialectes de Lisp"
Marsh Posté le 03-11-2005 à 18:50:36
Le but du jeu, ecrire un programme en C qui affiche son propre code source.
Exemple :
main.c :
int main ( void )
{
// Code
}
Une fois compilé et executé, il doit afficher :
int main ( void )
{
// Code
}
Au boulot !
---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );