2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3, 4  След.
 
 Получила ли программа свой же код на вход?
Сообщение09.07.2014, 10:27 
Можно ли написать программу, которая говорит передали ей или нет её собственный код? Т.е. такая программа $X$, что $X(X)=1$ и $X(P)=0$ для любых $P\neq X$.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 10:47 
Можно. И это не сложно реализовать.

-- 09.07.2014, 11:54 --

Есть похожая задача в книге Уэзерелл "Этюды для программистов": написать программу, печатающую свой собственный текст. Можно попробовать для начала решить данную задачу.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 10:56 
Это тот же quin. Только printf заменить на scanf и strcmp.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 11:04 
Используется синтаксис Javascript
function f(p){return f.toString()===p?1:0;}

Да, я уже сам придумал.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 11:08 
tenmin, это читерство. Если хотите честно, надо без рефлекшена.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 14:28 
Это в общем случае невозможно (по крайней мере для обычной машины Тьюринга). Нужна вторая программа, которая будет осуществлять сравнение кода первой программы и входных данных.

Классическая система или переменная не может "знать" собственное значение.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 14:30 
Что такое "код программы" - это текст на исходном языке или машинный код после трансляции?

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 20:55 
Аватара пользователя
Если понимать в смысле квайна — текст на исходном языке.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 21:04 
zt09 в сообщении #885741 писал(а):
Это в общем случае невозможно (по крайней мере для обычной машины Тьюринга).
Это в общем случае элементарно делается. Вот например программа, выводящая свой текст (C#):

(quin)

Код:
using System;
using System.IO;
class Program {
static void PatchProgramText(ref string programText) {
programText += "\"" +
programText
.Replace("\\", "\\\\")
.Replace("\"", "\\\"")
.Replace(Environment.NewLine, "\" + Environment.NewLine +" + Environment.NewLine + "\"") +
"\";" + Environment.NewLine +
"PatchProgramText(ref programText);" + Environment.NewLine +
"Console.Write(programText);" + Environment.NewLine +
"Console.ReadLine();" + Environment.NewLine +
"}" + Environment.NewLine +
"}" + Environment.NewLine;
}
static void Main(string[] args) {
string programText =
"using System;" + Environment.NewLine +
"using System.IO;" + Environment.NewLine +
"class Program {" + Environment.NewLine +
"static void PatchProgramText(ref string programText) {" + Environment.NewLine +
"programText += \"\\\"\" +" + Environment.NewLine +
"programText" + Environment.NewLine +
".Replace(\"\\\\\", \"\\\\\\\\\")" + Environment.NewLine +
".Replace(\"\\\"\", \"\\\\\\\"\")" + Environment.NewLine +
".Replace(Environment.NewLine, \"\\\" + Environment.NewLine +\" + Environment.NewLine + \"\\\"\") +" + Environment.NewLine +
"\"\\\";\" + Environment.NewLine +" + Environment.NewLine +
"\"PatchProgramText(ref programText);\" + Environment.NewLine +" + Environment.NewLine +
"\"Console.Write(programText);\" + Environment.NewLine +" + Environment.NewLine +
"\"}\" + Environment.NewLine +" + Environment.NewLine +
"\"}\" + Environment.NewLine;" + Environment.NewLine +
"}" + Environment.NewLine +
"static void Main(string[] args) {" + Environment.NewLine +
"string programText =" + Environment.NewLine +
"";
PatchProgramText(ref programText);
Console.Write(programText);
Console.ReadLine();
}
}
Переделать её в программу, сравнивающую свой текст с введённым, очень просто.

-- 09.07.2014, 22:23 --

Skeptic в сообщении #885742 писал(а):
Что такое "код программы" - это текст на исходном языке или машинный код после трансляции?
Между этими вариантами нет принципиальной разницы.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 23:11 
warlock66613 в сообщении #885911 писал(а):
Между этими вариантами нет принципиальной разницы.

Есть, причём именно принципиальная. Один и тот же алгоритм может быть запрограммирован как заблагорассудится. Благорассуженность же формализовать невозможно. Поэтому исходная постановка задачки, без уточнений -- бессмысленна.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 23:42 
Но ведь для каждой заблагорассуженности есть конкретный код программы. Для любого конкретного тьюринг-полного языка задача корректна и отвечается словом «да». :-) Хоть машинный, хоть высокого уровня — и не важно, что какой-нибудь транслятор не переведёт программу на втором в программу на первом или другом втором, или ещё как-нибудь.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение09.07.2014, 23:57 
arseniiv в сообщении #886015 писал(а):
Но ведь для каждой заблагорассуженности есть конкретный код программы.

Но ведь тут проблема вовсе не в коде программы. А в законах, по которым сей код строится.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение10.07.2014, 12:23 
ewert в сообщении #886020 писал(а):
А в законах, по которым сей код строится.
Код не строится по законам. Код пишется программистом (иногда опосредовано, через компилятор) так как ему хочется.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение10.07.2014, 17:39 
ewert в сообщении #886001 писал(а):
Поэтому исходная постановка задачки, без уточнений -- бессмысленна.


Знаете, что такое мат. индукция? Это доказательство бесконечной серии утверждений с помощью форумлирования алгоритма создания доказательства утверждения под любым номером.

У всех Тьюринг-полных языков есть особенности, которые делают их равнозначными МТ. Значит, совершенно точно, есть алгоритм решения поставленной в первом посте задачи для любого полного языка так же, как он есть для МТ.

 
 
 
 Re: Получила ли программа свой же код на вход?
Сообщение10.07.2014, 22:30 
warlock66613
Согласен, я по сути неверно ответил на поставленный вопрос. Из того, что это нельзя сделать в общем случае, вовсе не следует, что этого нельзя сделать для конкретной программы, т.е. для случая X - константа, что в общем-то и подразумевается в условии задачи.

Хотя, при очень сильном желании здесь можно и придраться к условию.

 
 
 [ Сообщений: 53 ]  На страницу 1, 2, 3, 4  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group