កម្មវិធី Quine ឬ Quine គឺជាកម្មវិធីដែលចេញកូដប្រភពរបស់វានៅពេលប្រតិបត្តិ។ ជាឧទាហរណ៍ Quine មិនអាច "ចេញក្រៅខ្លួនវា" ដោយឧទាហរណ៍ ការបោះពុម្ពមាតិកានៃឯកសារដែលមានវា ឬប្រើសមត្ថភាពគិតពិចារណាដើម្បីបោះពុម្ពចេញនូវតំណាងរបស់វា។ ផ្ទុយទៅវិញ វាត្រូវ គណនាកូដប្រភពរបស់វា។
វិធីបុរាណដើម្បីបង្កើតកម្មវិធីបែបនេះកើតឡើងជាពីរជំហាន:
- ចាប់ផ្តើមអថេរខ្សែអក្សរជាមួយនឹងកន្លែងដាក់សម្រាប់ interpolation ។
- បោះពុម្ពខ្សែអក្សរ ហើយបញ្ចូលវា ទៅក្នុងខ្លួនវា ។
ល្បិចគឺដើម្បីទទួលបានខ្សែត្រឹមត្រូវ។ របៀបធ្វើវាប្រែប្រួលពីភាសាមួយទៅភាសាមួយ និងអាស្រ័យលើរបៀបដែលអថេរត្រូវបានប្រកាស តម្រូវការសម្រាប់សញ្ញាក្បៀស និងបន្ទាត់ថ្មី សញ្ញាសម្រង់ដែលត្រូវការ។ល។ ការប្រើប្រាស់សញ្ញាសម្រង់គឺគួរឱ្យចាប់អារម្មណ៍; មនុស្សម្នាក់ត្រូវរកវិធីដើម្បីបង្ហាញថាសញ្ញាសម្រង់គួរតែត្រូវបានបោះពុម្ពដោយមិនប្រើសញ្ញាសម្រង់ពិតប្រាកដ។
បាស
ដូចរឿងភាគច្រើននៅក្នុង Bash កម្មវិធីនេះប្រើ quirk គួរឱ្យចាប់អារម្មណ៍។ ទោះបីជាសម្រង់តែមួយគឺជាសម្រង់ខ្លាំងនិងមិនពង្រីកអ្វីទាំងអស់, បកស្រាយ 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 ផ្តល់នូវវិធីមួយដើម្បីភ្ជាប់អាគុយម៉ង់នៅក្នុងសម្រង់នៅក្នុងម៉ាក្រូបោះពុម្ពដែលបានធ្វើទ្រង់ទ្រាយរបស់វា។ ទោះយ៉ាងណាក៏ដោយ ម៉ាក្រូនេះទាមទារអាគុយម៉ង់ដំបូងនៃម៉ាក្រូបោះពុម្ពទៅជាអក្សរអក្សរ! ដូច្នេះវាជាការល្អបំផុតក្នុងការប្រើឧបករណ៍កំណត់អត្តសញ្ញាណអាគុយម៉ង់ទីតាំង:
fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}
PHP
កម្មវិធី PHP នេះដំណើរការដោយរក្សាទុកកូដប្រភពនៅក្នុងខ្សែអក្សរមួយហើយបន្ទាប់មកប្រើខ្សែអក្សរនោះ។ printf
លទ្ធផល។ នេះ។ 39
តំណាងឱ្យតួអក្សរ ASCII '
, ដើម្បីគ្រប់គ្រងសម្រង់ក្នុងខ្សែអក្សរបានត្រឹមត្រូវ។:
<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);
HQ9+
ចុងក្រោយប៉ុន្តែមិនបានយ៉ាងហោចណាស់គឺ HQ9+ ដែលត្រូវបានបង្កើតឡើងដោយ Cliff Biffle:
Q