|
|
|
| Ну, граждане алкоголики, хулиганы, тунеядцы, программисты, а также и примкнувшие к ним романтики ножа и топора мускуля и апача, кто хочет сегодня поработать показать удаль молодецкую?
Не желает ли кто-нибудь из вас посоревноваться в совершенно бесполезном занятии - написании интроспективных программ (программ, печатающих один-в-один собственный исходник) ?
Неужели ни у кого даже край извилины не зашевелился на предмет того, чтобы попробовать? | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 18:31)
| | сам исполняемый файл программы нельзя использовать? | |
|
|
|
|
|
|
|
для: psychomc
(07.11.2010 в 19:05)
| | на чтение?
нет конечно :) | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 19:22)
| | тогда надо подумать :) | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 18:31)
| | *сказал лишнее*
Хотя, боюсь, не смогу воспроизвести такую даже для php :) Хм. | |
|
|
|
|
|
|
|
для: neadekvat
(07.11.2010 в 20:32)
| | Понимаю, что с непривычки задача кажется жутко страшной.
Но на самом деле - решается :)
Я тут придумал разной степени сложности ограничения:
1. произвольно
2. без sprintf'оподобных стандартных функций
3. без стандартных функций (можно пользоваться только примитивами strlen, count, chr, ord )
4. без стандартных функций вообще.
и ничего так. Решается :)) | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 18:31)
| | Печатать в смысле свое, как разработчик, сразу на принтер, или отдавать в файл для печати? | |
|
|
|
|
|
|
|
для: sim5
(07.11.2010 в 20:49)
| | выводить в стандартный выходной поток.
в терминах php - echo | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 20:52)
| | Тьфю..... вот косноязычность языков программирования, когда понятие печать имеет другой, сексуальный, оттенок, и не поймешь о чем просят. :) | |
|
|
|
|
|
|
|
для: sim5
(07.11.2010 в 20:53)
| | для адептов строгих формулировок был оставлен термин "интроспективный" | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 20:56)
| | Интроспекция (лат. introspecto, смотрю внутрь) — метод, позволяющий иметь представления о своей сущности: структуре, организации и т.п.
Как-то неоднозначно все равно. Я думал печать на принтере, уже было извилины беспокоить начал, а тут.... в общем интерес пропал. :) | |
|
|
|
|
|
|
|
для: sim5
(07.11.2010 в 20:58)
| | печать на принтере в вырожденном варианте подходящего принтера выполняется путем запуска
php.exe -f file.php >lpt1
|
в менее вырожденном - обеспечивается драйверами этого самого принтера.
писать драйвер никто не предлагает, это скучно, в конце концов. :))) | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 21:01)
| | Ну что это такое: php.exe -f file.php >lpt1... это не документ, это его зарисовка, я думал действительно - шрифты, сопутствующий цвет и т.п...
Не надо писать драйвер, под Win есть функции работы с принтером. | |
|
|
|
|
|
|
|
для: sim5
(07.11.2010 в 20:58)
| | зато в контексте с программой однозначно
Задача состоит в написании программы, которая в ходе своей работы выводит на экран либо в файл свой исходный код. Само собой разумеющееся, нельзя использовать файл с кодом или системную информацию, например адрес ячейки памяти, возможно содержащей данный код.
Такая программа называется интроспективной. Также существует теорема, которая гласит, что возможно написать такую программу на любом языке программирования.
http://habrahabr.ru/tag/%D0%B8%D0%BD%D1%82%D1%80%D0%BE%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0/ | |
|
|
|
|
|
|
|
для: psychomc
(07.11.2010 в 21:20)
| | вместо того, чтоб давать ссылку в таком виде, который окно в горизонтальный скроллинг рвет, лучше бы пример решения привели. | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 21:27)
| | а можно так? :)
файл index.php
<?php
require("index2.php")
?>
|
файл index2.php
<?php
echo
nl2br(htmlspecialchars('<?php
require("index2.php")
?>'));
?>
|
| |
|
|
|
|
|
|
|
для: psychomc
(07.11.2010 в 22:24)
| | 1. все эти nl2br и htmlspecialchars - лишние. Поскольку сверяется тело отклика (Исх код HTML в терминах браузера)
2.читать прямо или косвенно файл, как я уже сказал, недопустимо.
Нужно чтобы алгоритм скрипта формировал собственный код самостоятельно, а не читал первоисточник. | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 23:09)
| | я то думал, что это не подпадает под ограничения. тем более ведь require это оператор, а не функция :) | |
|
|
|
|
|
|
|
для: psychomc
(07.11.2010 в 23:31)
| | В самом общем ключе функциями пользоваться можно.
Файл исходника читать нельзя.
Можете считать, что php запущен через pipe, и файла с исходником нет как такового. | |
|
|
|
|
|
|
|
для: psychomc
(07.11.2010 в 21:20)
| | Я уже сказал, мне такое не интересно. ;-) | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 18:31)
| |
<?php
/* some code here */
show_source(__FILE__);
?>
|
| |
|
|
|
|
|
|
|
для: mihdan
(07.11.2010 в 22:48)
| | это однозначно читерство.
с таким же успехом можно сделать echo file_get_contents(__FILE__); | |
|
|
|
|
|
|
|
для: mihdan
(07.11.2010 в 22:48)
| | в третий раз.
читать источник нельзя по условиям.
Ни __FILE__ ни PHP_SELF ни прочие эквиваленты.
Читать файл как таковой - можно, если уж так хочется (хотя , как показывает опыт, не нужно).
Но перед этим в него нужно сперва записать. | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 18:31)
| | а где должен выводиться этот код? в начале html страницы или в конце, или как ? чет не очень понятно.
можно тупо писать код в виде строк, которые потом выполнять и их же на экран выводить. только появляется одна большая заморочка - подсветка синтаксиса уже не к черту. | |
|
|
|
|
|
|
|
для: deimand
(08.11.2010 в 00:07)
| | выводиться должен (будучи запущенным через браузер) в качестве кода html-страницы.
Не перед, не после, а вместо.
<?php
echo '<?php
....
?>';
?>
| Понятно, что браузер, вероятнее всего, нарисует белое окно - суть не в этом.
И уверяю Вас, задача и без подсветки решается ой как небыстро. :) | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 00:08)
| | >выводиться должен (будучи запущенным через браузер) в качестве кода html-страницы.
тогда зачем такого рода скрипты вообще запускать, если единственная смысловая нагрузка - показ исходного кода.
если скрипт не имеет результата работы, из чего по вашему он должен состоять?
задача из жанра "попробуй написать такой код, чтоб в браузер ничего не пролезло"
ответ видимо "ничего писать и не надо" | |
|
|
|
|
|
|
|
для: deimand
(08.11.2010 в 00:19)
| | Полезть должно из php-процесса, в браузере результат виден по команде "исх.код HTML"..
Практической пользы у этого класса задач нету никакой, и в исходном посте я об этом предупредил.
Но пищу для ума они дают, будьте-нате.
Маситиые зубры вообще решают мультиязыковую задачу.
программа на С генерирует исходник на руби.
программа на руби генерирует исходник на C#
программа на C# генерирует исходник на хаскеле
программа на хаскеле генерирует начальный исходник на С
Это кольцо в 4 шага, а были корифеи, знавшие (и закольцовывавшие) десятки языков.
Зачем они это делают? | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 18:31)
| | не возможно.
это
<?php
echo '<?php
echo "";
?>';
?>
|
покажет в исходном коде это
исходный код браузера вседа будет на пару строк отличаться. а задача, как вы ее трактуете - выдать один в один. | |
|
|
|
|
|
|
|
для: deimand
(08.11.2010 в 00:27)
| | Так в том то и соль, чтобы написать так, чтоб исходник совпадал с выдачей побайтово.
и это возможно :)
Какой мне смысл обманывать?
и карты раскрывать сразу смысла никакого. Может кого зацепит, и он согласится голову пломать. | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 00:29)
| | то есть смысл задачи именно это недоразумение и обойти?
нужно написать одну функцию, кажется. завтра обязательно попробую :) | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 00:29)
| | ну а подсказки будут?
я думаю что нужно создать строку функции рекурсии, которая при исполнении функцией eval эту рекурсию остановит, функция должна быть заточена на вывод самой себя с некоторыми изменениями в случае этой самой остановки. так мне кажется только потому, что все языки программирования должны иметь функцию eval. | |
|
|
|
|
|
|
|
для: deimand
(08.11.2010 в 01:06)
| | Большинство языков функцию eval не имеют, ибо компилируемые, а не интерпретируемые.
Те три или четыре варианта кода, которые я сегодня обтачивал, этой функцией не пользовались- ни один.
Но мыслите в верном направлении, просто без eval можно и обойтись :) | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 01:24)
| | думаю следует думать в направление функции с "рекурсией" (один раз ) ). Вечером попробую | |
|
|
|
|
|
|
|
для: Гость
(08.11.2010 в 05:02)
| | замечательно.
Двое уже есть.
Я надеюсь, что neadekvat передумает и всё ж тоже подключится. | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 18:31)
| | Набросал сначала самое простое (надо ж отчего-то отталкиваться):
<?php
$a = '<?php
$a = %s;
printf($a, $a);';
printf($a, $a);
|
Одна проблема, пока не знаю, как решить - кавычек после печати, увы, нет | |
|
|
|
|
|
|
|
для: neadekvat
(08.11.2010 в 13:41)
| | начало доброе. Допиливайте :) | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 13:43)
| |
<?php
$a = '<?php
$a = "%s";
printf($a, $a);';
printf($a, $a);
|
Вот уже с кавычками, но теперь они меняются с одинарных на парные | |
|
|
|
|
|
|
|
для: neadekvat
(08.11.2010 в 13:47)
| | Вот, теперь как надо, кажется:
<?php
$a = '<?php
$a = %c%s%c;
printf($a, 39, $a, 39);';
printf($a, 39, $a, 39);
|
| |
|
|
|
|
|
|
|
для: neadekvat
(08.11.2010 в 13:51)
| | по первой ступени - зачОт :) | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 14:08)
| |
<?php
$a = '<?php
$a = '; $b = 'echo $a, chr(39), $a, chr(39), chr(59), chr(32), chr(36), chr(98), chr(32), chr(61), chr(32), chr(39), $b, chr(39), chr(59), chr(10), $b;';
echo $a, chr(39), $a, chr(39), chr(59), chr(32), chr(36), chr(98), chr(32), chr(61), chr(32), chr(39), $b, chr(39), chr(59), chr(10), $b;
|
| |
|
|
|
|
|
|
|
для: neadekvat
(08.11.2010 в 14:38)
| | грязно.
из за символов конца строки. | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 14:48)
| | Не совсем понял, о чем вы | |
|
|
|
|
 478 байт |
|
|
для: neadekvat
(08.11.2010 в 14:51)
| | см.аттач.
Но вообще Вам респект и уважуха, так сказать:)
PS. (для других участников родео.)
Господа, публикуйте, пожалуйста, свои версии.
Вот мои скрипты на скрипты лидера совершенно непохожи, вероятно у Вас будет совсем по-другому! | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 15:07)
| |
<?php
$s = 'echo "<?php\n\$s = ".chr(39).$s.chr(39).";\n$s";';
echo "<?php\n\$s = ".chr(39).$s.chr(39).";\n$s";
|
Мне вот интересно, без функции chr() можно обойтись? | |
|
|
|
|
|
|
|
для: Drago
(08.11.2010 в 16:23)
| | Тоже неплохо. Хотя переносы строк тоже неидеальны.
>Мне вот интересно, без функции chr() можно обойтись?
я обошелся. Вообще без единой встроенной.
Правда мне пришлось написать свою. | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 16:27)
| |
<?php
$m;$s='<?php
$m;
echo substr(str_replace(chr(36)."m;",chr(36)."m;".chr(36)."s=".chr(39).$s.chr(39).";",$s),0);
?>';
echo substr(str_replace(chr(36)."m;",chr(36)."m;".chr(36)."s=".chr(39).$s.chr(39).";",$s),0);
?>
|
| |
|
|
|
|
|
|
|
для: root
(08.11.2010 в 16:30)
| | неопределенная переменная, нет разве? | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 16:32)
| | O.o
Мне ничего такого не сказало, но у меня под IIS'ом.. )). | |
|
|
|
|
|
|
|
для: root
(08.11.2010 в 16:35)
| | мне тоже ничего не сказало :) Но ведь неопределенная? | |
|
|
|
|
 222 байт |
|
|
для: Trianon
(08.11.2010 в 16:37)
| | >Но ведь неопределенная?
это факт ))
можно поменять на $m=0 | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 16:27)
| | >Тоже неплохо. Хотя переносы строк тоже неидеальны.
Чесно говоря, это легко исправляется. Просто не хотелось пихать chr() всюду. Портит внешний вид, знаете ли. :)
>>Мне вот интересно, без функции chr() можно обойтись?
>
>я обошелся. Вообще без единой встроенной.
>Правда мне пришлось написать свою.
Я так понимаю это был исключительно принципиальный шаг? | |
|
|
|
|
|
|
|
для: Drago
(08.11.2010 в 16:38)
| | >>>Мне вот интересно, без функции chr() можно обойтись?
>>я обошелся. Вообще без единой встроенной.
>>Правда мне пришлось написать свою.
>Я так понимаю это был исключительно принципиальный шаг?
знать бы )))
Вот код:
<?php
function a($l, $r, $x)
{ $q = "'"; $e = '\\';
for($i = 0; $i < $r; $i++)
{
if($i+$l == $r)
{
echo $q;
for($j = 0; $j < $r; $j++)
{
if($x[$j] == $q || $x[$j] == $e) echo $e;
echo $x[$j];
}
echo $q;
}
echo $x[$i];
}
}
a(10, 366,
'<?php
function a($l, $r, $x)
{ $q = "\'"; $e = \'\\\\\';
for($i = 0; $i < $r; $i++)
{
if($i+$l == $r)
{
echo $q;
for($j = 0; $j < $r; $j++)
{
if($x[$j] == $q || $x[$j] == $e) echo $e;
echo $x[$j];
}
echo $q;
}
echo $x[$i];
}
}
a(10, 366,
);
?>
'
);
?>
|
Чем этот код примечателен, так это тем, что насквозь кондовый, без изюминок, просто написан в лоб. | |
|
|
|
|
 739 байт |
|
|
для: Trianon
(08.11.2010 в 16:55)
| | У меня в выводе вызов функции потерялся. :( | |
|
|
|
|
 7.6 Кб |
|
|
для: Drago
(08.11.2010 в 17:04)
| | поклёп.
см. аттач. | |
|
|
|
|
 18.2 Кб |
|
|
для: Trianon
(08.11.2010 в 17:14)
| | Drago прав, в двух местах не совпадает. | |
|
|
|
|
|
|
|
для: Root
(08.11.2010 в 17:20)
| | При копи-пасте с форума, функция не работает, увы. | |
|
|
|
|
|
|
|
для: Drago
(08.11.2010 в 17:21)
| | там наверняка дело в завершающем конце строки.
Функция тупо ориентирована на жесткую длину файла.
И таки да - на RFC-шные CRLF
Последнее можно было бы переделать, но раздувать и без того "не самый короткий" код желания не было. :) | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 17:25)
| | Все таки расшевелили "улей"? )) | |
|
|
|
|
|
|
|
для: sim5
(08.11.2010 в 19:33)
| | ненуачо?
кто-то недоволен? :))) | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 22:09)
| | Нет, почему, Фсе по науке )
>Ну, граждане алкоголики, хулиганы, тунеядцы
То есть "трутни", зажужжали.... :) | |
|
|
|
|
|
|
|
для: sim5
(08.11.2010 в 22:19)
| | для относительно непростой головоломки, и после продолжительного перерыва, в отсутствие призового фонда и начальника транспортного цеха опять же отклик вполне себе неплохой, я считаю :) | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 22:34)
| | Ну и я туда же в калашный ряд )))
Не дотянул совсем без функций, но зато не списывал:
<?php
$a = chr(39);
class Example
{
private $clone;
public function __construct($text, $a)
{
echo '<?php'. $text;
$this->a = $a;
$this->clone = $text;
}
public function __clone()
{
echo ' $obj = new Example('. $this->a . addslashes($this->clone) . $this->a .', $a);
clone $obj;';
}
}
$obj = new Example('
$a = chr(39);
class Example
{
private $clone;
public function __construct($text, $a)
{
echo \'<?php\' .$text;
$this->a = $a;
$this->clone = $text;
}
public function __clone()
{
echo \' $obj = new Example(\'. $this->a . addslashes($this->clone) . $this->a .\', $a);
clone $obj;\';
}
}
', $a);
clone $obj;
|
| |
|
|
|
|
|
|
|
для: Николай2357
(09.11.2010 в 08:36)
| | мамо... класс... объект... мамо, роди меня обратно срочччно!!
:)))
не, ну что я скажу, достойный экземпляр :))
насчет "не списывал" - верю :)
------
.покажу-ка я еще варианты, которые пришли в голову перед тем, как я затеял всю эту бучу.
вариант со sprintf практически совпал с тем, что показал neadekvat, разве только закрывающий ?> был на месте.
вариант без форматных преобразований , но с str_replace
<?php
function a($x) { echo str_replace(chr(35), chr(0x27).$x.chr(0x27), $x) ; }
$v =
'<?php
function a($x) { echo str_replace(chr(35), chr(0x27).$x.chr(0x27), $x) ; }
$v =
#;
a($v);
?>
';
a($v);
?>
|
вариант без строковых функций
<?php
function a($x) {
for($i = 0; $i < strlen($x); $i++)
echo $x[$i] == chr(35) ? chr(0x27).$x.chr(0x27) : $x[$i]; }
$v =
'<?php
function a($x) {
for($i = 0; $i < strlen($x); $i++)
echo $x[$i] == chr(35) ? chr(0x27).$x.chr(0x27) : $x[$i]; }
$v =
#;
a($v);
?>
';
a($v);
?>
|
ну а вариант без функций вообще - это тот самый тяжеловес, который я показал (08.11.2010 в 16:55) | |
|
|
|
|
 361 байт |
|
|
для: Root
(08.11.2010 в 17:20)
| | так... а если я файл аттачем прикреплю, проверьте, плиз? | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 17:24)
| | А вот так работает. :) | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2010 в 17:24)
| | да, так одинаково. | |
|
|
|
|
 481 байт |
|
|
для: Trianon
(08.11.2010 в 17:24)
| | я забираю свои слова назад по поводу невозможности :)
<?php
function a($b)
{
$c = str_replace("\\", "\\\\", $b);
$d = str_replace("'", "\'", $c);
return $d;
}
$e = '; echo $i . $f . a($i) . $f . $e; ?>';
$f = "'";
$g = "\\";
$h = "?>";
$i = '<?php
function a($b)
{
$c = str_replace("\\\\", "\\\\\\\\", $b);
$d = str_replace("\'", "\\\'", $c);
return $d;
}
$e = \'; echo $i . $f . a($i) . $f . $e; ?>\';
$f = "\'";
$g = "\\\\";
$h = "?>";
$i = '; echo $i . $f . a($i) . $f . $e; ?>
|
и тоже хотел бы посмотреть еще варианты реализации.
на всякий случай аттач. | |
|
|
|
|
|
|
|
для: deimand
(09.11.2010 в 01:10)
| | $h = "?>"; вообще лишнее | |
|
|
|
|
|
|
|
для: Trianon
(07.11.2010 в 18:31)
| | JS:
function a(){alert(a+'a()')}a()
|
| |
|
|
|
|
|
|
|
для: RMW
(08.11.2010 в 15:58)
| | >function a(){alert(a
незачет.
применяется встроенная в язык интроспективность.
Фактически это аналогично чтению исходника. | |
|
|
|