Quine

Quine programı veya Quine, yürütüldüğünde kendi kaynak kodunu çıkaran bir programdır. Bir Quine, örneğin kendisini içeren dosyanın içeriğini yazdırarak veya kendi temsilini yazdırmak için iç gözlem yeteneklerini kullanarak "kendi dışına çıkamaz". Bunun yerine kendi kaynak kodunu hesaplaması gerekir.


Böyle bir program oluşturmanın klasik yolu iki adımda gerçekleşir:

  1. Enterpolasyon için yer tutuculu bir dize değişkenini başlatın.
  2. Dizeyi yazdırın ve kendi içine enterpolasyon yapın.

İşin püf noktası dizeyi doğru şekilde yakalamaktır. Bunun nasıl yapılacağı dilden dile değişir ve değişkenin nasıl bildirildiğine, noktalı virgül ve yeni satır ihtiyacına, gerekli tırnak işaretlerine vb. bağlıdır. Tırnak işaretlerinin kullanımı ilginçtir; Aslında tırnak işareti kullanılmadan tırnak işaretinin basılması gerektiğini belirtmenin bir yolu bulunmalıdır.

Bash

Bash'teki çoğu şey gibi bu program da ilginç bir tuhaflık kullanıyor. Her ne kadar tek tırnak işaretleri güçlü tırnak işaretleri olsa da ve hiçbir şeyi genişletmese de yorumlanır printf belirtilen kod noktasına sahip karakterler olarak sekizlik kaçış karakterleri:

s='s=%s;printf "$s" "$s"';printf "$s" "$s"

Piton

Python'da format belirtici şunu döndürür: %r otomatik olarak tek tırnaklar. Kodun yeni satır karakteriyle bitmesi en kolay yoldur:

s='s=%r;print(s%%s)';print(s%s)

Kodun satır sonu olmadan olmasını istiyorsanız aşağıdakileri yazmanız gerekir.:

s='s=%r;print(s%%s,sep="")';print(s%s,sep="")

JavaScript

Aşağıdaki JavaScript kodları node.js altında çalışır. sen kullan console.log, bu her zaman yeni bir satır ekler, dolayısıyla her betiğin sonunda yeni bir satır gerekir:

s="s=%j;console.log(s,s)";console.log(s,s)

Aşağıdaki program da ilginçtir: temsilinin tamamını yazdırmıyor, ancak fonksiyonların belirli bir temsile sahip olduğu gerçeğine dayanıyor:

(function a(){console.log('('+a+')()')})()

Bir sonraki örnek hile yapmaya yakın çünkü eval kullanılmış:

code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)

Pas

Rust, biçimlendirilmiş yazdırma makrosunda bir argümanı tırnak içine almanın bir yolunu sağlar. Ancak bu makro, yazdırma makrosunun ilk argümanının bir dize değişmezi olmasını gerektirir! Bu nedenle konumsal argüman tanımlayıcısını kullanmak en iyisidir:

fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}

PHP

Bu PHP programı, kaynak kodunu bir dizede saklayıp daha sonra bu dizeyi kullanarak çalışır. printf çıktılar. 39 ASCII karakteri anlamına gelir ', dizedeki tırnak işaretlerini doğru şekilde işlemek için:

<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);

HQ9+

Son fakat bir o kadar da önemlisi, Cliff Biffle tarafından geliştirilen HQ9+:

Q
Geri