PHPでフィボナッチ数列を出力するソースコードを出力するプログラム
Quineみたいなものだけど、自身のソースコードを次々に書き換えて
それを新たに起動したPHPプロセスに標準入力として与えている。
fib.php
<?php function php($input) { $process = proc_open('php', array(array('pipe', 'r'), array('pipe', 'w')), $pipes); if (is_resource($process)) { fwrite($pipes[0], $input); fclose($pipes[0]); $output = stream_get_contents($pipes[1]); fclose($pipes[1]); proc_close($process); return $output; } } function callback($output) { $n = 50; $lines = explode("\n", trim($output)); $count = count($lines); $lines[] = end($lines) + prev($lines); $f = __FILE__; $s = file_get_contents($f); $s = preg_replace("/__FILE__[;]/", "'$f';", $s); $s = preg_replace('/0\n1\n/', implode("\n", $lines), $s); return $count < $n ? php($s) : end($lines); } ob_start("callback") ?> 0 1 <?php ob_end_flush() ?>
Result
$ time php fib.php 12586269025 php fib.php 0.51s user 0.28s system 92% cpu 0.851 total