ឃ្វីន

កម្មវិធី QuineQuine គឺជាកម្មវិធីដែលចេញកូដប្រភពរបស់វានៅពេលប្រតិបត្តិ។ ជាឧទាហរណ៍ Quine មិនអាច "ចេញក្រៅខ្លួនវា" ដោយឧទាហរណ៍ ការបោះពុម្ពមាតិកានៃឯកសារដែលមានវា ឬប្រើសមត្ថភាពគិតពិចារណាដើម្បីបោះពុម្ពចេញនូវតំណាងរបស់វា។ ផ្ទុយទៅវិញ វាត្រូវ គណនាកូដប្រភពរបស់វា។


វិធីបុរាណដើម្បីបង្កើតកម្មវិធីបែបនេះកើតឡើងជាពីរជំហាន:

  1. ចាប់ផ្តើមអថេរខ្សែអក្សរជាមួយនឹងកន្លែងដាក់សម្រាប់ interpolation ។
  2. បោះពុម្ពខ្សែអក្សរ ហើយបញ្ចូលវា ទៅក្នុងខ្លួនវា

ល្បិចគឺដើម្បីទទួលបានខ្សែត្រឹមត្រូវ។ របៀបធ្វើវាប្រែប្រួលពីភាសាមួយទៅភាសាមួយ និងអាស្រ័យលើរបៀបដែលអថេរត្រូវបានប្រកាស តម្រូវការសម្រាប់សញ្ញាក្បៀស និងបន្ទាត់ថ្មី សញ្ញាសម្រង់ដែលត្រូវការ។ល។ ការប្រើប្រាស់សញ្ញាសម្រង់គឺគួរឱ្យចាប់អារម្មណ៍; មនុស្សម្នាក់ត្រូវរកវិធីដើម្បីបង្ហាញថាសញ្ញាសម្រង់គួរតែត្រូវបានបោះពុម្ពដោយមិនប្រើសញ្ញាសម្រង់ពិតប្រាកដ។

បាស

ដូចរឿងភាគច្រើននៅក្នុង 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
ថយក្រោយ