Антиквайн
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.07.15 22:42
Оценка:
Напишите на вашем любимом языке программу (или функцию), которая принимает строку, проверяет её на точное совпадение с исходным текстом этой же самой программы и печатает (или возвращает) результат этой проверки (true/false, 1/0, "да"/"нет" и т.д.). Если язык имеет встроенную команду для получения исходного текста программы, не используйте её.
Re: Антиквайн
От: Vaako Украина  
Дата: 24.07.15 07:58
Оценка: -2
Здравствуйте, nikov, Вы писали:

N>Напишите на вашем любимом языке программу (или функцию), которая принимает строку, проверяет её на точное совпадение с исходным текстом этой же самой программы и печатает (или возвращает) результат этой проверки (true/false, 1/0, "да"/"нет" и т.д.). Если язык имеет встроенную команду для получения исходного текста программы, не используйте её.


Математики любят всякие глупые задачи придумывать , которые на практике совершенно бесполезны.
Re: Антиквайн
От: omgOnoz  
Дата: 24.07.15 08:14
Оценка:
Здравствуйте, nikov, Вы писали:

N>Напишите на вашем любимом языке программу (или функцию), которая принимает строку, проверяет её на точное совпадение с исходным текстом этой же самой программы и печатает (или возвращает) результат этой проверки (true/false, 1/0, "да"/"нет" и т.д.). Если язык имеет встроенную команду для получения исходного текста программы, не используйте её.


Вы плохо продумываете условия задачи.

Можно ведь положить исходный код рядом с программой (или положить в программу как ресурс) в виде текстового файла. И сравнивать текст с текстовым файлом.

Вот еще есть такое: http://habrahabr.ru/post/119676/
Отредактировано 24.07.2015 8:16 omgOnoz . Предыдущая версия . Еще …
Отредактировано 24.07.2015 8:15 omgOnoz . Предыдущая версия .
Re[2]: Антиквайн
От: Кодт Россия  
Дата: 24.07.15 10:11
Оценка:
Здравствуйте, omgOnoz, Вы писали:

N>>Напишите на вашем любимом языке программу (или функцию), которая принимает строку, проверяет её на точное совпадение с исходным текстом этой же самой программы и печатает (или возвращает) результат этой проверки (true/false, 1/0, "да"/"нет" и т.д.). Если язык имеет встроенную команду для получения исходного текста программы, не используйте её.


O>Вы плохо продумываете условия задачи.


O>Можно ведь положить исходный код рядом с программой (или положить в программу как ресурс) в виде текстового файла. И сравнивать текст с текстовым файлом.


Это расширенно подпадает под "если имеет встроенную..."
Перекуём баги на фичи!
Re: Антиквайн
От: Кодт Россия  
Дата: 24.07.15 10:35
Оценка:
Здравствуйте, nikov, Вы писали:

N>Напишите на вашем любимом языке программу (или функцию), которая принимает строку, проверяет её на точное совпадение с исходным текстом этой же самой программы и печатает (или возвращает) результат этой проверки (true/false, 1/0, "да"/"нет" и т.д.). Если язык имеет встроенную команду для получения исходного текста программы, не используйте её.


Дело нехитрое.
Идея такая
— пишем квайн
— но вместо функций вывода в stdout используем вывод в строковый буфер
— в эпилоге читаем строку из stdin либо argv[1] и сравниваем

Как вариант, — делаем парсер ввода на лету
— вместо функций вывода в stdout используем вот такую функцию
void my_puts(const char* s) {
  for( ; *s; ++s) {
    if (getchar() != *s) exit(1);
  }
}
Перекуём баги на фичи!
Re: Антиквайн
От: Кодт Россия  
Дата: 24.07.15 10:52
Оценка:
Здравствуйте, nikov, Вы писали:

N>Напишите на вашем любимом языке программу (или функцию), которая принимает строку, проверяет её на точное совпадение с исходным текстом этой же самой программы и печатает (или возвращает) результат этой проверки (true/false, 1/0, "да"/"нет" и т.д.). Если язык имеет встроенную команду для получения исходного текста программы, не используйте её.


Чтоб не быть голословным
import sys

src = [
  '\'',
  '\\',
  '\n',
  '',
  '  ',
  ',',
  'n',
  'import sys',
  '',
  'src = [',
  ']',
  '',
  'QUOTE, SLASH, NL, EMPTY, TAB, COMMA, N = src[0:7]',
  '',
  'dump = EMPTY',
  '',
  'def puts(s):',
  '  global dump',
  '  dump += s + NL',
  '',
  'def putesc(s):',
  '  puts(TAB + QUOTE + SLASH + s + QUOTE + COMMA)',
  '',
  'def putsrc(i):',
  '  puts(TAB + QUOTE + s + QUOTE + COMMA)',
  '',
  '[puts(s) for s in src[7:10]]',
  '[putesc(s) for s in src[0:2]]',
  '[putesc(s) for s in src[6:7]]',
  '[putsrc(s) for s in src[3:]]',
  '[puts(s) for s in src[10:]]',
  '',
  'print sys.stdin.read() == dump',
]

QUOTE, SLASH, NL, EMPTY, TAB, COMMA, N = src[0:7]

dump = EMPTY

def puts(s):
  global dump
  dump += s + NL

def putesc(s):
  puts(TAB + QUOTE + SLASH + s + QUOTE + COMMA)

def putsrc(i):
  puts(TAB + QUOTE + s + QUOTE + COMMA)

[puts(s) for s in src[7:10]]
[putesc(s) for s in src[0:2]]
[putesc(s) for s in src[6:7]]
[putsrc(s) for s in src[3:]]
[puts(s) for s in src[10:]]

print sys.stdin.read() == dump
Перекуём баги на фичи!
Re: Антиквайн
От: ononim  
Дата: 24.07.15 11:24
Оценка:
N>Напишите на вашем любимом языке программу (или функцию), которая принимает строку, проверяет её на точное совпадение с исходным текстом этой же самой программы и печатает (или возвращает) результат этой проверки (true/false, 1/0, "да"/"нет" и т.д.). Если язык имеет встроенную команду для получения исходного текста программы, не используйте её.
Написать компилятор какого-либо языка на самом этом языке.Встроить в него функцию сравнения двух бинарников. Дальше все очевидно... Ну да, конечно это не 100% однозначность, но может оно и к лучшему
Как много веселых ребят, и все делают велосипед...
Отредактировано 24.07.2015 11:32 ononim . Предыдущая версия .
[upd] Re: Антиквайн
От: ononim  
Дата: 24.07.15 12:11
Оценка: 15 (1)
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);}
Как много веселых ребят, и все делают велосипед...
Отредактировано 24.07.2015 20:05 ononim . Предыдущая версия . Еще …
Отредактировано 24.07.2015 19:58 ononim . Предыдущая версия .
Re[2]: Антиквайн
От: Кодт Россия  
Дата: 24.07.15 12:32
Оценка:
Здравствуйте, Кодт, Вы писали:
...
  'print sys.stdin.read() == dump',
...
print sys.stdin.read() == dump

Переделываем обратно в квайн:
...
  'sys.stdin.write(dump)',
...
sys.stdin.write(dump)
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.