Sahte quine çok dilli dil algılama sayaçları


11

Quines eğlenceli. Polyglotlar da eğlencelidir. Polyglot Quines var, ancak çıtayı daha da yükseltebiliriz.

Α, β ve γ dilleri için geçerli bir program içeren bir dosya yazın. Dosya bir dil α veya β programı olarak yürütüldüğünde (muhtemelen derlendikten sonra), programın çıktısı bu yarışmaya geçerli bir başvuru ile aynı formda olacaktır. Dosyanız bir dil programı olarak yürütülürse, bir sayı çıkarır. Bu sayının değeri, ikili sayı olarak yorumlanan programın önceki yürütme zinciridir.

Bu açıklamanın anlaşılması biraz zor olabilir, işte bir örnek. Α, Β ve Γ girişlerini α, β veya γ resp olarak yürüten işlevler olsun. programlayın ve bu programların çıktılarını döndürün. X bu yarışmaya geçerli bir sunum olsun . Daha sonra, x'i bu sırayla β, α, β, α, α, β ve language dili üzerinden işlediğimiz aşağıdaki ifade, 41 10 = 101001 2'den bu yana 41 verecektir .

Γ (Β (Α (Α (Β (Α (Β ( x )))))))

Zincirdeki sondan bir önceki yürütmenin, β dilinde bir yürütme olduğunu varsayamazsınız. Orijinal sunumunuzun doğrudan bir dil programı olarak yürütülmesi durumunda, 0 yazacaktır.

Programınız zincirde on altı derleme için doğru davranmalıdır; yani, programınızın sonunda yazdırabileceği en yüksek sayı 2 15 - 1'dir. Elbette, programınızın daha uzun derleme zincirlerini desteklemesine izin verilir.

Bu, yaratıcı çözümleri teşvik eden bir popülerlik yarışmasıdır. En yüksek oy oranına sahip olan başvuru kazanır.


Üç dil eşit olabilir mi (yukarı oyları büyük ölçüde azaltsa da)?
Zgarb

6
@Zgarb Bazı dillerin (veya hepsinin) eşit olduğu bir çözüm görmek isterim. Eşit dilleri nasıl ayırt edebileceğinizi görelim.
FUZxxl

1
...Anlıyorum. : DI meydan okumayı aceleyle okudu.
Zgarb

@Zgarb aynı dilin farklı sürümlerine ne dersiniz? magic += Number(System.env.lang_version[-1])
John Dvorak

1
Sıkıcı yerine Yunan harfleri kullanmak için +1 a,b,cveya 1,2,3=)
flawr

Yanıtlar:


13

Python 2, Python 3,> <> (Balık)

#;n0
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

Python açıklaması

Python 2 ve Python 3 yorumlayıcıları , Python 2 float bölümü kullandıkça ve Python 3 tamsayı bölümü kullandığından v=int(1/2*2)değişken farklı değerler ( 0ve 1) alması dışında benzer şekilde çalışır .

Her çalışmada ifadeyi +0*2veya +1*2 ilk satıra (after #;n) ve xdizeye (son write komutundan sonra ) eklerler . > <> Yorumlayıcısı ilk eklemeyi, Pythons ise ikincisini doğru sorgular oluşturmak için kullanır.

Kodlama tarihi B(A(B(B(x)))):

#;n+1*2+0*2+1*2+1*20
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])+1*2+0*2+1*2+1*2n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

> <> (Balık) açıklaması

> <> Yorumlayıcısını çalıştırdığınızda, kod işaretçisi #ilk satırın etrafındaki sargılardan geri döner ve ilk satırın sonundan başlayarak West yönüne sayıları yığının üstüne itmeye başlar. Bir operatör gelirse ( +veya *) üstteki iki elemanı yığından alır ve sonucu geri iter. Bu yöntemle, önceki çalışmaların base2 temsili ile sonuçlanırız ( 13önceki örnekte). Bu istenen sayıdır, bu yüzden onu ile nçıkarırız ve sonlandırırız ;.


Bu çok hoş.
FUZxxl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.