Задачка из книги Under pressure and on time
От: Pascal  
Дата: 19.05.03 07:34
Оценка:
Купил книжку Эда Салливана и там обнаружил задачку, которую они дают кандидатам на вакансии:

Кандидатов просят написать программу, отображающую на экране свой собственный исходный текст не обращаясь к чтению файлов.

Как это возможно?

Задача неоднократно встречалась на форуме.
здесь
Автор: Flamer
Дата: 17.09.02

здесь
Автор: NickK
Дата: 17.01.03

и, возможно, еще...
— К
Re: Задачка из книги Under pressure and on time
От: mogadanez Чехия  
Дата: 19.05.03 08:00
Оценка:
Здравствуйте, Pascal, Вы писали:

P>Купил книжку Эда Салливана и там обнаружил задачку, которую они дают кандидатам на вакансии:


P>Кандидатов просят написать программу, отображающую на экране свой собственный исходный текст не обращаясь к чтению файлов.


P>Как это возможно?


поищи по форуму тут такое было
например

using System;
namespace Mogadan
{
class SelfSource
{
[STAThread]
static void Main(string[] args)
{
String[] Str= new string[40];
String newline=Environment.NewLine;
String quota="\"";
String comma=";";
String slash="\\";
Str[0]="using System;";
Str[1]="namespace Mogadan";
Str[2]="{";
Str[3]="class SelfSource";
Str[4]="{";
Str[5]="[STAThread]";
Str[6]="static void Main(string[] args)";
Str[7]="{";
Str[8]="String[] Str= new string[40];";
Str[9]="String newline=Environment.NewLine;";
Str[10]="String quota=\"\\\"\";";
Str[11]="String comma=\";\";";
Str[12]="String slash=\"\\\\\";";
Str[13]="for (int i=0;i<13;i++)";
Str[14]="{";
Str[15]="Console.WriteLine(Str[i]);";
Str[16]="}";
Str[17]="for (int i=0;i<39;i++)";
Str[18]="{";
Str[19]="Console.Write(Str[37]+i.ToString()+Str[38]+\"=\"+quota);";
Str[20]="for (int j=0;j<Str[i].Length;j++)";
Str[21]="{";
Str[22]="if (Str[i][j]=='\\\\') Console.Write(slash+slash);";
Str[23]="else if (Str[i][j]=='\\\"') Console.Write(slash+quota);";
Str[24]="else Console.Write(Str[i][j]);";
Str[25]="}";
Str[26]="Console.Write(quota+comma+newline);";
Str[27]="}";
Str[28]="for (int i=13;i<36;i++)";
Str[29]="{";
Str[30]="Console.WriteLine(Str[i]);";
Str[31]="}";
Str[32]="Console.ReadLine();";
Str[33]="}";
Str[34]="}";
Str[35]="}";
Str[36]="}";
Str[37]="Str[";
Str[38]="]";
for (int i=0;i<13;i++)
{
Console.WriteLine(Str[i]);
}
for (int i=0;i<39;i++)
{
Console.Write(Str[37]+i.ToString()+Str[38]+"="+quota);
for (int j=0;j<Str[i].Length;j++)
{
if (Str[i][j]=='\\') Console.Write(slash+slash);
else if (Str[i][j]=='\"') Console.Write(slash+quota);
else Console.Write(Str[i][j]);
}
Console.Write(quota+comma+newline);
}
for (int i=13;i<36;i++)
{
Console.WriteLine(Str[i]);
}
Console.ReadLine();
}
}
}
... << RSDN@Home 1.0 beta 7a >>
Re[2]: Задачка из книги Under pressure and on time
От: ch00k  
Дата: 19.05.03 08:08
Оценка: 14 (1)
P>>Кандидатов просят написать программу, отображающую на экране свой собственный исходный текст не обращаясь к чтению файлов.

Эх... В своё время на gwbasic это было гораздо проще...


10 LIST


Re[3]: Задачка из книги Under pressure and on time
От: mogadanez Чехия  
Дата: 19.05.03 08:22
Оценка:
C>
C>
C>10 LIST
C>


C>


именно для жтого я и посоветовал поискать по форуму
... << RSDN@Home 1.0 beta 7a >>
Re: Задачка из книги Under pressure and on time
От: Всеволод Россия  
Дата: 19.05.03 08:34
Оценка:
Здравствуйте, Pascal, Вы писали:

P>Купил книжку Эда Салливана и там обнаружил задачку, которую они дают кандидатам на вакансии:


P>Кандидатов просят написать программу, отображающую на экране свой собственный исходный текст не обращаясь к чтению файлов.


P>Как это возможно?



Например, вот так:

#include "stdio.h"
main () {char *s="main(){char *s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);}

С небольшой натяжкой — #include "stdio.h" не выводится
Re[3]: Задачка из книги Under pressure and on time
От: Кодт Россия  
Дата: 19.05.03 08:39
Оценка:
Здравствуйте, ch00k, Вы писали:

C>Эх... В своё время на gwbasic это было гораздо проще...


C>10 LIST


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

Фокус с командой LIST — в данном случае — хак, поскольку интерпретатор бейсика умеет декомпилировать код.

Вы попробуйте то же самое сделать на TurboBasic/QuickBasic/VisualBasic — и жестоко обломитесь.
(=^.^=) Neko ... << RSDN@Home 1.0 beta 7a >>
Перекуём баги на фичи!
Re[2]: Задачка из книги Under pressure and on time
От: Кодт Россия  
Дата: 19.05.03 08:42
Оценка:
Здравствуйте, Всеволод, Вы писали:

В>
В>#include "stdio.h"
В>main () {char *s="main(){char *s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);}
В>

В>С небольшой натяжкой — #include "stdio.h" не выводится

Для чистого Си необязательно декларировать импортируемые функции, поэтому #include не нужен.
Кстати, здесь тоже есть легкий хак: соответствие символа '"' и кода 34.
О где же вы, Frostbitten'а деянья? ( -_-; ) ... << RSDN@Home 1.0 beta 7a >>
Перекуём баги на фичи!
Re: Задачка из книги Under pressure and on time
От: rgl  
Дата: 19.05.03 08:51
Оценка:
А вот на HTML + JavaScript тоже можно такое написать

http://bowline.nm.ru/dk/owncode
Re: Задачка из книги Under pressure and on time
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 19.05.03 08:54
Оценка:
Здравствуйте, Pascal, Вы писали:

P>Как это возможно?


Дааа. Видать некоторые темы на RSDN будут обсуждаться вечно, хоть их уже все неоднократно и обсуждали.
А почему никто не пробует прочитать память? Ассемблером?
<< RSDN@Home 1.0 beta 6a >>
Вселенная бесконечна как вширь, так и вглубь.
Re[2]: Задачка из книги Under pressure and on time
От: Кодт Россия  
Дата: 19.05.03 09:15
Оценка:
Здравствуйте, Real 3L0, Вы писали:

R3>А почему никто не пробует прочитать память? Ассемблером?


Если в памяти находится оригинал программы — это будет хак.

А так — флаг в руки, NOP на шею, INT навстречу
(=^.^=) Neko ... << RSDN@Home 1.0 beta 7a >>
Перекуём баги на фичи!
Re: Задачка из книги Under pressure and on time
От: Аноним  
Дата: 19.05.03 10:42
Оценка:
Здравствуйте, Pascal, Вы писали:

P>Купил книжку Эда Салливана и там обнаружил задачку, которую они дают кандидатам на вакансии:


P>Кандидатов просят написать программу, отображающую на экране свой собственный исходный текст не обращаясь к чтению файлов.


P>Как это возможно?


На perl это может выглядеть примерно так:
my $code = <<'EOC';
print "Hello, World!\n";
print "2 + 2 = ".(2+2).".\n";
EOC
my $add = <<'EOA';
eval $code;
warn $@ if $@;
print "my \$code = <<'EOC';\n${code}EOC\nmy \$add = <<'EOA';\n${add}EOA\n$add";
EOA
eval $code;
warn $@ if $@;
print "my \$code = <<'EOC';\n${code}EOC\nmy \$add = <<'EOA';\n${add}EOA\n$add";

Добавлена раскраска кода. — К

можно было бы и еще подрезать...
Re[2]: Задачка из книги Under pressure and on time
От: Аноним  
Дата: 19.05.03 12:45
Оценка:
Здравствуйте, Аноним, Вы писали:

Удалено избыточное цитирование. — К
А>можно было бы и еще подрезать...

А вот и подрезанный вариант:
my $str = q(print "my \$str = q($str);\n$str";);
print "my \$str = q($str);\n$str";

Добавил раскраску кода — чтобы смайлики не появлялись. — К
программа действительно распечатывает сама себя и больше ничего вся фишка в перловских кастом-кавычках.
предыдущаяя прога могла полезный код исполнять любой и дополнительно себя распечатывать (причем полезный код не надо дублировать), в общем перл радует...
Re[3]: Задачка из книги Under pressure and on time
От: Аноним  
Дата: 19.05.03 12:50
Оценка:
Здравствуйте, Аноним, Вы писали:

Удалено избыточное цитирование. — К

А>А вот и подрезанный вариант:

А>my $str = q(print "my \$str = q($str);\n$str";);
А>print "my \$str = q($str);\n$str";


А>программа действительно распечатывает сама себя и больше ничего вся фишка в перловских кастом-кавычках.

А>предыдущаяя прога могла полезный код исполнять любой и дополнительно себя распечатывать (причем полезный код не надо дублировать), в общем перл радует...

Блин! В листинге точка с запятой и закрывающая скобка на смайлик заменились!
Обрамляйте код тегами языка: [ perl ] ... [ /perl ] — К
Re[3]: Задачка из книги Under pressure and on time
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 20.05.03 00:51
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Если в памяти находится оригинал программы — это будет хак.


В смысле "оригинал"? Просто находим место в памяти, где начинается прога, читаем и выводим N байт на экран.
<< RSDN@Home 1.0 beta 6a >>
Вселенная бесконечна как вширь, так и вглубь.
Re: Задачка из книги Under pressure and on time
От: Андрей Тарасевич Беларусь  
Дата: 20.05.03 02:35
Оценка: 8 (1)
Здравствуйте, Pascal, Вы писали:

P>Кандидатов просят написать программу, отображающую на экране свой собственный исходный текст не обращаясь к чтению файлов.


P>Как это возможно?


Такие программы называются 'quine'. На этой страничке

http://www.nyx.net/~gthompso/quine.htm

можно найти массу вариантов на разнообразных языках программирования. Здесь все это уже было.
Best regards,
Андрей Тарасевич
Re[2]: Задачка из книги Under pressure and on time
От: Аноним  
Дата: 20.05.03 05:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Pascal, Вы писали:


P>>Купил книжку Эда Салливана и там обнаружил задачку, которую они дают кандидатам на вакансии:


P>>Кандидатов просят написать программу, отображающую на экране свой собственный исходный текст не обращаясь к чтению файлов.


P>>Как это возможно?


А>На perl это может выглядеть примерно так:

А>
А>my $code = <<'EOC';
А>print "Hello, World!\n";
А>print "2 + 2 = ".(2+2).".\n";
А>EOC
А>my $add = <<'EOA';
А>eval $code;
А>warn $@ if $@;
А>print "my \$code = <<'EOC';\n${code}EOC\nmy \$add = <<'EOA';\n${add}EOA\n$add";
А>EOA
А>eval $code;
А>warn $@ if $@;
А>print "my \$code = <<'EOC';\n${code}EOC\nmy \$add = <<'EOA';\n${add}EOA\n$add";
А>



А>можно было бы и еще подрезать...



а вот и окончательный вариант:

$_ = q(print "\$_ = q($_);$_";);print "\$_ = q($_);$_";


по ссылке Андрея Тарасевича
http://www.nyx.net/~gthompso/self_perl.txt
это самое и лежит с точностью до eval, который, пожалуй, делает этот код не таким чистым
Re[4]: Задачка из книги Under pressure and on time
От: Кодт Россия  
Дата: 20.05.03 07:39
Оценка:
Здравствуйте, Real 3L0, Вы писали:

К>>Если в памяти находится оригинал программы — это будет хак.


R3>В смысле "оригинал"? Просто находим место в памяти, где начинается прога, читаем и выводим N байт на экран.


Ну уж фиг!

Ты должен будешь вывести текст на входном языке, то есть
— листинг ассемблера (дизассемблировать собственный код) — если прога писана на ассемблере
— загружаемый модуль (в формате загрузчика ОС — то есть EXE / COFF для Виндов) — если ты прямо в байткоде процессора рожал

Последняя задача более-менее просто решается для .com-файлов, где загрузчик просто копирует данные по адресу CS:100h.
О где же вы, Frostbitten'а деянья? ( -_-; ) ... << RSDN@Home 1.0 beta 7a >>
Перекуём баги на фичи!
Re[2]: Задачка из книги Under pressure and on time
От: Apapa Россия  
Дата: 20.05.03 07:50
Оценка:
Привет, Андрей Тарасевич!

АТ>Такие программы называются 'quine'. На этой страничке

АТ>http://www.nyx.net/~gthompso/quine.htm
АТ>можно найти массу вариантов на разнообразных языках программирования. Здесь все это уже было.

Интересная страничка! Здесь похоже собрали все, что есть.
Особенно мне понравились примеры на TeX (даже такое есть!) и примеры кода сразу для нескольких языков. МощЪ!!!


Здесь могла бы быть Ваша реклама!
Re[5]: Задачка из книги Under pressure and on time
От: mrhru Россия  
Дата: 20.05.03 07:56
Оценка:
Здравствуйте, Кодт, Вы писали:

К>- загружаемый модуль (в формате загрузчика ОС — то есть EXE / COFF для Виндов) — если ты прямо в байткоде процессора рожал


copy con program.exe

???

Re[6]: Задачка из книги Under pressure and on time
От: mogadanez Чехия  
Дата: 20.05.03 08:00
Оценка:
Здравствуйте, mrhru, Вы писали:

M>Здравствуйте, Кодт, Вы писали:


К>>- загружаемый модуль (в формате загрузчика ОС — то есть EXE / COFF для Виндов) — если ты прямо в байткоде процессора рожал


M>
M>copy con program.exe
M>

M>???
из файлов нельзя читать
... << RSDN@Home 1.0 beta 7a >>
Re[7]: Задачка из книги Under pressure and on time
От: mrhru Россия  
Дата: 20.05.03 08:14
Оценка: -1
Здравствуйте, mogadanez, Вы писали:

M>Здравствуйте, mrhru, Вы писали:


M>>Здравствуйте, Кодт, Вы писали:


К>>>- загружаемый модуль (в формате загрузчика ОС — то есть EXE / COFF для Виндов) — если ты прямо в байткоде процессора рожал


M>>
M>>copy con program.exe
M>>

M>>???
M> из файлов нельзя читать

Да я это привёл пример рожания программы в байткоде.
Говорят, так настоящие программисты свои программы пишут.
Re[5]: Задачка из книги Under pressure and on time
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 20.05.03 08:31
Оценка:
Здравствуйте, Кодт, Вы писали:

R3>>В смысле "оригинал"? Просто находим место в памяти, где начинается прога, читаем и выводим N байт на экран.

К>Ну уж фиг!
К>Ты должен будешь вывести текст на входном языке, то есть
К>- листинг ассемблера (дизассемблировать собственный код) — если прога писана на ассемблере

Но на ассемблере можно писать чистыми байтами (например, написать программулину в текстовом редакторе от Dos Navigator'а)
<< RSDN@Home 1.0 beta 6a >>
Вселенная бесконечна как вширь, так и вглубь.
Re[6]: Задачка из книги Under pressure and on time
От: Кодт Россия  
Дата: 20.05.03 08:51
Оценка:
Здравствуйте, Real 3L0, Вы писали:

R3>Но на ассемблере можно писать чистыми байтами (например, написать программулину в текстовом редакторе от Dos Navigator'а)


Да, конечно:
        org 100h
start:  db XXh, YYh, ZZh, TTh..... ; понеслась душа в рай

Пожалуйста. Это будет почти то же самое, что вывести байтовый дамп программы в формате .com
(=^.^=) Neko ... << RSDN@Home 1.0 beta 7a >>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.