Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
LISTПопробуем написать квайн. Для этого возьмём инструкцию языка для вывода и передадим ей как параметр код программы. Однако в коде мы снова используем этот же код и так далее — возникает бесконечная рекурсия. Но что можно сделать для того, чтобы не передавать строковую константу? Решение — поместить строку (копию части кода) в переменную. Для удобства назовём такую строку s-строкой, а переменную с этой строкой — s-переменной. Чтобы и в s-переменной не было рекурсии, мы просто исключим из неё фрагмент задания этой самой переменной. То есть, выглядит это примерно так:
C:
const char *s=«const char *s=;»;
seek( DATA, 0, 0 );
print ;
__DATA__
Более того, мы не будем использовать «хаки» интерпретеруемых языков вроде операции вывода исходного кода и функций типа eval
(function quine() {
console.log("(" + quine.toString() + "())");
}())
(function () {
console.log("(" + arguments.calee.toString() + "())");
}())
print(open(__file__).read())<?php printf($a='<?php printf($a=%c%s%c,39,$a,39);',39,$a,39);
package ru.fso.test;public class Quine {public static void main(String[] args) {char sq = '"';String cf = "%c";String sf = "%s";String s = "package ru.fso.test;public class Quine {public static void main(String[] args) {char sq = '%c';String cf = %c%s%c;String sf = %c%s%c;String s = %c%s%c;System.out.println(String.format(s,sq,sq,cf,sq,sq,sf,sq,sq,s,sq));}}";System.out.println(String.format(s,sq,sq,cf,sq,sq,sf,sq,sq,s,sq));}}T<?php
header("Content-type: text/plain; charset=UTF-8");
function hexToStr($hex)
{
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2)
{
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
$param = "|3c3f706870200d0a202020206865616465722822436f6e74656e742d747970653a20746578742f706c61696e3b20636861727365743d5554462d3822293b0d0a2020202066756e6374696f6e20686578546f5374722824686578290d0a202020207b0d0a202020202020202024737472696e673d27273b0d0a2020202020202020666f72202824693d303b202469203c207374726c656e2824686578292d313b2024692b3d32290d0a20202020202020207b0d0a20202020202020202020202024737472696e67202e3d206368722868657864656328246865785b24695d2e246865785b24692b315d29293b0d0a20202020202020207d0d0a202020202020202072657475726e2024737472696e673b0d0a202020207d0d0a2020202024706172616d203d20227c223b0d0a20202020246465636f646564203d20686578546f537472287375627374722824706172616d2c3129293b0d0a20202020666f72202824693d303b202469203c207374726c656e28246465636f646564293b202b2b2469290d0a202020207b0d0a096966286f726428246465636f6465645b24695d293d3d313234297b0d0a2020202020202020202020206563686f2024706172616d3b0d0a20202020202020207d656c73657b0d0a2020202020202020202020206563686f20246465636f6465645b24695d3b0d0a20202020202020207d0d0a202020207d0d0a3f3e";
$decoded = hexToStr(substr($param,1));
for ($i=0; $i < strlen($decoded); ++$i)
{
if(ord($decoded[$i])==124){
echo $param;
}else{
echo $decoded[$i];
}
}
?>
<?php
header("Content-type: text/plain; charset=UTF-8");
function hexToStr($hex)
{
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2)
{
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
$param = "|3c3f706870200d0a202020206865616465722822436f6e74656e742d747970653a20746578742f706c61696e3b20636861727365743d5554462d3822293b0d0a2020202066756e6374696f6e20686578546f5374722824686578290d0a202020207b0d0a202020202020202024737472696e673d27273b0d0a2020202020202020666f72202824693d303b202469203c207374726c656e2824686578292d313b2024692b3d32290d0a20202020202020207b0d0a20202020202020202020202024737472696e67202e3d206368722868657864656328246865785b24695d2e246865785b24692b315d29293b0d0a20202020202020207d0d0a202020202020202072657475726e2024737472696e673b0d0a202020207d0d0a2020202024706172616d203d20227c223b0d0a20202020246465636f646564203d20686578546f537472287375627374722824706172616d2c3129293b0d0a20202020666f72202824693d303b202469203c207374726c656e28246465636f646564293b202b2b2469290d0a202020207b0d0a096966286f726428246465636f6465645b24695d293d3d313234297b0d0a2020202020202020202020206563686f2024706172616d3b0d0a20202020202020207d656c73657b0d0a2020202020202020202020206563686f20246465636f6465645b24695d3b0d0a20202020202020207d0d0a202020207d0d0a3f3e";
$decoded = hexToStr(substr($param,1));
for ($i=0; $i < strlen($decoded); ++$i)
{
if(ord($decoded[$i])==124){
echo $param;
}else{
echo $decoded[$i];
}
}
?>
var a='"';var s="var a='';var s=;console.log(s.substr(0,7)+a+s.substr(7,8)+a+s+a+s.substr(15));";console.log(s.substr(0,7)+a+s.substr(7,8)+a+s+a+s.substr(15));
var o={q:'\'',b:'\\',s:'var o={q:_q_b_q_q,b:_q_b_b_q,s:_q_s_q};console.log(Object.keys(o).reduce(function(a,k){return a.split(_q__q+k).join(o[k])},o.s))'};console.log(Object.keys(o).reduce(function(a,k){return a.split('_'+k).join(o[k])},o.s))
Как писать квайны