Информация об изменениях

Сообщение [upd] Re: Антиквайн от 24.07.2015 12:11

Изменено 24.07.2015 19:58 ononim

#include "string.h"
#include "stdio.h"
#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)
#define EVAL_FUN_NAME STR(EVAL_FUN)
#define EVAL_FUN int eval(const char *s) { char line[1024]; gets(line); if (strcmp(line, "#include \"string.h\"")) {printf("bad 1 (%s)\n", line); return 1; } gets(line); if (strcmp(line, "#include \"stdio.h\"")) {printf("bad 2 (%s)\n", line); return 2; } gets(line); if (strcmp(line, "#define QUOTE(name) #name")) {printf("bad 3 (%s)\n", line); return 3; } gets(line); if (strcmp(line, "#define STR(macro) QUOTE(macro)")) {printf("bad 4 (%s)\n", line); return 4; } gets(line); if (strcmp(line, "#define EVAL_FUN_NAME STR(EVAL_FUN)")) {printf("bad 5 (%s)\n", line); return 5; } gets(line); if (strstr(line, "#define EVAL_FUN ")!=line){printf("bad 6 ('%s')\n", line); return 6;} if (strcmp(line+17, s)) {printf("bad 6x ('%s') != '%s'\n", line+17, s); return 6; } gets(line); if (strcmp(line, "EVAL_FUN int main(){return eval(EVAL_FUN_NAME);}")) {printf("bad 7 (%s)\n", line); return 7; } printf("good\n"); return 0; }
EVAL_FUN int main(){return eval(EVAL_FUN_NAME);}

заодно кывтовское форматирование протестим..
upd: причесал имена макросов, добавил квайн

антиквайн:
#include "string.h"
#include "stdio.h"
#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)
#define CHECK_FUN_TEXT STR(CHECK_FUN)
#define CHECK_FUN int check(const char *s) { char line[1024]; gets(line); if (strcmp(line, "#include \"string.h\"")) {printf("bad 1 (%s)\n", line); return 1; } gets(line); if (strcmp(line, "#include \"stdio.h\"")) {printf("bad 2 (%s)\n", line); return 2; } gets(line); if (strcmp(line, "#define QUOTE(name) #name")) {printf("bad 3 (%s)\n", line); return 3; } gets(line); if (strcmp(line, "#define STR(macro) QUOTE(macro)")) {printf("bad 4 (%s)\n", line); return 4; } gets(line); if (strcmp(line, "#define CHECK_FUN_TEXT STR(CHECK_FUN)")) {printf("bad 5 (%s)\n", line); return 5; } gets(line); if (strstr(line, "#define CHECK_FUN ")!=line){printf("bad 6 ('%s')\n", line); return 6;} if (strcmp(line+18, s)) {printf("bad 6x ('%s')\n", line+18); return 6; } gets(line); if (strcmp(line, "CHECK_FUN int main(){return check(CHECK_FUN_TEXT);}")) {printf("bad 7 (%s)\n", line); return 7; } printf("good\n"); return 0; }
CHECK_FUN int main(){return check(CHECK_FUN_TEXT);}


квайн:
#include "stdio.h"
#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)
#define QUINE_FUN_TEXT STR(QUINE_FUN)
#define QUINE_FUN int quine(const char *s) { printf("#include \"stdio.h\"\n"); printf("#define QUOTE(name) #name\n"); printf("#define STR(macro) QUOTE(macro)\n"); printf("#define QUINE_FUN_TEXT STR(QUINE_FUN)\n"); printf("#define QUINE_FUN %s\n", s); printf("QUINE_FUN int main(){return quine(QUINE_FUN_TEXT);}\n"); return 0; }
QUINE_FUN int main(){return quine(QUINE_FUN_TEXT);}