Quine программасы же Quine - бул аткарылганда өзүнүн баштапкы кодун чыгарган программа. Квин, мисалы, аны камтыган файлдын мазмунун басып чыгаруу же өзүнүн өкүлчүлүгүн басып чыгаруу үчүн интроспективдүү жөндөмдөрдү колдонуу менен "өзүнчө кадам таштабашы" мүмкүн. Анын ордуна, ал өзүнүн баштапкы кодун эсептөө керек.
Мындай программаны түзүүнүн классикалык жолу эки кадам менен ишке ашат:
- Интерполяция үчүн толтургуч менен сап өзгөрмөсүн инициализациялаңыз.
- Сапты басып чыгарыңыз жана аны өзүнө интерполяциялаңыз.
Айла сапты туура алууда. Муну кантип жасоо тилден тилге өзгөрүп турат жана өзгөрмө кандайча жарыяланганына, чекиттүү үтүрлөрдүн жана жаңы саптардын зарылдыгына, талап кылынган тырмакчаларга ж.б. көз каранды. Тырмакчаларды колдонуу кызыктуу; Тырмакчаны иш жүзүндө тырмакчаны колдонбостон басып чыгаруу керектигин көрсөтүүнүн жолун табыш керек.
Баш
Баштагы көпчүлүк нерселер сыяктуу эле, бул программа кызыктуу кызыкчылыкты колдонот. Жалгыз тырмакчалар күчтүү тырмакчалар жана эч нерсени кеңейтпесе да, чечмеленет printf
белгиленген код чекити менен символдор катары сегиздик качуу символдору:
s='s=%s;printf "$s" "$s"';printf "$s" "$s"
Питон
Pythonдо формат спецификациясы кайтып келет %r
автоматтык түрдө жалгыз тырмакчалар. Код жаңы сап белгиси менен аяктаса, эң оңой:
s='s=%r;print(s%%s)';print(s%s)
Эгерде сиз кодду сызыксыз жазгыңыз келсе, анда төмөнкүнү жазышыңыз керек:
s='s=%r;print(s%%s,sep="")';print(s%s,sep="")
JavaScript
Төмөнкү JavaScript quines node.js астында иштейт. колдоносуз console.log
, ал ар дайым жаңы сапты кошот, ошондуктан ар бир сценарийдин аягында жаңы сап керек:
s="s=%j;console.log(s,s)";console.log(s,s)
Төмөнкү программа дагы кызыктуу: ал өзүнүн бүтүндөй көрүнүшүн басып чыгарбайт, бирок функциялардын белгилүү бир өкүлчүлүгү бар экенине таянат.:
(function a(){console.log('('+a+')()')})()
Кийинки мисал алдамчылыкка жакын, анткени ал eval
колдонулган:
code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)
Rust
Rust форматталган басып чыгаруу макросунда аргументти тырмакчага кошуунун жолун камсыз кылат. Бирок, бул макрос саптын литералы болушу үчүн басып чыгаруу макросунун биринчи аргументин талап кылат! Ошондуктан позициялык аргумент идентификаторун колдонуу эң жакшы:
fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}
PHP
Бул PHP программасы баштапкы кодду сапта сактап, анан ошол сапты колдонуу менен иштейт printf
чыгуулар. The 39
ASCII белгисин билдирет '
, саптагы тырмакчаларды туура иштетүү:
<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);
HQ9+
Акыркы, бирок эң аз эмес, Cliff Biffle тарабынан иштелип чыккан HQ9+:
Q