Hile Çevrimsel Quine


19

kavram

Programlama dilinde kod çıkaran bir program yazın. Bu kod yürütüldüğünde orijinal programın çıktısını almalıdır.

kurallar

  • Bu bir kopya hilesi olduğundan, orijinal kaynak kodunu okuyabilirsiniz.
  • İlk çıktı programı orijinal programla aynı dilde olmalıdır.
  • Normal bir quine çıktısı alamazsınız. İki program farklı olmalıdır.
  • Standart boşluklar geçerlidir.
  • Bu çok kısa cevap kazanır, ancak seçilmez.

Neyin yarı-kini oluşturduğundan hala tam emin değilim.
Conor O'Brien

@ ConorO'Brien Orijinal programın çıktısını veren bir program
çıkarır

1
Anlıyorum. İfadeler oldukça belirsiz.
Conor O'Brien

2
En kısa cevap neden seçilmiyor? Bu bir katalog mu?
ATaco

1
Sadece kayıt için, buna karşılıklı bir quine derim (bu meydan okuma farklı diller gerektirir ).
Martin Ender

Yanıtlar:


28

Bash + coreutils, 11 bayt

tr xy yx<$0

Bu yazdırır

tr yx xy<$0

Çevrimiçi deneyin!

Buna karşılık, bu baskı

tr xy yx<$0

1
Hile değil ve ortak bir dilde.
denson

8
trKomutun $0kendi kaynak kodu olan yönlendirildiğini düşünüyorum . Yani "ucuz".
Roman Gräf

21

Salyangoz, 0 bayt



İkinci program

1

İlk program, boş girişteki boş desenin eşleşme sayısını sayar (gerçekten alan 0'dır, ancak desen, programların boş girişe ne yazdırmak istediklerine karar vermesine izin vermek için her zaman en az bir kez kesmek olarak çalıştırılır). İkinci program {1}, ayrıştırma hatasına neden olan bir niceleyiciyle ( normal ifadede olduğu gibi ) başlar . Program başarıyla ayrıştırılmadığından, STDOUT boş dizedir.


Muhtemelen bunu yapan bir dil olduğunu düşündüm (yani null program boş bir sonuçla başarılı olur, ancak bu sonuç bir program olarak hiçbir şey yapmaz). HOMESPRING'i denedim ama tercümanı çalıştıramadım. Yine de çalıştığı yerde başka bir dil bulduğunuz anlaşılıyor. (Bir tercümana bağlantınız var mı?)


20

7 , 2 bayt

Şekil 7, 3-bit karakter kümesi kullanır, ancak baytlara paketlenmiş girdi alır (ve metaya göre, alt-bayt karakter kümelerine sahip diller diskteki dosya için bayt kullanılarak sayılır ). İşte xxdprogramın bir dökümü:

00000000: 4cf4                                     L.

Bu dosyayı 7 yorumlayıcıya verirken, aşağıdaki programın çıktısını alır:

00000000: 4fa6 7f                                  O..

daha sonra orijinal programı tekrar çıktılar.

Peki burada neler oluyor? Herhangi bir kaynak okuması yoktur (aslında, 7'de kaynağı okumanın mümkün olduğunu düşünmüyorum), ancak tartışmalı bir şekilde program başka bir şekilde hile yapıyor olsa da; ne düşündüğü söyle. Program şu şekilde çalışır. (Her 7 komutun, bazıları orijinal programda adı olmayan ve görünmeyen iki varyantı olduğunu unutmayın. Altı çiftte toplam on iki komut vardır. Aktif komutlar için kalın, pasif için kalın değilim komutları ve aktif komut adı yok durumlarda, bunu karşılık gelen pasif komutu ile aynı ada veriyorum ve ayırt etmek cesur güvenerek. örn hem adlandırılır durumda, 7aktif varyantı olduğu 1, her komut kendi adını alır ve kalın, sözdizimi vurgulamasıdır.)

231 7 23 Orijinal program, sekizli ambalajsız
231 itme 237 yığına
    23 23'ü yığının üzerine itin
             (örtük) yığının üst kısmının bir kopyasını programa ekle
      2       Yığının üstünü çoğalt (şu anda 23 )
        3      Yığının üstünden çıktı, pop ikinci yığın öğesi

Bu noktada, 7 yorumlayıcı yığının üst kısmının temsil edilemeyen komutlar ( 2ve 3) içerdiğini görür , bu nedenle yığının tepesinden kaçarak üretir 723(ki). İlk komut çıktısı çıktı biçimini seçer; bu durumda, format 7, "çıktıyı programla aynı şekilde formatlayın". Böylece komutlar çıktıları baytlara paketlenir. Ardından program devam ediyor:

231 7 23 23
             (örtük) yığının üst kısmının bir kopyasını programa ekle
        2     Yığının üstünü çoğalt (şu anda 237 )
          3    Yığının üstünden çıktı, ikinci yığın öğesi pop
           7   Yığının üzerine boş bir öğe itin

Bu noktada, yığın üzerinde boş yığın elemanlarından başka bir şey yoktur, bu nedenle program çıkar. Daha 23önce çıkardık. Kaçarsak 237(ve tekrarlanamayan komutlar içerdiği için mecbur kalırız), oluruz 7231. Bu doğrudan çıktıyı alır, programın son çıktısını alır (programla 237231aynı şekilde biçimlendirilir, yani bayt olarak paketlenir). İşte 4fa67f. ( 1Çıktıyı etkilemek açısından tamamen anlamsız olduğu belirtilebilir ; bunun tek nedeni iki programı farklı kılmaktır.)

Koşmak 237231neredeyse aynı şekilde devam eder; fark, işe yaramazlığın 1ilk baskıdan hemen sonra çalışmasıdır (ve boş eleman, programın geçerli sonuna ikinci kez ulaşıldığında örtük olarak silinir). Yine, 231sonuç çıktısı kendisini, 23sonuç çıktısı kendisini önce a 7ve biz 231723orijinal program alır.

Gözlemci, iki programın, dilin "doğal" sekizli ile aynı uzunlukta olmasına rağmen, diskte farklı uzunluklarda olduğunu belirtebilir. Bunun nedeni, 7 programın rasgele sayıda 1 bit ile doldurulabilmesi ve paketlenmiş biçimin sondaki dolguyu atmasıdır. Kodlamanın nasıl gerçekleştiği aşağıda açıklanmıştır:

2  3  1  7  2  3
010011001111010011(1...)
4   c   f   4   padding

Başka bir deyişle, iki bayt, 4C F4programı temsil etmek için yeterlidir, bu yüzden kullandım.


11

Piton 3, 297 279 251 243 225 218 208 180 126 111 bayt

Sigara hile:

A=''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))

Bu yazdırır:

B=''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))

yürütüldüğünde orijinal programı yazdırır.


Vaov! Güzel! Ben bunu hiç düşünemezdim.
dkudriavtsev

8

Toplu işlem, 14 bayt

@echo @type %0

Hangi olarak çalıştırdığınızda cyclicquine.batçıkışlar

@type cyclicquine.bat

Çalıştırıldığında orijinal toplu iş dosyasını çıktılar.


8

RProgN , 4 Bayt.

Topluluk bu tür şeyleri hile yapan bir soru olarak görüyor ve bu da kriterleri karşılıyor .

1
2

Sonunda bir satırsonu var.

Bu yazdırır

2
1

İlk kodu yazdıran bir satırsonu satırıyla.

RProgN, yığın patlamasını yukarıdan aşağıya doğru yazdırır.

Çevrimiçi deneyin!


Bir süre önce 1\n1\nRProgN'de hile yapmayan bir soru olacağını ima eden bir sohbet tartışması yapıldı , çünkü 1'lerin her biri birbirini yazdırıyor (ve sadece her 1'in kendisi yazdırılırsa hile olarak kabul edilir). Bütün bunlar, imalarda aldatmanın bazen tanımlanması zor olabileceği anlamına geliyor. (Ancak, bu cevap her iki şekilde de doğrudur, çünkü soru aslında

Ayrıca, söylemeye isteksiz olmama rağmen, RProgN'de 1\nteknik olarak geçerli bir quine , 1sabit değil 1, yığına iten bir fonksiyon çağrısı .
ATaco

Kullanımda uygun bir kininin birden fazla tanımı vardır. Bu en az bir kişi tarafından geçersiz, ancak muhtemelen bazıları için geçerli.

@ ais523 Merakımı tetiklediniz, RProgN'yi belirttiniz, ancak küçük dilimin bu kadar çok (veya herhangi bir) dikkat çektiğini düşünmedim. Özellikle RProgN hakkında sohbet mi, yoksa benzer bir sözdizimine sahip bir dil mi?
ATaco

Yaklaşık 7 idi , bu da programın bölümlerini "geriye" basma eğilimindedir. Ben orada verilen görüşlerden tahmin ediyorum.

6

Jolf, 6 bayt

1q_a_q

Çalıştırıldığında, bu çıktı:

q_a_q1

Hangi sırayla çıktılar 1q_a_q.

Burada deneyin!

açıklama

1q_a_q
1       the digit one (ignored)
 q      the source code (ignored)
     q  the source code
    _   reversed
   a    and outputted
 _      and reversed (ignored)

q_a_q1
q       the source code (ignored)
     1  the digit one (ignored)
    q   the source code
   _    reversed
  a     and outputted
 _      and reversed (ignored)

5

JavaScript (ES6), 69 60 59 bayt

(_0=_=>console.log(`(_0=${_0})()`.replace(/0/g,n=>+!+n)))()

Çıktılar:

(_1=_=>console.log(`(_1=${_1})()`.replace(/1/g,n=>+!+n)))()

-1 bayt (@ETHProductions): Normal ifadede \ d yerine 0 kullanın


n=>1-nBunun yerine deneyin n=>+!+n.
Conor O'Brien

@Conner O'Brien Maalesef 1irade sonunda normal ifadeyle değiştirilecek.
darrylyeo

@ETHproductions Heh, bunu düşünmeliydim.
darrylyeo



1

> <>, 16 bayt

"$r00gol?!;50.01

Burada deneyin!

çıktılar

"$r00gol?!;50.10

Bu, burada sağlananın bir modifikasyonudur . Hile olup olmadığından emin değilim, kod kutusunu okuyor ve çıktısını veriyor.


1
00g değerini: 2- olarak değiştirebilirsiniz; kod kutusunu okumadan aynı bayt sayısını korur.
mavisi pelican

@Tealpelican, teşekkürler! Amaç, bunun "aldatma" olarak değerlendirilmesidir: s. (Ve bu kuralı tam olarak anlamıyorum)
redstarcoder
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.